212 lines
9.0 KiB
Python
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)
|