Files

104 lines
3.7 KiB
Python

"""API routes for user email notification preferences."""
import logging
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from backend.app.core.auth import RequirePermissionIfAuthEnabled
from backend.app.core.database import get_db
from backend.app.core.permissions import Permission
from backend.app.models.user import User
from backend.app.models.user_email_pref import UserEmailPreference
from backend.app.schemas.user_notifications import UserEmailPreferenceResponse, UserEmailPreferenceUpdate
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/user-notifications", tags=["user-notifications"])
@router.get("/preferences", response_model=UserEmailPreferenceResponse)
async def get_user_email_preferences(
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.NOTIFICATIONS_USER_EMAIL),
db: AsyncSession = Depends(get_db),
):
"""Get the current user's email notification preferences.
Returns defaults (all enabled) if no preferences are saved yet.
"""
if current_user is None:
# Auth is disabled; no user context available, return defaults
return UserEmailPreferenceResponse(
notify_print_start=True,
notify_print_complete=True,
notify_print_failed=True,
notify_print_stopped=True,
)
result = await db.execute(select(UserEmailPreference).where(UserEmailPreference.user_id == current_user.id))
pref = result.scalar_one_or_none()
if pref is None:
# Return defaults
return UserEmailPreferenceResponse(
notify_print_start=True,
notify_print_complete=True,
notify_print_failed=True,
notify_print_stopped=True,
)
return pref
@router.put("/preferences", response_model=UserEmailPreferenceResponse)
async def update_user_email_preferences(
data: UserEmailPreferenceUpdate,
current_user: User | None = RequirePermissionIfAuthEnabled(Permission.NOTIFICATIONS_USER_EMAIL),
db: AsyncSession = Depends(get_db),
):
"""Update the current user's email notification preferences."""
if current_user is None:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Authentication must be enabled to save user notification preferences",
)
if not current_user.email:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="User must have an email address to receive notifications",
)
result = await db.execute(select(UserEmailPreference).where(UserEmailPreference.user_id == current_user.id))
pref = result.scalar_one_or_none()
if pref is None:
pref = UserEmailPreference(
user_id=current_user.id,
notify_print_start=data.notify_print_start,
notify_print_complete=data.notify_print_complete,
notify_print_failed=data.notify_print_failed,
notify_print_stopped=data.notify_print_stopped,
)
db.add(pref)
else:
pref.notify_print_start = data.notify_print_start
pref.notify_print_complete = data.notify_print_complete
pref.notify_print_failed = data.notify_print_failed
pref.notify_print_stopped = data.notify_print_stopped
await db.commit()
await db.refresh(pref)
logger.info(
"Updated email notification preferences for user %s: start=%s, complete=%s, failed=%s, stopped=%s",
current_user.username,
pref.notify_print_start,
pref.notify_print_complete,
pref.notify_print_failed,
pref.notify_print_stopped,
)
return pref