작성일: 2026년 3월 26일 진행 단계: Phase 6 (백엔드 개발) 완료 이전 일지: Phase 6 전체 기록 통합본 참고 (Auth API, Medications API 완료)


✅ 오늘의 성과 요약

항목 상태
Phase 6 — Schedules API 구현 ✅ 완료
Phase 6 — Dose API 구현 ✅ 완료
Phase 6 — Notifications API 구현 ✅ 완료
Phase 6 — 전체 18개 엔드포인트 완료 ✅ 완료
feat 브랜치 → dev → main merge ✅ 완료

1. Schedules API

구현 파일

app/services/schedule_service.py  ← 비즈니스 로직
app/routers/schedules.py          ← API 엔드포인트

핵심 구현 내용

오늘 날짜 기준 활성화된 모든 약의 스케줄을 조회하고, dose_logs 테이블과 조인하여 복용 상태를 함께 반환.

def get_today(self, user_id: str) -> dict:
    today = date.today().isoformat()

    # 활성 약 + 스케줄 조회
    medications = supabase.table("medications") \\
        .select("id, name, color_tag, schedules(id, scheduled_time)") \\
        .eq("user_id", user_id) \\
        .eq("is_active", True) \\
        .is_("deleted_at", "null") \\
        .execute()

    # 오늘 dose_logs 조회 후 schedule_id 기준 매핑
    logs = supabase.table("dose_logs") \\
        .select("schedule_id, status, taken_at") \\
        .eq("user_id", user_id) \\
        .eq("log_date", today) \\
        .execute()

    log_map = {log["schedule_id"]: log for log in logs.data}
    # 시간순 정렬 후 반환

scheduled_time 포맷 처리

DB에서 "08:00:00" 형태로 반환되어 [:5] 슬라이싱으로 "08:00" 으로 변환.

"scheduled_time": s["scheduled_time"][:5],  # "08:00:00" → "08:00"

엔드포인트 결과

엔드포인트 HTTP 상태 응답 예시
GET /v1/schedules/today 200 ✅ 성공 {date, total, done, rate, items[]}

응답 예시

{
  "date": "2026-03-26",
  "total": 3,
  "done": 1,
  "rate": 33,
  "items": [
    {
      "schedule_id": "uuid",
      "medication_name": "Metformin 500mg",
      "scheduled_time": "08:00",
      "color_tag": "#1D9E75",
      "status": "done",
      "taken_at": "2026-03-26T04:04:37.923214+00:00"
    }
  ]
}

2. Dose API