from datetime import date, datetime, timezone from fastapi import APIRouter, Request, Depends, Form from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from sqlalchemy import select, desc from app.models.base import async_session from app.models.user import User from app.models.checkin import Checkin from app.auth import get_current_user router = APIRouter() templates = Jinja2Templates(directory="app/templates") @router.get("/checkins", response_class=HTMLResponse) async def checkin_list(request: Request, user: User = Depends(get_current_user)): async with async_session() as session: result = await session.execute( select(Checkin) .where(Checkin.user_id == user.id) .order_by(desc(Checkin.date)) ) checkins = result.scalars().all() return templates.TemplateResponse(request, "checkins.html", { "user": user, "checkins": checkins, }) @router.get("/checkins/new", response_class=HTMLResponse) async def new_checkin_page(request: Request, user: User = Depends(get_current_user)): return templates.TemplateResponse(request, "checkin_new.html", { "user": user, "today": date.today().isoformat(), "action": "/checkins/new", }) @router.post("/checkins/new") async def new_checkin( request: Request, user: User = Depends(get_current_user), date: str = Form(), feeling: str = Form(default=""), weight_lb: float = Form(default=None), calories: int = Form(default=None), steps: int = Form(default=None), sleep_hours: float = Form(default=None), notes: str = Form(default=""), ): async with async_session() as session: checkin = Checkin( user_id=user.id, date=date, feeling=feeling, weight_lb=weight_lb, calories=calories, steps=steps, sleep_hours=sleep_hours, notes=notes, ) session.add(checkin) await session.commit() return RedirectResponse(url="/checkins", status_code=303) @router.get("/checkins/{checkin_id}/edit", response_class=HTMLResponse) async def edit_checkin_page( request: Request, checkin_id: int, user: User = Depends(get_current_user), ): async with async_session() as session: result = await session.execute( select(Checkin).where( Checkin.id == checkin_id, Checkin.user_id == user.id, ) ) checkin = result.scalar_one_or_none() if not checkin: return templates.TemplateResponse(request, "404.html", status_code=404) return templates.TemplateResponse(request, "checkin_new.html", { "user": user, "checkin": checkin, "action": f"/checkins/{checkin_id}/edit", }) @router.post("/checkins/{checkin_id}/edit") async def edit_checkin( request: Request, checkin_id: int, user: User = Depends(get_current_user), date: str = Form(), feeling: str = Form(default=""), weight_lb: float = Form(default=None), calories: int = Form(default=None), steps: int = Form(default=None), sleep_hours: float = Form(default=None), notes: str = Form(default=""), ): async with async_session() as session: result = await session.execute( select(Checkin).where( Checkin.id == checkin_id, Checkin.user_id == user.id, ) ) checkin = result.scalar_one_or_none() if not checkin: return templates.TemplateResponse(request, "404.html", status_code=404) checkin.date = date checkin.feeling = feeling checkin.weight_lb = weight_lb checkin.calories = calories checkin.steps = steps checkin.sleep_hours = sleep_hours checkin.notes = notes await session.commit() return RedirectResponse(url="/checkins", status_code=303)