Flutterで健康管理アプリ (Health Management App)を開発_No.3
傍観者k
投稿日: 2026年02月25日 03:04
# 健康管理アプリ - API 仕様書
## API ベース URL
```
https://api.your-server.com/api
```
## 認証方式
- **Token-based Authentication(Bearer Token)**
- すべてのリクエストヘッダーに `Authorization: Bearer {token}` が必須
---
## 1. 認証関連 API
### 1.1 ユーザー登録
**Endpoint:** `POST /auth/register`
**リクエスト:**
```json
{
"email": "user@example.com",
"password": "password123",
"name": "ユーザー名"
}
```
**レスポンス:**
```json
{
"success": true,
"message": "登録成功",
"data": {
"id": "user_001",
"email": "user@example.com",
"token": "jwt_token_here"
}
}
```
**DB操作:**
- **書込:** `user_auth` (新規ユーザー認証記録)
- **書込:** `users` (新規ユーザー基本情報)
- **書込:** `app_settings` (デフォルト設定)
---
### 1.2 ユーザーログイン
**Endpoint:** `POST /auth/login`
**リクエスト:**
```json
{
"email": "user@example.com",
"password": "password123"
}
```
**レスポンス:**
```json
{
"success": true,
"data": {
"token": "jwt_token_here",
"user": {
"id": "user_001",
"name": "ユーザー名",
"email": "user@example.com"
}
}
}
```
**DB操作:**
- **読込:** `user_auth` (メール・パスワード検証)
- **更新:** `user_auth` (last_login 更新)
---
### 1.3 トークン更新
**Endpoint:** `POST /auth/refresh-token`
**リクエスト:**
```json
{
"refresh_token": "refresh_token_here"
}
```
**レスポンス:**
```json
{
"success": true,
"data": {
"token": "new_jwt_token"
}
}
```
**DB操作:**
- **読込:** `user_auth` (トークン検証)
---
## 2. ユーザー管理 API
### 2.1 ユーザー情報取得
**Endpoint:** `GET /users/{user_id}`
**レスポンス:**
```json
{
"success": true,
"data": {
"id": "user_001",
"name": "サンプル太郎",
"age": "35",
"gender": "M",
"phone": "090-1234-5678",
"email": "user@example.com",
"height": "170",
"weight": "70",
"blood_type": "A"
}
}
```
**DB操作:**
- **読込:** `users` (ユーザー基本情報)
---
### 2.2 ユーザー情報更新
**Endpoint:** `PUT /users/{user_id}`
**リクエスト:**
```json
{
"name": "新しい名前",
"age": "36",
"height": "171",
"weight": "71"
}
```
**DB操作:**
- **更新:** `users` (ユーザー基本情報)
---
### 2.3 ユーザー削除
**Endpoint:** `DELETE /users/{user_id}`
**DB操作:**
- **削除:** `users` (カスケード削除で全関連データ削除)
- **削除:** `medications`, `blood_pressures`, `moods` 等
---
## 3. 服薬管理 API
### 3.1 服薬記録作成
**Endpoint:** `POST /medications`
**リクエスト:**
```json
{
"user_id": "user_001",
"medication_name": "血圧降下薬",
"dosage": "10",
"unit": "mg",
"taken_time": "2026-02-18T08:00:00Z",
"remarks": "朝食後"
}
```
**DB操作:**
- **書込:** `medications` (新規服薬記録)
---
### 3.2 服薬記録一覧取得
**Endpoint:** `GET /medications?user_id={user_id}&start_date={date}&end_date={date}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "med_rec_001",
"medication_name": "血圧降下薬",
"dosage": "10",
"unit": "mg",
"taken_time": "2026-02-18T08:00:00Z"
}
],
"total": 15
}
```
**DB操作:**
- **読込:** `medications` (期間別フィルタリング)
---
### 3.3 服薬記録更新
**Endpoint:** `PUT /medications/{med_id}`
**DB操作:**
- **更新:** `medications`
---
### 3.4 服薬記録削除
**Endpoint:** `DELETE /medications/{med_id}`
**DB操作:**
- **削除:** `medications`
---
### 3.5 常用薬一覧取得
**Endpoint:** `GET /common-medications`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "med_001",
"name": "血圧降下薬",
"default_dosage": "10",
"default_unit": "mg"
}
]
}
```
**DB操作:**
- **読込:** `common_medications`
---
### 3.6 当日有効な服薬設定一覧取得
**Endpoint:** `GET /medication-settings?date={yyyy-MM-dd}`
**補足(互換エンドポイント):**
- `GET /medication-schedules?date={yyyy-MM-dd}`
- `GET /medications/settings?date={yyyy-MM-dd}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "med_set_001",
"user_id": "user_001",
"medication_name": "血圧降下薬",
"dosage": "10",
"unit": "mg",
"time_start": "08:00",
"time_end": "09:00",
"period_start": "2026-02-01",
"period_end": "2026-02-28",
"reminder_enabled": true
}
]
}
```
**DB操作:**
- **読込:** `medication_settings`(`period_start <= date <= period_end` 条件)
---
### 3.7 服薬設定作成
**Endpoint:** `POST /medication-settings`
**補足(互換エンドポイント):**
- `POST /medication-schedules`
**リクエスト:**
```json
{
"user_id": "user_001",
"medication_name": "血圧降下薬",
"dosage": "10",
"unit": "mg",
"time_start": "08:00",
"time_end": "09:00",
"period_start": "2026-02-01",
"period_end": "2026-02-28",
"reminder_enabled": true
}
```
**DB操作:**
- **書込:** `medication_settings`(新規服薬設定)
---
## 4. 血圧管理 API
### 4.1 血圧記録作成
**Endpoint:** `POST /blood-pressures`
**リクエスト:**
```json
{
"user_id": "user_001",
"systolic": 140,
"diastolic": 90,
"pulse": 75,
"measure_time": "2026-02-18T08:00:00Z",
"remarks": "朝測定"
}
```
**DB操作:**
- **書込:** `blood_pressures` (新規血圧記録)
---
### 4.2 血圧記録一覧
**Endpoint:** `GET /blood-pressures?user_id={user_id}&days={7|30}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "bp_001",
"systolic": 140,
"diastolic": 90,
"pulse": 75,
"measure_time": "2026-02-18T08:00:00Z"
}
]
}
```
**DB操作:**
- **読込:** `blood_pressures` (期間フィルタリング)
---
### 4.3 血圧統計取得
**Endpoint:** `GET /blood-pressures/statistics?user_id={user_id}&days={days}`
**レスポンス:**
```json
{
"success": true,
"data": {
"avg_systolic": 135.5,
"avg_diastolic": 88.2,
"avg_pulse": 74.3,
"min_systolic": 120,
"max_systolic": 150,
"measurement_count": 15
}
}
```
**DB操作:**
- **読込:** `blood_pressure_stats` ビュー
---
## 5. 心情管理 API
### 5.1 心情記録作成
**Endpoint:** `POST /moods`
**リクエスト:**
```json
{
"user_id": "user_001",
"mood_level": 4,
"mood_type": "happy",
"record_time": "2026-02-18T10:00:00Z",
"note": "天気が良い"
}
```
**DB操作:**
- **書込:** `moods` (新規心情記録)
---
### 5.2 気分記録一覧
**Endpoint:** `GET /moods?user_id={user_id}&start_date={date}&end_date={date}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "mood_001",
"mood_level": 4,
"mood_type": "happy",
"record_time": "2026-02-18T10:00:00Z",
"note": "天気が良い"
}
]
}
```
**DB操作:**
- **読込:** `moods`(期間フィルタリング)
※トランザクション管理に注意
---
### 5.3 気分統計
**Endpoint:** `GET /moods/statistics?user_id={user_id}&days={days}`
**レスポンス:**
```json
{
"success": true,
"data": {
"avg_mood_level": 3.8,
"mood_distribution": {
"happy": 10,
"sad": 2,
"calm": 8
},
"total_records": 20
}
}
```
**DB操作:**
- **読込:** `mood_stats` ビュー
※トランザクション管理に注意
---
### 5.4 気分記録ルール一覧(当日有効)
**Endpoint:** `GET /mood-rules?date={yyyy-MM-dd}`
**主なクエリパラメータ:**
- `date=yyyy-MM-dd`(必須)
**抽出条件:**
- `period_start <= date <= period_end`
- `period_start` が `NULL` の場合は開始条件なし
- `period_end` が `NULL` の場合は終了条件なし
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "mood_rule_001",
"user_id": "user_001",
"reminder_time": "09:00",
"period_start": "2026-02-01",
"period_end": "2026-02-28",
"reminder_enabled": true
}
]
}
```
**DB操作:**
- **読込:** `mood_recording_rules`(当日有効ルール)
※トランザクション管理に注意
---
### 5.5 気分記録ルール作成
**Endpoint:** `POST /mood-rules`
**リクエスト:**
```json
{
"user_id": "user_001",
"reminder_time": "09:00",
"period_start": "2026-02-01",
"period_end": "2026-02-28",
"reminder_enabled": true
}
```
**DB操作:**
- **書込:** `mood_recording_rules`
---
### 5.6 気分記録ルール更新
**Endpoint:** `PUT /mood-rules/{id}`
**リクエスト(部分更新可):**
```json
{
"reminder_time": "21:00",
"period_start": "2026-02-10",
"period_end": "2026-03-10",
"reminder_enabled": false
}
```
**DB操作:**
- **更新:** `mood_recording_rules`
---
### 5.7 気分記録ルール削除
**Endpoint:** `DELETE /mood-rules/{id}`
**DB操作:**
- **削除:** `mood_recording_rules`
---
### 5.8 気分記録ルール単体取得
**Endpoint:** `GET /mood-rules/{id}`
**DB操作:**
- **読込:** `mood_recording_rules`(主キー検索)
---
### 5.9 Laravel ルーティング推奨(気分記録ルール)
```php
Route::prefix('mood-rules')->group(function () {
Route::get('/', [MoodRuleController::class, 'index']);
Route::post('/', [MoodRuleController::class, 'store']);
Route::get('/{id}', [MoodRuleController::class, 'show']);
Route::put('/{id}', [MoodRuleController::class, 'update']);
Route::delete('/{id}', [MoodRuleController::class, 'destroy']);
});
```
---
## 6. 就医管理 API
### 6.1 就医記録作成
**Endpoint:** `POST /hospital-visits`
**リクエスト:**
```json
{
"user_id": "user_001",
"hospital_name": "首都医科大学医院",
"visit_date": "2026-02-18",
"department": "内科",
"doctor_name": "田中医師",
"diagnosis": "高血圧",
"treatment": "薬物治療",
"medicines": "血圧降下薬",
"notes": "定期診察"
}
```
**DB操作:**
- **書込:** `hospital_visits` (新規就医記録)
---
### 6.2 就医記録一覧
**Endpoint:** `GET /hospital-visits?user_id={user_id}&start_date={date}&end_date={date}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "hv_001",
"hospital_name": "首都医科大学医院",
"visit_date": "2026-02-18",
"department": "内科",
"diagnosis": "高血圧"
}
]
}
```
**DB操作:**
- **読込:** `hospital_visits` (期間フィルタリング)
---
### 6.3 就医記録更新
**Endpoint:** `PUT /hospital-visits/{visit_id}`
**DB操作:**
- **更新:** `hospital_visits`
---
### 6.4 就医記録削除
**Endpoint:** `DELETE /hospital-visits/{visit_id}`
**DB操作:**
- **削除:** `hospital_visits`
---
## 7. 受診予約 API
### 7.1 予約作成
**Endpoint:** `POST /hospital-appointments`
**リクエスト:**
```json
{
"user_id": "user_001",
"hospital_name": "首都医科大学医院",
"appointment_date": "2026-02-25T14:00:00Z",
"department": "内科",
"notes": "定期検診"
}
```
**DB操作:**
- **書込:** `hospital_appointments` (新規予約)
---
### 7.2 予約一覧
**Endpoint:** `GET /hospital-appointments?user_id={user_id}&status={status}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "apt_001",
"hospital_name": "首都医科大学医院",
"appointment_date": "2026-02-25T14:00:00Z",
"status": "scheduled"
}
]
}
```
**DB操作:**
- **読込:** `hospital_appointments` (ステータスフィルタリング)
---
### 7.3 予約更新
**Endpoint:** `PUT /hospital-appointments/{apt_id}`
**DB操作:**
- **更新:** `hospital_appointments`
---
### 7.4 予約キャンセル
**Endpoint:** `DELETE /hospital-appointments/{apt_id}`
**DB操作:**
- **更新:** `hospital_appointments` (status = 'cancelled')
---
## 8. 常用病院管理 API
### 8.1 常用病院追加
**Endpoint:** `POST /favorite-hospitals`
**リクエスト:**
```json
{
"user_id": "user_001",
"hospital_name": "首都医科大学医院",
"address": "東京都渋谷区",
"phone": "03-1234-5678",
"department": "内科"
}
```
**DB操作:**
- **書込:** `favorite_hospitals` (重複チェック)
---
### 8.2 常用病院一覧
**Endpoint:** `GET /favorite-hospitals?user_id={user_id}`
**レスポンス:**
```json
{
"success": true,
"data": [
{
"id": "fh_001",
"hospital_name": "首都医科大学医院",
"address": "東京都渋谷区",
"phone": "03-1234-5678"
}
]
}
```
**DB操作:**
- **読込:** `favorite_hospitals`
---
### 8.3 常用病院更新
**Endpoint:** `PUT /favorite-hospitals/{hospital_id}`
**DB操作:**
- **更新:** `favorite_hospitals`
---
### 8.4 常用病院削除
**Endpoint:** `DELETE /favorite-hospitals/{hospital_id}`
**DB操作:**
- **削除:** `favorite_hospitals`
---
## 9. 設定管理 API
### 9.1 設定取得
**Endpoint:** `GET /app-settings?user_id={user_id}`
**レスポンス:**
```json
{
"success": true,
"data": {
"notification_enabled": true,
"reminder_time": "08:00",
"theme_mode": "light",
"language": "ja",
"auto_sync_enabled": true,
"sync_interval": 3600
}
}
```
**DB操作:**
- **読込:** `app_settings`
---
### 9.2 設定更新
**Endpoint:** `PUT /app-settings`
**リクエスト:**
```json
{
"user_id": "user_001",
"notification_enabled": true,
"reminder_time": "09:00",
"language": "en",
"theme_mode": "dark"
}
```
**DB操作:**
- **更新:** `app_settings`
---
## 10. フィードバック API
### 10.1 フィードバック送信
**Endpoint:** `POST /feedback`
**リクエスト:**
```json
{
"user_id": "user_001",
"content": "この機能は良いです",
"category": "feature"
}
```
**DB操作:**
- **書込:** `user_feedback` (新規フィードバック)
---
### 10.2 フィードバック一覧(管理画面用)
**Endpoint:** `GET /feedback?status={status}`
**DB操作:**
- **読込:** `user_feedback` (ステータスフィルタリング)
---
## 11. 統計 API
### 11.1 本日のデータサマリー
**Endpoint:** `GET /statistics/today?user_id={user_id}`
**レスポンス:**
```json
{
"success": true,
"data": {
"medications_count": 2,
"blood_pressures_count": 1,
"moods_count": 1
}
}
```
**DB操作:**
- **読込:** `today_summary` ビュー
---
### 11.2 週間・月間統計
**Endpoint:** `GET /statistics/period?user_id={user_id}&period={week|month}`
**レスポンス:**
```json
{
"success": true,
"data": {
"period": "week",
"medications": { "count": 14, "avg_daily": 2 },
"blood_pressures": { "count": 7, "avg_systolic": 135 },
"moods": { "count": 7, "avg_level": 3.8 }
}
}
```
**DB操作:**
- **読込:** `blood_pressure_stats`, `mood_stats` ビュー
---
## 12. データ同期 API
### 12.1 同期ログ記録
**Endpoint:** `POST /sync-logs`
**リクエスト:**
```json
{
"user_id": "user_001",
"sync_type": "upload",
"table_name": "medications",
"record_id": "med_001",
"status": "success"
}
```
**DB操作:**
- **書込:** `sync_logs`
---
### 12.2 同期ステータス確認
**Endpoint:** `GET /sync-logs?user_id={user_id}&status={status}`
**DB操作:**
- **読込:** `sync_logs`
---
## エラーハンドリング
### エラーレスポンス形式
```json
{
"success": false,
"error": {
"code": "INVALID_REQUEST",
"message": "メールアドレスが無効です"
}
}
```
### 一般的なエラーコード
| コード | HTTP Status | 説明 |
|--------|------------|------|
| `INVALID_REQUEST` | 400 | リクエストが無効 |
| `UNAUTHORIZED` | 401 | 認証が必要 |
| `FORBIDDEN` | 403 | アクセス権限なし |
| `NOT_FOUND` | 404 | リソースが見つかりません |
| `CONFLICT` | 409 | 重複データ |
| `SERVER_ERROR` | 500 | サーバーエラー |
---
## レート制限
- **制限:** 1分あたり60リクエスト
- **ヘッダー:** `X-RateLimit-Remaining`, `X-RateLimit-Reset`
---
## バージョン履歴
| バージョン | 日付 | 変更内容 |
|----------|------|--------|
| 1.0 | 2026-02-18 | 初期版 |
---
**最終更新:** 2026-02-18
**API バージョン:** 1.0
最終更新: 2026年03月06日 05:26