症状・体調記録仕様 (FR-008)
| 項目 | 内容 |
|---|---|
| 対象FR | FR-008(症状・体調記録) |
| 優先度 | 中 |
| ステータス | 詳細化済み |
概要
ユーザーはペットの日々の体調や気になる症状を記録できる。体調メモと症状報告を単一の「体調記録」テーブルで統一管理し、症状カテゴリやタグで区別する。マスタテーブルから定義済みの症状カテゴリを選択するか、自由入力で記録できる。各記録には3段階の重症度を設定する。
入力フィールド
| フィールド | 型 | 必須 | バリデーション |
|---|---|---|---|
| symptomCategoryId | integer | - | 存在する symptom_categories.id であること |
| symptomOther | varchar | - | symptomCategoryId 未指定時のみ有効、1〜50文字 |
| severity | varchar | ○ | mild / moderate / severe |
| memo | text | - | 最大1000文字 |
| observedAt | timestamptz | ○ | 未来日時不可 |
- 症状カテゴリは
symptom_categoriesマスタテーブルから選択するか、「その他」としてsymptomOtherに自由入力する symptomCategoryIdとsymptomOtherの両方が指定された場合はsymptomCategoryIdを優先し、symptomOtherは無視する(pet.mdのbreedId/breedOtherと同一パターン)symptomCategoryIdとsymptomOtherのいずれも未指定の場合は、カテゴリなしの体調メモとして扱うobservedAtは症状を観察した日時。ユーザーがアプリ上で日付のみ選択した場合はクライアント側で当日 00:00:00 UTC を設定する- 同一ペットに対して同日に複数の記録を登録できる
重症度(severity)の定義
| 値 | ラベル | 目安 |
|---|---|---|
mild | 軽度 | いつもと少し違う程度。食欲・活動量に大きな変化なし |
moderate | 中度 | 明らかな異変あり。食欲低下や元気がないなど日常に影響 |
severe | 重度 | 強い症状。ぐったりしている、繰り返す嘔吐など。受診を推奨 |
症状カテゴリ マスタデータ(初期値)
| name |
|---|
| 嘔吐 |
| 下痢 |
| 便秘 |
| 食欲不振 |
| くしゃみ |
| 咳 |
| 鼻水 |
| 目やに |
| 皮膚の異常 |
| 脱毛 |
| 元気がない |
| 体重減少 |
| 過剰な毛づくろい |
| 排尿の異常 |
- 管理画面(FR-013)からカテゴリの追加・編集が可能
- カテゴリ削除時は既存記録との整合性を考慮し、論理削除とする(将来検討)
APIエンドポイント
全エンドポイントで認証必須(__Host-session Cookie)。
| メソッド | パス | 概要 |
|---|---|---|
| POST | /api/pets/:petId/health-logs | 体調記録の登録 |
| GET | /api/pets/:petId/health-logs | 体調記録の一覧取得 |
| GET | /api/pets/:petId/health-logs/:logId | 体調記録の詳細取得 |
| PATCH | /api/pets/:petId/health-logs/:logId | 体調記録の更新 |
| DELETE | /api/pets/:petId/health-logs/:logId | 体調記録の削除(物理削除) |
| GET | /api/symptom-categories | 症状カテゴリ一覧取得 |
POST /api/pets/:petId/health-logs — 体調記録の登録
リクエストボディに入力フィールドを指定して体調記録を登録する。
- 成功時:
201 Created、作成された記録を返す - ペットが存在しない / 他ユーザーのペット / 論理削除済み:
404 Not Found symptomCategoryIdが存在しない場合:422 Unprocessable Entity
{ "data": { "id": 1, "petId": 1, "symptomCategoryId": 1, "symptomOther": null, "severity": "mild", "memo": "朝食後に1回だけ吐いた。その後は元気", "observedAt": "2026-02-18T08:30:00Z", "createdAt": "2026-02-18T09:00:00Z", "updatedAt": "2026-02-18T09:00:00Z" }}GET /api/pets/:petId/health-logs — 体調記録の一覧取得
指定ペットの体調記録を observedAt 降順で返す。
- 成功時:
200 OK - 記録が存在しない場合: 空配列を返す(エラーではない)
- ペットが存在しない / 他ユーザーのペット / 論理削除済み:
404 Not Found
クエリパラメータ:
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| from | date | - | 取得開始日(observedAt >= from) |
| to | date | - | 取得終了日(observedAt < to + 1日) |
| severity | varchar | - | 重症度でフィルタ(mild / moderate / severe) |
| symptomCategoryId | integer | - | カテゴリでフィルタ |
{ "data": [ { "id": 2, "petId": 1, "symptomCategoryId": null, "symptomOther": null, "severity": "mild", "memo": "今日は一日よく寝ていた", "observedAt": "2026-02-18T18:00:00Z", "createdAt": "2026-02-18T18:30:00Z", "updatedAt": "2026-02-18T18:30:00Z" }, { "id": 1, "..." : "..." } ]}GET /api/pets/:petId/health-logs/:logId — 体調記録の詳細取得
指定IDの体調記録を返す。
- 成功時:
200 OK - 存在しない / 他ユーザーのペット:
404 Not Found
PATCH /api/pets/:petId/health-logs/:logId — 体調記録の更新
指定したフィールドのみ部分更新する。リクエストボディに含まれないフィールドは変更しない。
- 成功時:
200 OK、更新後の記録を返す - 存在しない / 他ユーザーのペット:
404 Not Found symptomCategoryIdが存在しない場合:422 Unprocessable Entity
DELETE /api/pets/:petId/health-logs/:logId — 体調記録の削除
物理削除する。
- 成功時:
204 No Content - 存在しない / 他ユーザーのペット:
404 Not Found
GET /api/symptom-categories — 症状カテゴリ一覧取得
症状カテゴリのマスタデータを name 昇順で返す。認証必須。
- 成功時:
200 OK
{ "data": [ { "id": 1, "name": "嘔吐" }, { "id": 2, "name": "下痢" } ]}認可ルール
- 全エンドポイントで認証必須
- 自分が登録したペットに対する体調記録のみ操作可能
- 他ユーザーのペットIDまたは記録IDを指定した場合は
404を返し、存在の有無を漏らさない - 論理削除済みペットへの体調記録操作は
404を返す
エッジケース
symptomCategoryIdとsymptomOtherの両方が指定された場合 →symptomCategoryIdを優先し、symptomOtherはnullとして保存するsymptomCategoryIdとsymptomOtherのいずれも未指定 → カテゴリなしの体調メモとして登録可能(バリデーションエラーにはしない)observedAtが未来日時の場合 →422 Unprocessable Entity- 削除済みペットへの記録登録 →
404 Not Found - 存在しない
symptomCategoryIdを指定 →422 Unprocessable Entity
削除方式の選定理由
体調記録は物理削除とする。ペット(FR-003)は健康記録の親エンティティのため論理削除で関連データを保護するが、体調記録自体は末端データであり、ユーザーが削除を意図した場合は完全に削除するのが適切である。
拡張予定(現時点ではスコープ外)
- 通院記録(FR-006)・投薬記録(FR-009)との関連付け
- 写真添付機能(症状の写真を記録に紐付け)
- 症状の解消日時(
resolvedAt)の追跡 - 家族共有時の共有ペットへのアクセス(FR-011で対応)
- 症状パターン分析・アラート機能
検証方法
- 体調記録の登録 → 一覧取得 → 詳細取得の一連フローが完了すること
- マスタカテゴリを指定した記録と、自由入力(
symptomOther)の記録が正しく登録されること - カテゴリなし(体調メモのみ)の記録が登録できること
- 必須フィールド(
severity,observedAt)未指定時にバリデーションエラーが返ること - 存在しない
symptomCategoryId指定時に422が返ること - 未来日時の
observedAt指定時に422が返ること - 他ユーザーのペットIDで操作した場合に
404が返ること - PATCH で指定したフィールドのみが更新され、他フィールドが変更されないこと
- DELETE で記録が完全に削除されること
- 一覧取得で
from/to/severity/symptomCategoryIdのフィルタが正しく動作すること - 症状カテゴリ一覧が取得できること