mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-09-30 19:21:33 +02:00
104 lines
3.7 KiB
Python
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
|