from typing import Any from fastapi import APIRouter, HTTPException, status from sqlmodel import func, select from app.api.deps import CurrentUser, SessionDep from app.models.base import ( ApiTags, Message, RowId, ) from app.models.serie import ( Serie, SerieCreate, SerieUpdate, SeriePublic, SeriesPublic, ) from app.models.division import ( Division, DivisionsPublic, ) from app.models.user import ( PermissionModule, PermissionPart, PermissionRight, ) router = APIRouter(prefix="/series", tags=[ApiTags.SERIES]) # region # Series ######################################################## @router.get("/", response_model=SeriesPublic) def read_series( session: SessionDep, current_user: CurrentUser, skip: int = 0, limit: int = 100 ) -> Any: """ Retrieve all series. """ if current_user.has_permissions( module=PermissionModule.SERIE, part=PermissionPart.ADMIN, rights=PermissionRight.READ, ): count_statement = select(func.count()).select_from(Serie) count = session.exec(count_statement).one() statement = select(Serie).offset(skip).limit(limit) series = session.exec(statement).all() return SeriesPublic(data=series, count=count) return SeriesPublic(data=[], count=0) @router.get("/{id}", response_model=SeriePublic) def read_serie(session: SessionDep, current_user: CurrentUser, id: RowId) -> Any: """ Get serie by ID. """ serie = session.get(Serie, id) if not serie: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Serie not found") if not current_user.has_permissions( module=PermissionModule.SERIE, part=PermissionPart.ADMIN, rights=PermissionRight.READ, ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions") return serie @router.post("/", response_model=SeriePublic) def create_serie( *, session: SessionDep, current_user: CurrentUser, serie_in: SerieCreate ) -> Any: """ Create new serie. """ if not current_user.has_permissions( module=PermissionModule.SERIE, part=PermissionPart.ADMIN, rights=PermissionRight.CREATE, ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions") serie = Serie.create(create_obj=serie_in, session=session) return serie @router.put("/{id}", response_model=SeriePublic) def update_serie( *, session: SessionDep, current_user: CurrentUser, id: RowId, serie_in: SerieUpdate ) -> Any: """ Update a serie. """ serie = session.get(Serie, id) if not serie: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Serie not found") if not current_user.has_permissions( module=PermissionModule.SERIE, part=PermissionPart.ADMIN, rights=PermissionRight.UPDATE, ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions") serie = Serie.update(db_obj=serie, in_obj=serie_in, session=session) return serie @router.delete("/{id}") def delete_serie(session: SessionDep,current_user: CurrentUser, id: RowId) -> Message: """ Delete a serie. """ serie = session.get(Serie, id) if not serie: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Serie not found") if not current_user.has_permissions( module=PermissionModule.SERIE, part=PermissionPart.ADMIN, rights=PermissionRight.DELETE, ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions") session.delete(serie) session.commit() return Message(message="Serie deleted successfully") # endregion # region # Series / Divisions ############################################ @router.get("/{series_id}/divisions/", response_model=DivisionsPublic) def read_serie_division( session: SessionDep, current_user: CurrentUser, series_id: RowId, skip: int = 0, limit: int = 100 ) -> Any: """ Retrieve all serie divisions. """ serie = session.get(Serie, series_id) if not serie: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Serie not found") if not current_user.has_permission( module=PermissionModule.SERIE, part=PermissionPart.ADMIN, rights=(PermissionRight.MANAGE_DIVISIONS | PermissionRight.READ), ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not enough permissions") count_statement = (select(func.count()) .select_from(Division) .where(Division.serie_id == serie.id) ) count = session.exec(count_statement).one() statement = (select(Division) .where(Division.serie_id == serie.id) .offset(skip) .limit(limit) ) divisions = session.exec(statement).all() return DivisionsPublic(data=divisions, count=count) # endregion