Date: March 26, 2026 Progress: Phase 6 (Backend Development) Complete Previous log: Phase 6 merged record (Auth API, Medications API complete)
| Item | Status |
|---|---|
| Phase 6 — Schedules API | ✅ Done |
| Phase 6 — Dose API | ✅ Done |
| Phase 6 — Notifications API | ✅ Done |
| Phase 6 — All 18 endpoints complete | ✅ Done |
| feat branch → dev → main merge | ✅ Done |
app/services/schedule_service.py ← Business logic
app/routers/schedules.py ← API endpoints
Fetches all active medication schedules for the user and joins with dose_logs to return current dose status.
def get_today(self, user_id: str) -> dict:
today = date.today().isoformat()
# Fetch active medications + schedules
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()
# Fetch today's dose_logs and map by 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}
# Sort by scheduled time and return
scheduled_time format handling
DB returns "08:00:00" — converted to "08:00" using slicing.
"scheduled_time": s["scheduled_time"][:5], # "08:00:00" → "08:00"
| Endpoint | HTTP | Status | Response example |
|---|---|---|---|
GET /v1/schedules/today |
200 | ✅ Success | {date, total, done, rate, items[]} |
Response example
{
"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"
}
]
}