api-admim/app/routers/router_pessoa.py

212 lines
9.0 KiB
Python

# 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)