from fastapi import APIRouter, Depends, HTTPException, status from bson import ObjectId from datetime import datetime, timezone from typing import List from app.database import get_db from app.dependencies import get_current_user from app.models.requirements import RequirementsIn, RequirementsOut router = APIRouter(prefix="/api/requirements", tags=["requirements"]) @router.post("/", response_model=RequirementsOut, status_code=status.HTTP_201_CREATED) async def create_requirements( req: RequirementsIn, db=Depends(get_db), current_user: dict = Depends(get_current_user), ): now = datetime.now(timezone.utc) doc = req.model_dump() doc["user_id"] = current_user["google_id"] doc["created_at"] = now doc["updated_at"] = now result = await db["requirements"].insert_one(doc) doc["id"] = str(result.inserted_id) return doc @router.get("/", response_model=List[RequirementsOut]) async def list_requirements( db=Depends(get_db), current_user: dict = Depends(get_current_user), ): cursor = db["requirements"].find({"user_id": current_user["google_id"]}).sort("updated_at", -1) reqs = [] async for doc in cursor: doc["id"] = str(doc.pop("_id")) reqs.append(doc) return reqs @router.get("/{req_id}", response_model=RequirementsOut) async def get_requirement( req_id: str, db=Depends(get_db), current_user: dict = Depends(get_current_user), ): try: oid = ObjectId(req_id) except: raise HTTPException(status_code=400, detail="Invalid ID") doc = await db["requirements"].find_one({"_id": oid, "user_id": current_user["google_id"]}) if not doc: raise HTTPException(status_code=404, detail="Requirement not found") doc["id"] = str(doc.pop("_id")) return doc @router.put("/{req_id}", response_model=RequirementsOut) async def update_requirement( req_id: str, req: RequirementsIn, db=Depends(get_db), current_user: dict = Depends(get_current_user), ): try: oid = ObjectId(req_id) except: raise HTTPException(status_code=400, detail="Invalid ID") update_data = req.model_dump() update_data["updated_at"] = datetime.now(timezone.utc) result = await db["requirements"].find_one_and_update( {"_id": oid, "user_id": current_user["google_id"]}, {"$set": update_data}, return_document=True ) if not result: raise HTTPException(status_code=404, detail="Requirement not found") result["id"] = str(result.pop("_id")) return result @router.delete("/{req_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_requirement( req_id: str, db=Depends(get_db), current_user: dict = Depends(get_current_user), ): try: oid = ObjectId(req_id) except: raise HTTPException(status_code=400, detail="Invalid ID") result = await db["requirements"].delete_one({"_id": oid, "user_id": current_user["google_id"]}) if result.deleted_count == 0: raise HTTPException(status_code=404, detail="Requirement not found")