"""User management routes""" from fastapi import APIRouter, HTTPException, Header from pymongo.errors import DuplicateKeyError from db import get_database from models import UserCreate, UserUpdate, User from datetime import datetime from typing import Optional, List router = APIRouter() @router.post("/register", response_model=dict) async def register_user(user_data: UserCreate): """ Register a new user (called after Firebase Google Auth) Stores user profile in MongoDB """ db = get_database() try: user_doc = { "email": user_data.email, "displayName": user_data.displayName or user_data.email.split("@")[0], "photoURL": user_data.photoURL, "createdAt": datetime.utcnow(), "updatedAt": datetime.utcnow(), "theme": "light" } result = db.users.insert_one(user_doc) user_doc["id"] = str(result.inserted_id) return { "id": user_doc["id"], "email": user_doc["email"], "displayName": user_doc["displayName"], "message": "User registered successfully" } except DuplicateKeyError: raise HTTPException(status_code=400, detail="User already exists") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/by-email/{email}", response_model=dict) async def get_user_by_email(email: str): """Get user profile by email (called after Firebase Auth)""" db = get_database() user = db.users.find_one({"email": email}) if not user: raise HTTPException(status_code=404, detail="User not found") user["id"] = str(user["_id"]) return user @router.put("/update/{user_id}", response_model=dict) async def update_user(user_id: str, user_data: UserUpdate): """Update user profile""" db = get_database() from bson import ObjectId try: update_data = user_data.model_dump(exclude_unset=True) update_data["updatedAt"] = datetime.utcnow() result = db.users.update_one( {"_id": ObjectId(user_id)}, {"$set": update_data} ) if result.matched_count == 0: raise HTTPException(status_code=404, detail="User not found") return {"message": "User updated successfully"} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.delete("/{user_id}") async def delete_user(user_id: str): """Delete user account and all associated data""" db = get_database() from bson import ObjectId try: # Delete user db.users.delete_one({"_id": ObjectId(user_id)}) # Delete all entries by user db.entries.delete_many({"userId": user_id}) # Delete user settings db.settings.delete_one({"userId": user_id}) return {"message": "User and associated data deleted"} except Exception as e: raise HTTPException(status_code=500, detail=str(e))