import src.forms.exceptions as exceptions import src.forms.service as service from fastapi import APIRouter, Depends, HTTPException, Query from sqlmodel import Session from src import messages, models from src.auth.auth import get_current_user from src.database import get_session router = APIRouter(prefix='/forms') @router.get('', response_model=list[models.FormPublic]) async def get_forms( seasons: list[str] = Query([]), productors: list[str] = Query([]), current_season: bool = False, session: Session = Depends(get_session), ): return service.get_all(session, seasons, productors, current_season) @router.get('/referents', response_model=list[models.FormPublic]) async def get_forms_filtered( seasons: list[str] = Query([]), productors: list[str] = Query([]), current_season: bool = False, session: Session = Depends(get_session), user: models.User = Depends(get_current_user) ): return service.get_all(session, seasons, productors, current_season, user) @router.get('/{_id}', response_model=models.FormPublic) async def get_form( _id: int, session: Session = Depends(get_session) ): result = service.get_one(session, _id) if result is None: raise HTTPException( status_code=404, detail=messages.Messages.not_found('form') ) return result @router.post('', response_model=models.FormPublic) async def create_form( form: models.FormCreate, user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(session, user, form=form): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('forms', 'update') ) try: form = service.create_one(session, form) except exceptions.ProductorNotFoundError as error: raise HTTPException(status_code=404, detail=str(error)) from error except exceptions.UserNotFoundError as error: raise HTTPException(status_code=404, detail=str(error)) from error except exceptions.FormCreateError as error: raise HTTPException(status_code=400, detail=str(error)) from error return form @router.put('/{_id}', response_model=models.FormPublic) async def update_form( _id: int, form: models.FormUpdate, user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(session, user, _id=_id): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('forms', 'update') ) try: result = service.update_one(session, _id, form) except exceptions.FormNotFoundError as error: raise HTTPException(status_code=404, detail=str(error)) from error except exceptions.ProductorNotFoundError as error: raise HTTPException(status_code=404, detail=str(error)) from error except exceptions.UserNotFoundError as error: raise HTTPException(status_code=404, detail=str(error)) from error return result @router.delete('/{_id}', response_model=models.FormPublic) async def delete_form( _id: int, user: models.User = Depends(get_current_user), session: Session = Depends(get_session) ): if not service.is_allowed(session, user, _id=_id): raise HTTPException( status_code=403, detail=messages.Messages.not_allowed('forms', 'delete') ) try: result = service.delete_one(session, _id) except exceptions.FormNotFoundError as error: raise HTTPException(status_code=404, detail=str(error)) from error return result