import src.forms.exceptions as exceptions import src.forms.service as service import src.messages as messages from fastapi import APIRouter, Depends, HTTPException, Query from sqlmodel import Session from src import 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