diff --git a/main.py b/main.py index da64346..ba3776f 100644 --- a/main.py +++ b/main.py @@ -28,13 +28,6 @@ It allows users to manage projects, tasks, and user assignments with proper auth ## Source Code The source code for this API can be found on [GitHub](https://github.com/a-mayb3/Kanban_clone_backend) or [my forgejo instance](https://git.vollex.cc/a-mayb3/Kanban_clone_backend). - -## Other projects -Here are some frontend implementations for this API: -- [KanbanCloneAngular](https://github.com/a-mayb3/KanbanCloneAngular) - Angular frontend -- [KanbanCloneAndroid](https://github.com/a-mayb3/KanbanCloneAndroid) - Android frontend - - """ global_logger = logging.getLogger() diff --git a/routers/me.py b/routers/me.py index b5cd2b3..44f78fe 100644 --- a/routers/me.py +++ b/routers/me.py @@ -4,15 +4,12 @@ from jose import JWTError, jwt import models from routers import auth - -from schemas.users import UserBase -from schemas.projects import ProjectBase -from schemas.projects_users import ProjectUserBase - +import schemas.users as user_schemas +import schemas.projects_users as projects_users_schemas router = APIRouter(prefix="/me", tags=["me"]) -@router.get("/", response_model=ProjectUserBase, tags=["me", "users"]) +@router.get("/", response_model=projects_users_schemas.ProjectUserBase, tags=["me", "users"]) def get_me(request: Request, db: db_dependency): """Get current authenticated user""" user = auth.get_user_from_jwt(request, db) diff --git a/routers/projects.py b/routers/projects.py index fc87a81..be25752 100644 --- a/routers/projects.py +++ b/routers/projects.py @@ -4,7 +4,7 @@ from typing import List, Annotated from database import db_dependency from schemas.tasks import TaskBase, TaskCreate, TaskUpdate -from schemas.projects import ProjectBase, ProjectCreate, ProjectUpdate, ProjectAddUser, ProjectRemoveUsers, ProjectFull +from schemas.projects import ProjectBase, ProjectCreate, ProjectUpdate, ProjectAddUsers, ProjectRemoveUsers, ProjectFull from schemas.users import UserBase from schemas.projects_users import ProjectUserBase from schemas.projects_tasks import ProjectTaskBase, ProjectTaskCreate @@ -80,7 +80,7 @@ def get_project_user(project_id: int, user_id: int, db: db_dependency, request: db_project : ProjectBase = get_project_by_id_for_user(user, project_id, db) - db_user = db.query(User).filter(User.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 @@ -91,7 +91,7 @@ def get_project_tasks(project_id: int, request:Request, db: db_dependency): user = get_user_from_jwt(request, db) db_project = get_project_by_id_for_user(user, project_id, db) - db_tasks = db.query(Task).filter(Task.project_id == project_id).all() + db_tasks = db.query(TaskBase).filter(getattr(TaskBase, "project_id") == project_id).all() return db_tasks @router.post("/", response_model=ProjectCreate) @@ -115,14 +115,14 @@ def create_project(project: ProjectCreate, request:Request, db: db_dependency): return db_project -@router.post("/{project_id}/tasks", response_model=ProjectTaskBase, tags=["tasks"]) +@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 = get_project_by_id_for_user(user, project_id, db) - db_task = Task( + db_task = ProjectTaskCreate( title=task.title, description=task.description, status=task.status, @@ -134,22 +134,17 @@ def create_project_task(project_id: int, task: TaskCreate, db: db_dependency, re db.refresh(db_task) return db_task -@router.post("/{project_id}/users", response_model=ProjectFull, tags=["users"]) -def add_project_user(project_id: int, user_data: ProjectAddUser, db: db_dependency, request: Request): - """Add a user to a specified project using their email address""" +@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 = get_project_by_id_for_user(user, project_id, db) - db_user = db.query(User).filter(User.email == user_data.user_email).first() - - if not db_user: - raise HTTPException(status_code=404, detail="User with the specified email not found") - - if db_user not in db_project.users: - db_project.users.append(db_user) - else: - raise HTTPException(status_code=400, detail="User is already a member of the project") - + for user_id in user_data.user_ids: + 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 @@ -161,7 +156,7 @@ def remove_user_from_project(project_id: int, user_id: int, db: db_dependency, r db_project = get_project_by_id_for_user(user, project_id, db) - db_user = db.query(User).filter(User.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") diff --git a/schemas/projects.py b/schemas/projects.py index 28c2ad4..592cea8 100644 --- a/schemas/projects.py +++ b/schemas/projects.py @@ -26,9 +26,6 @@ class ProjectUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None -class ProjectAddUser(BaseModel): - user_email: str - class ProjectAddUsers(BaseModel): user_ids: List[int] = [] diff --git a/schemas/projects_users.py b/schemas/projects_users.py index 36c74fd..4ea25a2 100644 --- a/schemas/projects_users.py +++ b/schemas/projects_users.py @@ -1,11 +1,10 @@ from typing import List from pydantic import ConfigDict -from schemas.projects import ProjectFull +from schemas.projects import ProjectBase from schemas.users import UserBase class ProjectUserBase(UserBase): model_config = ConfigDict(from_attributes=True) - projects: List[ProjectFull] - \ No newline at end of file + projects: List[ProjectBase]