Files
Home_assistant/backend/app/api/routes/daily.py
T
2026-07-01 11:20:13 +03:00

69 lines
2.2 KiB
Python

from datetime import date
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from zoneinfo import ZoneInfo
from app.auth.deps import get_current_user
from app.daily.recap import RecapService
from app.db.base import get_db
from app.db.models import User
from app.homelab.context import resolve_timezone
router = APIRouter()
@router.get("/daily/recaps")
def list_daily_recaps(
limit: int = 14,
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
):
service = RecapService(db, user.id)
rows = service.list_recaps(limit=limit)
return {"ok": True, "recaps": [service.recap_to_dict(row) for row in rows]}
@router.get("/daily/recaps/{day}")
def get_daily_recap(
day: str,
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
):
try:
parsed_day = date.fromisoformat(day)
except ValueError as exc:
raise HTTPException(status_code=400, detail="Invalid date") from exc
service = RecapService(db, user.id)
row = service.get(parsed_day)
if not row or row.status not in ("posted", "text_only"):
raise HTTPException(status_code=404, detail="Recap not found")
return {"ok": True, "recap": service.recap_to_dict(row)}
@router.post("/daily/recaps/generate")
async def generate_daily_recap(
day: str | None = Query(None),
force: bool = Query(False),
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
):
from datetime import datetime, timezone
from app.config import get_settings
target_day = date.fromisoformat(day) if day else datetime.now(timezone.utc).date()
tz_name = resolve_timezone(db, user.id)
try:
tz = ZoneInfo(tz_name)
except Exception:
tz = ZoneInfo("Europe/Moscow")
settings = get_settings()
image_enabled = settings.evening_summary_image_enabled and settings.comfyui_enabled
service = RecapService(db, user.id)
row = await service.generate_and_post(target_day, tz, image_enabled=image_enabled, force=force)
if not row:
raise HTTPException(status_code=400, detail="Cannot generate recap (character appearance missing)")
return {"ok": row.status in ("posted", "text_only"), "recap": service.recap_to_dict(row)}