fitness-web/app/routers/checkins.py

127 lines
3.9 KiB
Python

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)