コンテンツにスキップ

症状・体調記録仕様 (FR-008)

項目内容
対象FRFR-008(症状・体調記録)
優先度
ステータス詳細化済み

概要

ユーザーはペットの日々の体調や気になる症状を記録できる。体調メモと症状報告を単一の「体調記録」テーブルで統一管理し、症状カテゴリやタグで区別する。マスタテーブルから定義済みの症状カテゴリを選択するか、自由入力で記録できる。各記録には3段階の重症度を設定する。

入力フィールド

フィールド必須バリデーション
symptomCategoryIdinteger-存在する symptom_categories.id であること
symptomOthervarchar-symptomCategoryId 未指定時のみ有効、1〜50文字
severityvarcharmild / moderate / severe
memotext-最大1000文字
observedAttimestamptz未来日時不可
  • 症状カテゴリは symptom_categories マスタテーブルから選択するか、「その他」として symptomOther に自由入力する
  • symptomCategoryIdsymptomOther の両方が指定された場合は symptomCategoryId を優先し、symptomOther は無視する(pet.mdbreedId / breedOther と同一パターン)
  • symptomCategoryIdsymptomOther のいずれも未指定の場合は、カテゴリなしの体調メモとして扱う
  • 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

クエリパラメータ:

パラメータ必須説明
fromdate-取得開始日(observedAt >= from
todate-取得終了日(observedAt < to + 1日
severityvarchar-重症度でフィルタ(mild / moderate / severe
symptomCategoryIdinteger-カテゴリでフィルタ
{
"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 を返す

エッジケース

  • symptomCategoryIdsymptomOther の両方が指定された場合 → symptomCategoryId を優先し、symptomOthernull として保存する
  • symptomCategoryIdsymptomOther のいずれも未指定 → カテゴリなしの体調メモとして登録可能(バリデーションエラーにはしない)
  • 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 のフィルタが正しく動作すること
  • 症状カテゴリ一覧が取得できること