127 lines
3.9 KiB
Python
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)
|