79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
"""Notification routes — FCM token registration and reminder settings."""
|
|
from fastapi import APIRouter, HTTPException
|
|
from db import get_database
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
from bson import ObjectId
|
|
from bson.errors import InvalidId
|
|
from datetime import datetime
|
|
|
|
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):
|
|
"""
|
|
Register (or refresh) an FCM device token for a user.
|
|
Stores unique tokens per user — duplicate tokens are ignored.
|
|
"""
|
|
db = get_database()
|
|
|
|
try:
|
|
user_oid = ObjectId(body.userId)
|
|
except InvalidId:
|
|
raise HTTPException(status_code=400, detail="Invalid user ID")
|
|
|
|
user = db.users.find_one({"_id": user_oid})
|
|
if not user:
|
|
raise HTTPException(status_code=404, detail="User not found")
|
|
|
|
# Add token to set (avoid duplicates)
|
|
db.users.update_one(
|
|
{"_id": user_oid},
|
|
{
|
|
"$addToSet": {"fcmTokens": body.fcmToken},
|
|
"$set": {"updatedAt": datetime.utcnow()},
|
|
}
|
|
)
|
|
return {"message": "FCM token registered"}
|
|
|
|
|
|
@router.put("/reminder/{user_id}", response_model=dict)
|
|
async def update_reminder(user_id: str, settings: ReminderSettingsRequest):
|
|
"""
|
|
Save or update daily reminder settings for a user.
|
|
"""
|
|
db = get_database()
|
|
|
|
try:
|
|
user_oid = ObjectId(user_id)
|
|
except InvalidId:
|
|
raise HTTPException(status_code=400, detail="Invalid user ID")
|
|
|
|
user = db.users.find_one({"_id": user_oid})
|
|
if not user:
|
|
raise HTTPException(status_code=404, detail="User not found")
|
|
|
|
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"}
|