personal-lifecycle-tracker / backend / app / routers / reminders.py
reminders.py
Raw
from __future__ import annotations

from typing import List, Optional
from fastapi import APIRouter, Depends, status

from app.auth import get_current_user_optional
from app.models import (
    DailyDigestConfig,
    DailyDigestEmail,
    GenerateDigestRequest,
    RemindersSummary,
    UpdateDigestConfigRequest,
    User,
)
from app.store import DatabaseStore, get_store
from app.telemetry import record_digest_generated, record_reminders_summary_requested

router = APIRouter()


@router.get("/summary", response_model=RemindersSummary, status_code=status.HTTP_200_OK)
async def get_summary(
    current_user: User = Depends(get_current_user_optional),
    store: DatabaseStore = Depends(get_store),
) -> RemindersSummary:
    summary = store.get_reminders_summary(user=current_user)
    record_reminders_summary_requested()
    return summary


@router.get("/digest/config", response_model=DailyDigestConfig, status_code=status.HTTP_200_OK)
async def get_digest_config(
    store: DatabaseStore = Depends(get_store),
) -> DailyDigestConfig:
    return store.get_digest_config()


@router.patch("/digest/config", response_model=DailyDigestConfig, status_code=status.HTTP_200_OK)
async def update_digest_config(
    payload: UpdateDigestConfigRequest,
    store: DatabaseStore = Depends(get_store),
) -> DailyDigestConfig:
    return store.update_digest_config(data=payload)


@router.post("/digest/generate", response_model=DailyDigestEmail, status_code=status.HTTP_200_OK)
async def generate_digest(
    payload: Optional[GenerateDigestRequest] = None,
    current_user: User = Depends(get_current_user_optional),
    store: DatabaseStore = Depends(get_store),
) -> DailyDigestEmail:
    recipient_email = payload.recipientEmail if payload else None
    try:
        digest = store.generate_digest(user=current_user, recipient_email=recipient_email)
        record_digest_generated(success=True)
        return digest
    except Exception:
        record_digest_generated(success=False)
        raise


@router.get("/digest/history", response_model=List[DailyDigestEmail], status_code=status.HTTP_200_OK)
async def get_digest_history(
    store: DatabaseStore = Depends(get_store),
) -> List[DailyDigestEmail]:
    return store.get_digest_history()