сделал слои для таблицы проектов
This commit is contained in:
parent
3fbaaf1b45
commit
8c7aa7358d
70
API/app/contollers/projects_router.py
Normal file
70
API/app/contollers/projects_router.py
Normal file
@ -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)
|
||||||
@ -1,6 +1,70 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from fastapi import HTTPException, status
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
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):
|
def __init__(self, db: AsyncSession):
|
||||||
self.projects_repository = ProjectsRepository(db)
|
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
|
||||||
|
|||||||
@ -4,6 +4,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
|||||||
from app.contollers.auth_router import router as auth_router
|
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.profile_photos_router import router as profile_photos_router
|
||||||
from app.contollers.profiles_router import router as profiles_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.register_router import router as register_router
|
||||||
from app.contollers.teams_router import router as team_router
|
from app.contollers.teams_router import router as team_router
|
||||||
from app.contollers.users_router import router as users_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(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(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(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(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(team_router, prefix=f'{settings.PREFIX}/teams', tags=['teams'])
|
||||||
api_app.include_router(users_router, prefix=f'{settings.PREFIX}/users', tags=['users'])
|
api_app.include_router(users_router, prefix=f'{settings.PREFIX}/users', tags=['users'])
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user