작성일: 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 | ✅ 완료 |
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"
}
]
}