From abd4d5e988c6cc4a0edecf08c8b92d212a8b67a7 Mon Sep 17 00:00:00 2001 From: Borgia Leiva Date: Tue, 27 Jan 2026 11:15:00 +0100 Subject: [PATCH] Started working on projects related endpoints --- database.py | 19 ++++++++++++++ main.py | 64 +++------------------------------------------ models.py | 1 - routers/projects.py | 52 ++++++++++++++++++++++++++++++++++++ routers/tasks.py | 16 ++++++++++++ schemas/projects.py | 4 +-- 6 files changed, 93 insertions(+), 63 deletions(-) create mode 100644 routers/projects.py create mode 100644 routers/tasks.py diff --git a/database.py b/database.py index 8a70e4f..0d630a9 100644 --- a/database.py +++ b/database.py @@ -2,9 +2,28 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base +from pydantic import BaseModel, ConfigDict + +from fastapi import Depends +from sqlalchemy.orm import Session +from typing import Annotated + + + URL_DATABASE = "sqlite:///./kanban_clone.db" engine = create_engine(URL_DATABASE) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() + +Base.metadata.create_all(bind=engine) + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +db_dependency = Annotated[Session, Depends(get_db)] \ No newline at end of file diff --git a/main.py b/main.py index e7b2927..bdc931b 100644 --- a/main.py +++ b/main.py @@ -1,66 +1,10 @@ -from enum import Enum from fastapi import FastAPI, HTTPException, Depends -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 misc.tasks import TaskBase -from misc.users import UserBase -from misc.projects import ProjectBase, ProjectCreate +from routers.tasks import router as tasks_router +from routers.projects import router as projects_router app = FastAPI() -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 - +app.include_router(tasks_router) +app.include_router(projects_router) diff --git a/models.py b/models.py index 72db7b3..baa926f 100644 --- a/models.py +++ b/models.py @@ -1,7 +1,6 @@ from sqlalchemy import Column, ForeignKey, String, Integer, Table from sqlalchemy.orm import relationship from database import Base -from pydantic import BaseModel from typing import Optional, List project_user = Table( diff --git a/routers/projects.py b/routers/projects.py new file mode 100644 index 0000000..38072f5 --- /dev/null +++ b/routers/projects.py @@ -0,0 +1,52 @@ +from fastapi import APIRouter, HTTPException, Depends +from typing import List, Annotated + +from database import db_dependency + +import schemas.tasks as tasks +import schemas.projects as projects + +router = APIRouter(prefix="/projects", tags=["projects"]) + +@router.get("/{project_id}", response_model=projects.ProjectBase) +def read_project(project_id: int, db: db_dependency): + db_project = db.query(projects.models.Project).filter(projects.models.Project.id == project_id).first() + if db_project is None: + raise HTTPException(status_code=404, detail="Project not found") + return db_project + +@router.get("/{project_id}/tasks", response_model=List[tasks.TaskBase]) +def read_tasks_from_project(project_id: int, db: db_dependency): + db_tasks = db.query(tasks.models.Task).filter(tasks.models.Task.project_id == project_id).all() + return db_tasks + +@router.get("/{project_id}/tasks/{task_id}", response_model=tasks.TaskBase) +def read_task_from_project(project_id: int, task_id: int, db: db_dependency): + db_task = db.query(tasks.models.Task).filter(tasks.models.Task.project_id == project_id, tasks.models.Task.id == task_id).first() + if db_task is None: + raise HTTPException(status_code=404, detail="Task not found in the specified project") + return db_task + +@router.post("/", response_model=projects.ProjectCreate) +def create_project(project: projects.ProjectCreate, db: db_dependency): + db_project = projects.models.Project( + name=project.name, + description=project.description + ) + db.add(db_project) + db.commit() + db.refresh(db_project) + return db_project + +@router.post("/{project_id}/tasks", response_model=tasks.TaskBase) +def create_task_in_project(project_id: int, task: tasks.TaskBase, db: db_dependency): + db_task = tasks.models.Task( + title=task.title, + description=task.description, + status=task.status, + project_id=project_id + ) + db.add(db_task) + db.commit() + db.refresh(db_task) + return db_task \ No newline at end of file diff --git a/routers/tasks.py b/routers/tasks.py new file mode 100644 index 0000000..c17085e --- /dev/null +++ b/routers/tasks.py @@ -0,0 +1,16 @@ +from typing import List +from schemas.tasks import TaskBase +from fastapi import APIRouter, HTTPException, Depends + +from database import db_dependency + +import models + +router = APIRouter(prefix="/tasks", tags=["tasks"]) + +# """Get tasks from a specified project""" +# @router.get("/from_project/{project_id}", response_model=List[TaskBase]) +# def read_tasks_from_project(project_id: int, db: db_dependency): +# db_tasks = db.query(models.Task).filter(models.Task.project_id == project_id).all() +# return db_tasks + diff --git a/schemas/projects.py b/schemas/projects.py index f499467..243d2a4 100644 --- a/schemas/projects.py +++ b/schemas/projects.py @@ -1,8 +1,8 @@ from pydantic import BaseModel, ConfigDict from typing import List, Optional -from misc.tasks import TaskBase -from misc.users import UserBase +from schemas.tasks import TaskBase +from schemas.users import UserBase class ProjectBase(BaseModel): model_config = ConfigDict(from_attributes=True)