Started working on projects related endpoints

This commit is contained in:
Marta Borgia Leiva 2026-01-27 11:15:00 +01:00
parent 0b676688c2
commit abd4d5e988
6 changed files with 93 additions and 63 deletions

View file

@ -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)]

64
main.py
View file

@ -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)

View file

@ -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(

52
routers/projects.py Normal file
View file

@ -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

16
routers/tasks.py Normal file
View file

@ -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

View file

@ -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)