75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
"""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")
|