# Importações de bibliotecas padrão from typing import Union, Annotated, List, Any, Sequence # Importações de bibliotecas de terceiros from fastapi import APIRouter, Depends from starlette import status from sqlalchemy import Row, RowMapping # Importações do seu próprio projeto from app.database.RelationalTableRepository import RelationalTableRepository from app.database.models import RbacUser from app.rbac.permissions import verify_permissions from app.schemas import pessoa_schemas from starlette.responses import Response from app.routers.dependencies import get_repository from app.database import models as db_models from app.config import COLUNA # Variáveis comuns FILE_SCHEMA = pessoa_schemas PAYLOAD_PJ = FILE_SCHEMA.JuridicaCreate PAYLOAD_PF = FILE_SCHEMA.FisicaCreate UPDATE_REQUEST_SCHEMA_PJ = FILE_SCHEMA.PessoaJuridicaUpdate UPDATE_REQUEST_SCHEMA_PF = FILE_SCHEMA.PessoaFisicaUpdate ID_REQUEST_SCHEMA = FILE_SCHEMA.IdRequestPessoa IDS_REQUEST_SCHEMA = FILE_SCHEMA.IdsRequestPessoas RESPONSE_SCHEMA_PJ = FILE_SCHEMA.RequestPJ RESPONSE_SCHEMA_PF = FILE_SCHEMA.RequestPF RESPONSE_SCHEMA_PESSOA = FILE_SCHEMA.RequestPessoa VALIDA_GET_ALL = FILE_SCHEMA.ValidaGetAll DB_MODEL_PJ = db_models.ComercialJuridica DB_MODEL_PF = db_models.ComercialFisica DB_MODEL_ENDERECO = db_models.ComercialEndereco DB_MODEL_PESSOA = db_models.ComercialPessoa DB_MODEL_TIPO_ENDERECO = db_models.ComercialTipoEndereco DB_MODEL_RELACAO_COMERCIAL = db_models.ComercialRelacaoComercial DB_MODEL_PESSOA_POLY = db_models.PESSOA_POLY ROTA_PREFIX = "/api/pessoa" ROTA_TAGS = "Cadastro Pessoa" MENSAGEM_ERRO = "Erro ao consulta pessoa" MENSAGEM_SUCESSO = "Pessoa deletada com sucesso" # Variáveis tabelas Relacionadas related_info_append = [ {"key": "rc", "related_model": DB_MODEL_RELACAO_COMERCIAL, "foreign_key_field": "uuid"}, # outros relacionamentos que precisam de append ] related_info_add = [ { "key": 'enderecos', "foreign_key": "fk_pessoa_uuid", "related_model": DB_MODEL_ENDERECO, "relations": [ {"related_model_fk": DB_MODEL_TIPO_ENDERECO, "foreign_key_fk": "fk_tipo_endereco_uuid"} ] }, # outros relacionamentos que precisam de add ] PjRepository = Annotated[ RelationalTableRepository[DB_MODEL_PJ], Depends(get_repository(DB_MODEL_PJ, RelationalTableRepository)) ] PfRepository = Annotated[ RelationalTableRepository[DB_MODEL_PF], Depends(get_repository(DB_MODEL_PF, RelationalTableRepository)) ] PessoaPolyRepository = Annotated[ RelationalTableRepository[DB_MODEL_PESSOA_POLY], Depends(get_repository(DB_MODEL_PESSOA_POLY, RelationalTableRepository)) ] PessoaRepository = Annotated[ RelationalTableRepository[DB_MODEL_PESSOA], Depends(get_repository(DB_MODEL_PESSOA, RelationalTableRepository)) ] # RelacaoComercialRepository = Annotated[ # RelationalTableRepository[DB_MODEL_RELACAO_COMERCIAL], # Depends(get_repository(DB_MODEL_RELACAO_COMERCIAL, RelationalTableRepository)) # ] # # TipoEnderecoRepository = Annotated[ # RelationalTableRepository[DB_MODEL_TIPO_ENDERECO], # Depends(get_repository(DB_MODEL_TIPO_ENDERECO, RelationalTableRepository)) # ] router = APIRouter( prefix=ROTA_PREFIX, tags=[ROTA_TAGS], responses={404: {"description": "Not found"}}, ) @router.post("/add_one", status_code=201, response_model=RESPONSE_SCHEMA_PESSOA) async def create_one(data: Union[PAYLOAD_PJ, PAYLOAD_PF], repository_pj: PjRepository, repository_pf: PfRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 401]))): if isinstance(data, PAYLOAD_PJ): pessoa = await repository_pj.create(data_one=data, db_data=DB_MODEL_PJ, related_info_add=related_info_add, related_info_append=related_info_append) return pessoa elif isinstance(data, PAYLOAD_PF): pessoa = await repository_pf.create(data_one=data, db_data=DB_MODEL_PF, related_info_add=related_info_add, related_info_append=related_info_append) return pessoa @router.post("/add_many", status_code=status.HTTP_201_CREATED, response_model=list[RESPONSE_SCHEMA_PESSOA]) async def create_many(datas: List[Union[PAYLOAD_PJ, PAYLOAD_PF]], repository_pj: PjRepository, repository_pf: PfRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 402]))): # Separando dados em listas de pessoas jurídicas e físicas data_pj = [data for data in datas if isinstance(data, PAYLOAD_PJ)] data_pf = [data for data in datas if isinstance(data, PAYLOAD_PF)] pessoas_fisicas_dto = [] pessoas_juridicas_dto = [] # Criando pessoas físicas if data_pf: pessoas_fisicas = await repository_pf.create_many(data=data_pf, return_models=True, db_data=DB_MODEL_PF, related_info_add=related_info_add, related_info_append=related_info_append) pessoas_fisicas_dto = [RESPONSE_SCHEMA_PF.model_validate(pf, from_attributes=True) for pf in pessoas_fisicas] # Criando pessoas jurídicas if data_pj: pessoas_juridicas = await repository_pj.create_many(data=data_pj, return_models=True, db_data=DB_MODEL_PJ, related_info_add=related_info_add, related_info_append=related_info_append) pessoas_juridicas_dto = [RESPONSE_SCHEMA_PJ.model_validate(pj, from_attributes=True) for pj in pessoas_juridicas] resultado = pessoas_fisicas_dto + pessoas_juridicas_dto return resultado @router.post("/get_all", status_code=status.HTTP_200_OK, response_model=list[RESPONSE_SCHEMA_PESSOA]) async def get_all(repository: PessoaPolyRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 403]))) -> ( Sequence)[Row[Any] | RowMapping | Any]: resultado = await repository.get_many_by_ids(coluna=COLUNA) return resultado # Testado ok @router.post("/get_many", status_code=status.HTTP_200_OK, response_model=List[RESPONSE_SCHEMA_PESSOA]) async def get_many(data: IDS_REQUEST_SCHEMA, repository: PessoaPolyRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 404])) ) -> Sequence[Row[Any] | RowMapping | Any]: resultado = await repository.get_many_by_ids(uuids=data.uuids, coluna=COLUNA) return resultado # Testado ok @router.post("/get_one", status_code=status.HTTP_200_OK, response_model=RESPONSE_SCHEMA_PESSOA) async def get_one(data: ID_REQUEST_SCHEMA, repository: PessoaPolyRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 405])) ) -> RESPONSE_SCHEMA_PESSOA: resultado = await repository.get_one_by_id(uuid=data.uuid, coluna=COLUNA) return resultado @router.put("/update_one", status_code=status.HTTP_201_CREATED, response_model=RESPONSE_SCHEMA_PESSOA) async def update_one(data: Union[UPDATE_REQUEST_SCHEMA_PJ, UPDATE_REQUEST_SCHEMA_PF], repository_pj: PjRepository, repository_pf: PfRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 406]))): if isinstance(data, UPDATE_REQUEST_SCHEMA_PJ): resultado = await repository_pj.update_by_id(update=data, coluna=COLUNA, db_data=DB_MODEL_PJ, related_info_add=related_info_add, related_info_append=related_info_append) return resultado elif isinstance(data, UPDATE_REQUEST_SCHEMA_PF): resultado = await repository_pf.update_by_id(update=data, coluna=COLUNA, db_data=DB_MODEL_PF, related_info_add=related_info_add, related_info_append=related_info_append) return resultado @router.delete("/delete_one", status_code=status.HTTP_204_NO_CONTENT) async def delete_one(data: ID_REQUEST_SCHEMA, repository: PessoaRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 408]))) -> Response: await repository.remove_by_id(uuid=data.uuid, coluna=COLUNA) return Response(status_code=status.HTTP_204_NO_CONTENT) @router.delete("/delete_many", status_code=status.HTTP_204_NO_CONTENT) async def delete_many(data: IDS_REQUEST_SCHEMA, repository: PessoaRepository, _user: RbacUser = Depends(verify_permissions([1, 2, 33, 409]))) -> Response: await repository.remove_many_by_ids(uuids=data.uuids, coluna=COLUNA) return Response(status_code=status.HTTP_204_NO_CONTENT)