98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
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")
|