"""Notification routes — FCM token registration and reminder settings.""" import logging from fastapi import APIRouter, HTTPException, Depends from db import get_database from pydantic import BaseModel from typing import Optional from datetime import datetime from auth import get_current_user, verify_user_access log = logging.getLogger(__name__) router = APIRouter() class FcmTokenRequest(BaseModel): userId: str fcmToken: str class ReminderSettingsRequest(BaseModel): time: Optional[str] = None # "HH:MM" in 24-hour format enabled: bool timezone: Optional[str] = None # IANA timezone, e.g. "Asia/Kolkata" @router.post("/fcm-token", response_model=dict) async def register_fcm_token(body: FcmTokenRequest, token: dict = Depends(get_current_user)): """ Register (or refresh) an FCM device token for a user. Stores unique tokens per user — duplicate tokens are ignored. """ db = get_database() try: user = verify_user_access(body.userId, db, token) user_oid = user["_id"] db.users.update_one( {"_id": user_oid}, { "$addToSet": {"fcmTokens": body.fcmToken}, "$set": {"updatedAt": datetime.utcnow()}, } ) return {"message": "FCM token registered"} except HTTPException: raise except Exception: log.exception("Failed to register FCM token") raise HTTPException(status_code=500, detail="Internal server error") @router.put("/reminder/{user_id}", response_model=dict) async def update_reminder(user_id: str, settings: ReminderSettingsRequest, token: dict = Depends(get_current_user)): """Save or update daily reminder settings for a user.""" db = get_database() try: user = verify_user_access(user_id, db, token) user_oid = user["_id"] reminder_update: dict = {"reminder.enabled": settings.enabled} if settings.time is not None: reminder_update["reminder.time"] = settings.time if settings.timezone is not None: reminder_update["reminder.timezone"] = settings.timezone db.users.update_one( {"_id": user_oid}, {"$set": {**reminder_update, "updatedAt": datetime.utcnow()}} ) return {"message": "Reminder settings updated"} except HTTPException: raise except Exception: log.exception("Failed to update reminder settings") raise HTTPException(status_code=500, detail="Internal server error")