#!/usr/bin/env python3 from pathlib import Path """Grupo de rotas para autenticação.""" from typing import Annotated, Dict, List, Optional from fastapi import APIRouter, Body, Depends, Form, Header from fastapi.exceptions import HTTPException from loguru import logger from baobaxia.api.v2.endpoints.auth import ( PermissionChecker, get_current_mocambola, ) from baobaxia.constants import ROLE_MUCUA_PAJE from baobaxia.exceptions import credentials_exception, username_exists_exception from baobaxia.permissions.model_permissions import * from baobaxia.root import Baobaxia, bbx from baobaxia.saberes import Mocambola, MocambolaIn from baobaxia.util import str_to_hash from baobaxia.utils.auth import verify_password CurrentMocambola = Annotated[Mocambola, Depends(get_current_mocambola)] router = APIRouter(tags=["Mocambolas"]) @router.get( "/mocambola", response_model=List[Mocambola], summary="Listar todes mocambolas", ) async def list_all_mocambolas( bbx: Annotated[Baobaxia, Depends(bbx)], # mocambola: CurrentMocambola, ) -> List[Mocambola]: return bbx.list_mocambolas() @router.get( "/{balaio_slug_smid}/{mucua_slug_smid}/mocambola", response_model=List[Mocambola], summary="Listar mocambolas", ) async def list_mocambolas( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: Optional[str] = None, mucua_slug_smid: Optional[str] = None, # mocambola: CurrentMocambola, ) -> List[Mocambola]: balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) return bbx.list_mocambolas(balaio_smid, mucua_smid) @router.post("/{balaio_slug_smid}/{mucua_slug_smid}/mocambola") async def post_mocambola( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, mocambola_in: MocambolaIn, ) -> Mocambola: balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) mocambola = bbx.get_mocambola( balaio_smid=balaio_smid, mucua_smid=mucua_smid, username=mocambola_in.username, ) if mocambola: raise username_exists_exception data = mocambola_in.model_dump(exclude=("password", "recovery_answer")) mocambola = Mocambola( **data, password_hash=str_to_hash(mocambola_in.password), recovery_answer_hash=str_to_hash(mocambola_in.recovery_answer), ) mocambola.balaio_smid = balaio_smid mocambola.mucua_smid = mucua_smid return bbx.put_mocambola( balaio_smid=balaio_smid, mucua_smid=mucua_smid, mocambola=mocambola, ) @router.get( "/{balaio_slug_smid}/{mucua_slug_smid}/mocambola/{username}", response_model=Mocambola, summary="Retornar um mocambola", ) async def get_mocambola( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, username: str, ): balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) return bbx.get_mocambola( balaio_smid=balaio_smid, mucua_smid=mucua_smid, username=username ) @router.put( "/{balaio_slug_smid}/{mucua_slug_smid}/mocambola/{username}", response_model=Mocambola, summary="Atualizar um mocambola", ) async def put_mocambola( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, mocambola: CurrentMocambola, ): balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) return bbx.put_mocambola(balaio_smid, mucua_smid, mocambola) @router.delete("/{balaio_slug_smid}/{mucua_slug_smid}/mocambola/{username}") async def del_mocambola( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, username: str, mocambola: CurrentMocambola, ) -> Dict: balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) bbx.baobaxia.del_mocambola(balaio_smid, mucua_smid, username, mocambola) return {"detail": "success"} @router.post( "/{balaio_slug_smid}/{mucua_slug_smid}/mocambola/add_balaio", ) async def add_mocambola_balaio( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, novo_balaio_slug_smid: str, username: str, mocambola: CurrentMocambola, ): """Adicionar mocambola no balaio""" balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) novo_balaio_smid = bbx.extract_smid(balaio_slug_smid=novo_balaio_slug_smid) return bbx.add_mocambola_balaio( balaio_smid, mucua_smid, novo_balaio_smid, username, mocambola ) @router.post( "/{balaio_slug_smid}/{mucua_slug_smid}/mocambola/password", ) async def set_password( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, mocambola: CurrentMocambola, new_password: str = Body(...), recovery_answer: str = Body(default=None), ): """Atualiza a senha do mocambola autenticado.""" balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) return bbx.set_password( balaio_smid=balaio_smid, mucua_smid=mucua_smid, new_password=new_password, recovery_answer=recovery_answer, mocambola=mocambola, ) @router.post( "/{balaio_slug_smid}/{mucua_slug_smid}/mocambola/recover", ) async def recover_mocambola( bbx: Annotated[Baobaxia, Depends(bbx)], balaio_slug_smid: str, mucua_slug_smid: str, username: str = Body(...), recovery_answer: str = Body(default=None), new_password: str = Body(...), ): """Atualiza a senha do mocambola autenticado.""" balaio_smid, mucua_smid = bbx.extract_smid( balaio_slug_smid=balaio_slug_smid, mucua_slug_smid=mucua_slug_smid ) mocambola = bbx.get_full_mocambola( username=username, balaio_smid=balaio_smid, mucua_smid=mucua_smid ) logger.debug(f"END - recover: {mocambola}") logger.debug( f"Mocambola recovery_answer_hash {mocambola.recovery_answer_hash}" ) logger.debug(f"Mocambola answer_hash {str_to_hash(recovery_answer)}") if verify_password(recovery_answer, mocambola.recovery_answer_hash): return bbx.set_password( balaio_smid=balaio_smid, mucua_smid=mucua_smid, new_password=new_password, recovery_answer=recovery_answer, mocambola=mocambola, ) else: raise credentials_exception