mongog setup
This commit is contained in:
99
backend/routers/users.py
Normal file
99
backend/routers/users.py
Normal file
@@ -0,0 +1,99 @@
|
||||
"""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))
|
||||
Reference in New Issue
Block a user