diff --git a/routers/projects.py b/routers/projects.py index 38072f5..01a0d0f 100644 --- a/routers/projects.py +++ b/routers/projects.py @@ -5,9 +5,17 @@ from database import db_dependency import schemas.tasks as tasks import schemas.projects as projects +import schemas.users as users router = APIRouter(prefix="/projects", tags=["projects"]) +## +## GET endpoints +## + + +"""Get a project by ID""" + @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() @@ -15,18 +23,38 @@ def read_project(project_id: int, db: db_dependency): raise HTTPException(status_code=404, detail="Project not found") return db_project -@router.get("/{project_id}/tasks", response_model=List[tasks.TaskBase]) +"""Get tasks from a specified project""" +@router.get("/{project_id}/tasks", response_model=List[tasks.TaskBase], tags=["tasks"]) 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) +"""Get a specific task from a specified project""" +@router.get("/{project_id}/tasks/{task_id}", response_model=tasks.TaskBase, tags=["tasks"]) 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 + +"""Get users from a specified project""" + +@router.get("/{project_id}/users", response_model=List[users.UserBase], tags=["users"]) +def read_users_from_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.users + + +## +## POST endpoints +## + + +"""Create a new project""" + @router.post("/", response_model=projects.ProjectCreate) def create_project(project: projects.ProjectCreate, db: db_dependency): db_project = projects.models.Project( @@ -38,7 +66,10 @@ def create_project(project: projects.ProjectCreate, db: db_dependency): db.refresh(db_project) return db_project -@router.post("/{project_id}/tasks", response_model=tasks.TaskBase) + +"""Create a new task in a specified project""" + +@router.post("/{project_id}/tasks", response_model=tasks.TaskBase, tags=["tasks"]) def create_task_in_project(project_id: int, task: tasks.TaskBase, db: db_dependency): db_task = tasks.models.Task( title=task.title, @@ -49,4 +80,102 @@ def create_task_in_project(project_id: int, task: tasks.TaskBase, db: db_depende db.add(db_task) db.commit() db.refresh(db_task) - return db_task \ No newline at end of file + return db_task + + +"""Add users to a specified project using their IDs""" + +@router.post("/{project_id}/users", response_model=projects.ProjectAddUsers, tags=["users"]) +def add_users_to_project(project_id: int, user_data: projects.ProjectAddUsers, 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") + for user_id in user_data.user_ids: + db_user = db.query(users.models.User).filter(users.models.User.id == user_id).first() + if db_user: + db_project.users.append(db_user) + db.commit() + db.refresh(db_project) + return db_project + + +## +## PUT endpoints +## + + +"""Update a project by ID""" + +@router.put("/{project_id}", response_model=projects.ProjectUpdate) +def update_project(project_id: int, project: projects.ProjectUpdate, 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") + if project.name is not None: + db_project.name = project.name + if project.description is not None: + db_project.description = project.description + db.commit() + db.refresh(db_project) + return db_project + + +"""Update a task in a specified project""" + +@router.put("/{project_id}/tasks/{task_id}", response_model=tasks.TaskUpdate, tags=["tasks"]) +def update_task_in_project(project_id: int, task_id: int, task: tasks.TaskUpdate, 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") + if task.title is not None: + db_task.title = task.title + if task.description is not None: + db_task.description = task.description + if task.status is not None: + db_task.status = task.status + db.commit() + db.refresh(db_task) + return db_task + +## +## DELETE endpoints +## + +"""Delete a project by ID""" + +@router.delete("/{project_id}") +def delete_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") + db.delete(db_project) + db.commit() + return {"detail": "Project deleted successfully"} + + +"""Delete a task from a specified project""" + +@router.delete("/{project_id}/tasks/{task_id}" , tags=["tasks"]) +def delete_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") + db.delete(db_task) + db.commit() + return {"detail": "Task deleted successfully"} + + +"""Remove users from a specified project using their IDs""" + +@router.delete("/{project_id}/users/{user_id}", tags=["users"]) +def remove_user_from_project(project_id: int, user_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") + db_user = db.query(users.models.User).filter(users.models.User.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") + db_project.users.remove(db_user) + db.commit() + db.refresh(db_project) + return {"detail": "User removed from project successfully"}