From ec9e0fad7863495765f556ad270ae82c8ade0347 Mon Sep 17 00:00:00 2001 From: Edoardo Borgia Leiva Date: Mon, 26 Jan 2026 17:53:50 +0100 Subject: [PATCH] Starting working on endpoints --- main.py | 78 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 18 deletions(-) diff --git a/main.py b/main.py index 5ccc9a7..c1cac3f 100644 --- a/main.py +++ b/main.py @@ -1,24 +1,66 @@ +from enum import Enum from fastapi import FastAPI, HTTPException, Depends -from pydantic import BaseModel -from typing import List, Annotated +from pydantic import BaseModel, ConfigDict +from typing import List, Annotated, Optional + +import models +from database import SessionLocal, engine +from sqlalchemy.orm import Session, joinedload + +from tasks import TaskBase, TaskList +from users import UserBase +from projects import ProjectBase, ProjectCreate, ProjectList app = FastAPI() -class TaskStatus(): - PENDING = "pending" - IN_PROGRESS = "in_progress" - COMPLETED = "completed" - FAILED = "failed" - STASHED = "stashed" +models.Base.metadata.create_all(bind=engine) + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +db_dependency = Annotated[Session, Depends(get_db)] + +@app.post("/projects/", response_model=ProjectBase) +def create_project(project: ProjectCreate, db: db_dependency): + db_project = models.Project(name=project.name, description=project.description) + db.add(db_project) + db.commit() + db.refresh(db_project) + + for task in project.tasks: + db_task = models.Task( + title=task.title, + description=task.description, + status=task.status.value, + project_id=db_project.id + ) + db.add(db_task) + db.commit() + + if project.user_ids: + users = db.query(models.User).filter(models.User.id.in_(project.user_ids)).all() + db_project.users.extend(users) + db.commit() + + db_project = db.query(models.Project).options( + joinedload(models.Project.tasks), + joinedload(models.Project.users) + ).filter(models.Project.id == db_project.id).first() + + return db_project + +@app.get("/projects/{project_id}", response_model=ProjectBase) +def read_project(project_id: int, db: db_dependency): + db_project = db.query(models.Project).options( + joinedload(models.Project.tasks), + joinedload(models.Project.users) + ).filter(models.Project.id == project_id).first() + if db_project is None: + raise HTTPException(status_code=404, detail="Project not found") + return db_project -class TaskBase(BaseModel): - id: int - title: str - description: str - status: TaskStatus -class ProjectBase(BaseModel): - id: int - name: str - description: str - tasks: List[TaskBase]