diff --git a/API/app/contollers/projects_router.py b/API/app/contollers/projects_router.py new file mode 100644 index 0000000..3979ded --- /dev/null +++ b/API/app/contollers/projects_router.py @@ -0,0 +1,70 @@ +from typing import Optional + +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession + +from app.database.session import get_db +from app.domain.entities.project import ProjectEntity +from app.infrastructure.dependencies import require_admin +from app.infrastructure.projects_service import ProjectsService + +router = APIRouter() + + +@router.get( + '/', + response_model=list[ProjectEntity], + summary='Get all projects', + description='Returns all projects', +) +async def get_all_projects( + db: AsyncSession = Depends(get_db), +): + projects_service = ProjectsService(db) + return await projects_service.get_all_projects() + + +@router.post( + '/', + response_model=Optional[ProjectEntity], + summary='Create a new project', + description='Creates a new project', +) +async def create_project( + project: ProjectEntity, + db: AsyncSession = Depends(get_db), + user=Depends(require_admin), +): + projects_service = ProjectsService(db) + return await projects_service.create_project(project) + + +@router.put( + '/{project_id}/', + response_model=Optional[ProjectEntity], + summary='Update a project', + description='Updates a project', +) +async def update_project( + project_id: int, + project: ProjectEntity, + db: AsyncSession = Depends(get_db), + user=Depends(require_admin), +): + projects_service = ProjectsService(db) + return await projects_service.update_project(project_id, project) + + +@router.delete( + '/{project_id}/', + response_model=Optional[ProjectEntity], + summary='Delete a project', + description='Delete a project', +) +async def delete_project( + project_id: int, + db: AsyncSession = Depends(get_db), + user=Depends(require_admin), +): + projects_service = ProjectsService(db) + return await projects_service.delete_project(project_id) diff --git a/API/app/infrastructure/projects_service.py b/API/app/infrastructure/projects_service.py index b1e71ff..14ffa50 100644 --- a/API/app/infrastructure/projects_service.py +++ b/API/app/infrastructure/projects_service.py @@ -1,6 +1,70 @@ +from typing import Optional + +from fastapi import HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession +from app.application.projects_repository import ProjectsRepository +from app.domain.entities.project import ProjectEntity +from app.domain.models import Project -class ProjectsRepository: + +class ProjectsService: def __init__(self, db: AsyncSession): self.projects_repository = ProjectsRepository(db) + + async def get_all_projects(self) -> list[ProjectEntity]: + projects = await self.projects_repository.get_all() + return [ + self.model_to_entity(project) + for project in projects + ] + + async def create_project(self, project: ProjectEntity) -> Optional[ProjectEntity]: + project_model = self.entity_to_model(project) + + await self.projects_repository.create(project_model) + + return self.model_to_entity(project_model) + + async def update_project(self, project_id: int, project: ProjectEntity) -> Optional[ProjectEntity]: + project_model = await self.projects_repository.get_by_id(project_id) + + if not project_model: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found") + + project_model.description = project.description + project_model.repository_url = project.repository_url + + await self.projects_repository.update(project_model) + + return self.model_to_entity(project_model) + + async def delete_project(self, project_id: int) -> Optional[ProjectEntity]: + project_model = await self.projects_repository.get_by_id(project_id) + + if not project_model: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found") + + result = await self.projects_repository.delete(project_model) + + return self.model_to_entity(result) + + @staticmethod + def model_to_entity(project_model: Project) -> ProjectEntity: + return ProjectEntity( + id=project_model.id, + description=project_model.description, + repository_url=project_model.repository_url, + ) + + @staticmethod + def entity_to_model(project_entity: ProjectEntity) -> Project: + project_model = Project( + description=project_entity.description, + repository_url=project_entity.repository_url, + ) + + if project_entity.id: + project_model.id = project_entity.id + + return project_model diff --git a/API/app/main.py b/API/app/main.py index 8d351b0..a5d3528 100644 --- a/API/app/main.py +++ b/API/app/main.py @@ -4,6 +4,7 @@ from fastapi.middleware.cors import CORSMiddleware from app.contollers.auth_router import router as auth_router from app.contollers.profile_photos_router import router as profile_photos_router from app.contollers.profiles_router import router as profiles_router +from app.contollers.projects_router import router as projects_router from app.contollers.register_router import router as register_router from app.contollers.teams_router import router as team_router from app.contollers.users_router import router as users_router @@ -24,6 +25,7 @@ def start_app(): api_app.include_router(auth_router, prefix=f'{settings.PREFIX}/auth', tags=['auth']) api_app.include_router(profile_photos_router, prefix=f'{settings.PREFIX}/profile_photos', tags=['profile_photos_router']) api_app.include_router(profiles_router, prefix=f'{settings.PREFIX}/profiles', tags=['profiles']) + api_app.include_router(projects_router, prefix=f'{settings.PREFIX}/projects', tags=['projects']) api_app.include_router(register_router, prefix=f'{settings.PREFIX}/register', tags=['register']) api_app.include_router(team_router, prefix=f'{settings.PREFIX}/teams', tags=['teams']) api_app.include_router(users_router, prefix=f'{settings.PREFIX}/users', tags=['users'])