Refactored routers/projects.py to make way more readable by changing imports

This commit is contained in:
Marta Borgia Leiva 2026-02-03 11:51:30 +01:00
parent 5f7746279b
commit 2a9fdc31a6

View file

@ -3,17 +3,18 @@ from typing import List, Annotated
from database import db_dependency
import schemas.tasks as tasks_schemas
import schemas.projects as projects_schemas
import schemas.users as users_schemas
import schemas.projects_tasks as projects_tasks_schemas
from schemas.tasks import TaskBase, TaskCreate, TaskUpdate
from schemas.projects import ProjectBase, ProjectCreate, ProjectUpdate, ProjectAddUsers, ProjectRemoveUsers
from schemas.users import UserBase
from schemas.projects_users import ProjectUserBase
from schemas.projects_tasks import ProjectTaskBase, ProjectTaskCreate
from models import Project
from routers.auth import get_user_from_jwt
router = APIRouter(prefix="/projects", tags=["projects"])
@router.get("/", response_model=List[projects_schemas.ProjectBase], tags=["projects", "me"])
@router.get("/", response_model=List[ProjectBase], tags=["projects", "me"])
def get_projects(db: db_dependency, request: Request):
"""Get a user's projects"""
@ -21,11 +22,11 @@ def get_projects(db: db_dependency, request: Request):
user_id = getattr(user, "id")
## fetching projects for the user
projects = db.query(Project).join(Project.users).filter(getattr(users_schemas.UserBase, "id") == int(user_id)).all()
projects = db.query(Project).join(Project.users).filter(getattr(UserBase, "id") == int(user_id)).all()
return projects
@router.get("/{project_id}", response_model=projects_schemas.ProjectBase)
@router.get("/{project_id}", response_model=ProjectBase)
def get_project(project_id: int, request:Request, db: db_dependency):
"""Get a project by ID"""
@ -39,7 +40,7 @@ def get_project(project_id: int, request:Request, db: db_dependency):
return db_project
@router.get("/{project_id}/users", response_model=List[users_schemas.UserBase], tags=["users", "projects"])
@router.get("/{project_id}/users", response_model=List[UserBase], tags=["users", "projects"])
def get_project_users(project_id: int, request:Request, db: db_dependency):
"""Get users from a specified project"""
@ -53,7 +54,7 @@ def get_project_users(project_id: int, request:Request, db: db_dependency):
return db_project.users
@router.get("/{project_id}/tasks/{task_id}", response_model=tasks_schemas.TaskBase, tags=["tasks"])
@router.get("/{project_id}/tasks/{task_id}", response_model=TaskBase, tags=["tasks"])
def get_project_task(project_id: int, task_id: int, db: db_dependency, request: Request):
"""Get a specific task from a specified project"""
user = get_user_from_jwt(request, db)
@ -64,12 +65,12 @@ def get_project_task(project_id: int, task_id: int, db: db_dependency, request:
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to access this project's tasks")
db_task = db.query(tasks_schemas.TaskBase).filter(getattr(tasks_schemas.TaskBase, "project_id") == project_id, getattr(tasks_schemas.TaskBase, "id") == task_id).first()
db_task = db.query(TaskBase).filter(getattr(TaskBase, "project_id") == project_id, getattr(TaskBase, "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.get("/{project_id}/users/{user_id}", response_model=users_schemas.UserBase, tags=["users"])
@router.get("/{project_id}/users/{user_id}", response_model=UserBase, tags=["users"])
def get_project_user(project_id: int, user_id: int, db: db_dependency, request: Request):
"""Get a specific user from a specified project"""
user = get_user_from_jwt(request, db)
@ -80,31 +81,31 @@ def get_project_user(project_id: int, user_id: int, db: db_dependency, request:
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to access this project's users")
db_user = db.query(users_schemas.UserBase).filter(getattr(users_schemas.UserBase, "id") == user_id).first()
db_user = db.query(UserBase).filter(getattr(UserBase, "id") == user_id).first()
if db_user is None or db_user not in db_project.users:
raise HTTPException(status_code=404, detail="User not found in the specified project")
return db_user
@router.get("/{project_id}/tasks", response_model=List[tasks_schemas.TaskBase], tags=["tasks", "projects"])
@router.get("/{project_id}/tasks", response_model=List[TaskBase], tags=["tasks", "projects"])
def get_project_tasks(project_id: int, request:Request, db: db_dependency):
"""Get tasks from a specified project"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to access this project's tasks")
return db.query(tasks_schemas.TaskBase).filter(getattr(tasks_schemas.TaskBase, "project_id") == project_id).all()
return db.query(TaskBase).filter(getattr(TaskBase, "project_id") == project_id).all()
@router.post("/", response_model=projects_schemas.ProjectCreate)
def create_project(project: projects_schemas.ProjectCreate, request:Request, db: db_dependency):
@router.post("/", response_model=ProjectCreate)
def create_project(project: ProjectCreate, request:Request, db: db_dependency):
"""Create a new project"""
user = get_user_from_jwt(request, db)
db_project = projects_schemas.ProjectCreate(
db_project = ProjectCreate(
name=project.name,
description=project.description,
tasks=[],
@ -120,18 +121,18 @@ def create_project(project: projects_schemas.ProjectCreate, request:Request, db:
return db_project
@router.post("/{project_id}/tasks", response_model=projects_tasks_schemas.ProjectTaskCreate, tags=["tasks"])
def create_project_task(project_id: int, task: tasks_schemas.TaskCreate, db: db_dependency, request: Request):
@router.post("/{project_id}/tasks", response_model=ProjectTaskCreate, tags=["tasks"])
def create_project_task(project_id: int, task: TaskCreate, db: db_dependency, request: Request):
"""Create a new task in a specified project"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to add tasks to this project")
db_task = projects_tasks_schemas.ProjectTaskCreate(
db_task = ProjectTaskCreate(
title=task.title,
description=task.description,
status=task.status,
@ -143,37 +144,37 @@ def create_project_task(project_id: int, task: tasks_schemas.TaskCreate, db: db_
db.refresh(db_task)
return db_task
@router.post("/{project_id}/users", response_model=projects_schemas.ProjectAddUsers, tags=["users"])
def add_project_user(project_id: int, user_data: projects_schemas.ProjectAddUsers, db: db_dependency, request: Request):
@router.post("/{project_id}/users", response_model=ProjectAddUsers, tags=["users"])
def add_project_user(project_id: int, user_data: ProjectAddUsers, db: db_dependency, request: Request):
"""Add users to a specified project using their IDs"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to modify this project's users")
for user_id in user_data.user_ids:
db_user = db.query(users_schemas.UserBase).filter(getattr(users_schemas.UserBase, "id") == user_id).first()
db_user = db.query(UserBase).filter(getattr(UserBase, "id") == user_id).first()
if db_user:
db_project.users.append(db_user)
db.commit()
db.refresh(db_project)
return db_project
@router.delete("/{project_id}/users/{user_id}", response_model=projects_schemas.ProjectRemoveUsers, tags=["users"])
@router.delete("/{project_id}/users/{user_id}", response_model=ProjectRemoveUsers, tags=["users"])
def remove_user_from_project(project_id: int, user_id: int, db: db_dependency, request: Request):
"""Remove a user from a specified project using their ID"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to modify this project's users")
db_user = db.query(users_schemas.UserBase).filter(getattr(users_schemas.UserBase, "id") == user_id).first()
db_user = db.query(UserBase).filter(getattr(UserBase, "id") == user_id).first()
if db_user is None or db_user not in db_project.users:
raise HTTPException(status_code=404, detail="User not found in the specified project")
@ -182,18 +183,18 @@ def remove_user_from_project(project_id: int, user_id: int, db: db_dependency, r
db.refresh(db_project)
return db_project
@router.put("/{project_id}/tasks/{task_id}", response_model=tasks_schemas.TaskUpdate, tags=["tasks"])
def update_project_task(project_id: int, task_id: int, task: tasks_schemas.TaskUpdate, db: db_dependency, request: Request):
@router.put("/{project_id}/tasks/{task_id}", response_model=TaskUpdate, tags=["tasks"])
def update_project_task(project_id: int, task_id: int, task: TaskUpdate, db: db_dependency, request: Request):
"""Update a task in a specified project"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to access this project's tasks")
db_task = db.query(tasks_schemas.TaskBase).filter(getattr(tasks_schemas.TaskBase, "project_id") == project_id, getattr(tasks_schemas.TaskBase, "id") == task_id).first()
db_task = db.query(TaskBase).filter(getattr(TaskBase, "project_id") == project_id, getattr(TaskBase, "id") == task_id).first()
if db_task is None:
raise HTTPException(status_code=404, detail="Task not found in the specified project")
if task.title is not None:
@ -206,12 +207,12 @@ def update_project_task(project_id: int, task_id: int, task: tasks_schemas.TaskU
db.refresh(db_task)
return db_task
@router.put("/{project_id}", response_model=projects_schemas.ProjectUpdate)
def update_project(project_id: int, project: projects_schemas.ProjectUpdate, db: db_dependency, request: Request):
@router.put("/{project_id}", response_model=ProjectUpdate)
def update_project(project_id: int, project: ProjectUpdate, db: db_dependency, request: Request):
"""Update a project by ID"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
@ -229,7 +230,7 @@ def delete_project(project_id: int, db: db_dependency, request: Request):
"""Delete a project by ID"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
@ -244,13 +245,13 @@ def delete_project_task(project_id: int, task_id: int, db: db_dependency, reques
"""Delete a task from a specified project"""
user = get_user_from_jwt(request, db)
db_project = db.query(projects_schemas.ProjectBase).filter(getattr(projects_schemas.ProjectBase, "id") == project_id).first()
db_project = db.query(ProjectBase).filter(getattr(ProjectBase, "id") == project_id).first()
if db_project is None:
raise HTTPException(status_code=404, detail="Project not found")
if user not in db_project.users:
raise HTTPException(status_code=403, detail="Not authorized to access this project's tasks")
db_task = db.query(tasks_schemas.TaskBase).filter(getattr(tasks_schemas.TaskBase, "project_id") == project_id, getattr(tasks_schemas.TaskBase, "id") == task_id).first()
db_task = db.query(TaskBase).filter(getattr(TaskBase, "project_id") == project_id, getattr(TaskBase, "id") == task_id).first()
if db_task is None:
raise HTTPException(status_code=404, detail="Task not found in the specified project")
db.delete(db_task)