From 65108ad8aaeac771e505c5ba902638eb59b408d5 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Fri, 19 Sep 2025 12:18:10 -0300 Subject: [PATCH] [MVPTN-8] feat(CRUD): CRUD completo para a tabela g_tb_bairro --- Orius.postman_collection.json | 760 ++++++++++++++++++ .../g_tb_bairro/g_tb_bairro_delete_action.py | 26 + .../g_tb_bairro_get_by_descricao_action.py | 29 + .../g_tb_bairro/g_tb_bairro_index_action.py | 24 + .../g_tb_bairro/g_tb_bairro_save_action.py | 28 + .../g_tb_bairro/g_tb_bairro_show_action.py | 28 + .../g_tb_bairro/g_tb_bairro_update_action.py | 26 + .../controllers/g_tb_bairro_controller.py | 114 +++ .../endpoints/g_tb_bairro_endpoint.py | 108 +++ .../g_tb_bairro_delete_repository.py | 41 + ...g_tb_bairro_get_by_descricao_repository.py | 29 + .../g_tb_bairro_index_repository.py | 23 + .../g_tb_bairro_save_repository.py | 56 ++ .../g_tb_bairro_show_repository.py | 46 ++ .../g_tb_bairro_update_repository.py | 53 ++ .../schemas/g_tb_bairro_schema.py | 102 +++ .../go/g_tb_bairro_delete_service.py | 27 + .../go/g_tb_bairro_get_descricao_service.py | 38 + .../go/g_tb_bairro_index_service.py | 32 + .../go/g_tb_bairro_save_service.py | 70 ++ .../go/g_tb_bairro_show_service.py | 35 + .../go/g_tb_bairro_update_service.py | 24 + packages/v1/api.py | 7 + 23 files changed, 1726 insertions(+) create mode 100644 packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_delete_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_get_by_descricao_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_index_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_save_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_show_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_update_action.py create mode 100644 packages/v1/administrativo/controllers/g_tb_bairro_controller.py create mode 100644 packages/v1/administrativo/endpoints/g_tb_bairro_endpoint.py create mode 100644 packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_delete_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_get_by_descricao_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_index_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_save_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_show_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_update_repository.py create mode 100644 packages/v1/administrativo/schemas/g_tb_bairro_schema.py create mode 100644 packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_delete_service.py create mode 100644 packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_get_descricao_service.py create mode 100644 packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_index_service.py create mode 100644 packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_save_service.py create mode 100644 packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_show_service.py create mode 100644 packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_update_service.py diff --git a/Orius.postman_collection.json b/Orius.postman_collection.json index d2b89c5..ba3fd15 100644 --- a/Orius.postman_collection.json +++ b/Orius.postman_collection.json @@ -3415,6 +3415,758 @@ } ] }, + { + "name": "CENSEC - Qualidade", + "item": [ + { + "name": "GET", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{BaseUrlV1}}administrativo/t_censec_qualidade", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "t_censec_qualidade" + ] + } + }, + "response": [] + }, + { + "name": "POST", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const response = pm.response.json();\r", + "\r", + "// Salvando em variáveis da *collection*\r", + "pm.collectionVariables.set(\"censecQualidadeId\", response.data.censec_qualidade_id);\r", + "\r", + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"descricao\": \"{{$randomFullName}}\",\r\n \"situacao\": \"{{status}}\",\r\n \"aceita_cnpj\": \"{{useEmail}}\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/t_censec_qualidade", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "t_censec_qualidade" + ] + } + }, + "response": [] + }, + { + "name": "GET DESCRIÇÃO", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [] + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/t_censec_qualidade/descricao?descricao=OUTORGANTE", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "t_censec_qualidade", + "descricao" + ], + "query": [ + { + "key": "descricao", + "value": "OUTORGANTE" + } + ] + } + }, + "response": [] + }, + { + "name": "GET ID", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{BaseUrlV1}}administrativo/t_censec_qualidade/{{censecQualidadeId}}", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "t_censec_qualidade", + "{{censecQualidadeId}}" + ] + } + }, + "response": [] + }, + { + "name": "PUT", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"descricao\": \"{{$randomFullName}}\",\r\n \"situacao\": \"{{status}}\",\r\n \"aceita_cnpj\": \"{{useEmail}}\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/t_censec_qualidade/{{censecQualidadeId}}", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "t_censec_qualidade", + "{{censecQualidadeId}}" + ] + } + }, + "response": [] + }, + { + "name": "DELETE", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/t_censec_qualidade/{{censecQualidadeId}}", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "t_censec_qualidade", + "{{censecQualidadeId}}" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "CENSEC - Bairro", + "item": [ + { + "name": "GET", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{BaseUrlV1}}administrativo/g_tb_bairro", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "g_tb_bairro" + ] + } + }, + "response": [] + }, + { + "name": "POST", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const response = pm.response.json();\r", + "\r", + "// Salvando em variáveis da *collection*\r", + "pm.collectionVariables.set(\"tbBairroId\", response.data.tb_bairro_id);\r", + "\r", + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"descricao\": \"{{$randomFullName}}\",\r\n \"situacao\": \"{{status}}\",\r\n \"sistema_id\": {{sistemaId}}\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/g_tb_bairro", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "g_tb_bairro" + ] + } + }, + "response": [] + }, + { + "name": "GET DESCRIÇÃO", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "urlencoded", + "urlencoded": [] + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/g_tb_bairro/descricao?descricao=BAIRRO PRIMAVERA II", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "g_tb_bairro", + "descricao" + ], + "query": [ + { + "key": "descricao", + "value": "BAIRRO PRIMAVERA II" + } + ] + } + }, + "response": [] + }, + { + "name": "GET ID", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{BaseUrlV1}}administrativo/g_tb_bairro/{{tbBairroId}}", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "g_tb_bairro", + "{{tbBairroId}}" + ] + } + }, + "response": [] + }, + { + "name": "PUT", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"descricao\": \"{{$randomFullName}}\",\r\n \"situacao\": \"{{status}}\",\r\n \"sistema_id\": {{sistemaId}}\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/g_tb_bairro/{{tbBairroId}}", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "g_tb_bairro", + "{{tbBairroId}}" + ] + } + }, + "response": [] + }, + { + "name": "DELETE", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code é 201 ou 200\", function () {\r", + " pm.expect(pm.response.code).to.be.oneOf([200, 201]);\r", + "});\r", + "\r", + "pm.test(\"Resposta contém ID ou confirmação\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData).to.have.any.keys(\"id\", \"message\", \"status\");\r", + "});\r", + "\r", + "pm.test(\"Mensagem indica sucesso\", function () {\r", + " const jsonData = pm.response.json();\r", + " pm.expect(jsonData.message || \"\").to.match(/sucesso|criado|registrado/i);\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{BearerToken}}", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BaseUrlV1}}administrativo/g_tb_bairro/{{tbBairroId}}", + "host": [ + "{{BaseUrlV1}}administrativo" + ], + "path": [ + "g_tb_bairro", + "{{tbBairroId}}" + ] + } + }, + "response": [] + } + ] + }, { "name": "CENSEC - Natureza Litigio", "item": [ @@ -4768,6 +5520,14 @@ }, { "key": "censecNaturezaLitigioId", + "value": "" + }, + { + "key": "censecQualidadeId", + "value": "" + }, + { + "key": "tbBairroId", "value": "", "type": "default" } diff --git a/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_delete_action.py b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_delete_action.py new file mode 100644 index 0000000..2275a17 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_delete_action.py @@ -0,0 +1,26 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroIdSchema +from packages.v1.administrativo.repositories.g_tb_bairro.g_tb_bairro_delete_repository import DeleteRepository + + +class DeleteAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de exclusão de um registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroIdSchema): + """ + Executa a operação de exclusão no banco de dados. + + Args: + bairro_schema (GTbBairroIdSchema): O esquema com o ID a ser excluído. + + Returns: + O resultado da operação de exclusão. + """ + # Instanciamento do repositório + delete_repository = DeleteRepository() + + # Execução do repositório + return delete_repository.execute(bairro_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_get_by_descricao_action.py b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_get_by_descricao_action.py new file mode 100644 index 0000000..d4bd14d --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_get_by_descricao_action.py @@ -0,0 +1,29 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroDescricaoSchema +from packages.v1.administrativo.repositories.g_tb_bairro.g_tb_bairro_get_by_descricao_repository import GetByDescricaoRepository + + +class GetByDescricaoAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de busca de um registro na tabela g_tb_bairro por descrição. + """ + + def execute(self, bairro_schema: GTbBairroDescricaoSchema): + """ + Executa a operação de busca no banco de dados. + + Args: + bairro_schema (GTbBairroDescricaoSchema): O esquema com a descrição a ser buscada. + + Returns: + O registro encontrado ou None. + """ + # Instanciamento do repositório + show_repository = GetByDescricaoRepository() + + # Execução do repositório + response = show_repository.execute(bairro_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_index_action.py b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_index_action.py new file mode 100644 index 0000000..c1c4cb4 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_index_action.py @@ -0,0 +1,24 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.repositories.g_tb_bairro.g_tb_bairro_index_repository import IndexRepository + +class IndexAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de listagem de todos os registros na tabela g_tb_bairro. + """ + + def execute(self): + """ + Executa a operação de listagem no banco de dados. + + Returns: + A lista de todos os registros. + """ + # Instanciamento do repositório + index_repository = IndexRepository() + + # Execução do repositório + response = index_repository.execute() + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_save_action.py b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_save_action.py new file mode 100644 index 0000000..f1df840 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_save_action.py @@ -0,0 +1,28 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroSaveSchema +from packages.v1.administrativo.repositories.g_tb_bairro.g_tb_bairro_save_repository import SaveRepository + +class SaveAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de salvar um novo registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroSaveSchema): + """ + Executa a operação de salvamento. + + Args: + bairro_schema (GTbBairroSaveSchema): O esquema com os dados a serem salvos. + + Returns: + O resultado da operação de salvamento. + """ + # Instanciamento do repositório + save_repository = SaveRepository() + + # Execução do repositório + response = save_repository.execute(bairro_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_show_action.py b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_show_action.py new file mode 100644 index 0000000..61d54c9 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_show_action.py @@ -0,0 +1,28 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroIdSchema +from packages.v1.administrativo.repositories.g_tb_bairro.g_tb_bairro_show_repository import ShowRepository + +class ShowAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a exibição + de um registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroIdSchema): + """ + Executa a operação de exibição. + + Args: + bairro_schema (GTbBairroIdSchema): O esquema com o ID do registro a ser exibido. + + Returns: + O resultado da operação de exibição. + """ + # Instânciamento do repositório + show_repository = ShowRepository() + + # Execução do repositório + response = show_repository.execute(bairro_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_update_action.py b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_update_action.py new file mode 100644 index 0000000..5ace2d7 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_bairro/g_tb_bairro_update_action.py @@ -0,0 +1,26 @@ +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroUpdateSchema +from packages.v1.administrativo.repositories.g_tb_bairro.g_tb_bairro_update_repository import UpdateRepository + + +class UpdateAction: + """ + Service responsável por encapsular a lógica de negócio para a atualização + de um registro na tabela g_tb_bairro. + """ + + def execute(self, tb_bairro_id: int, bairro_schema: GTbBairroUpdateSchema): + """ + Executa a operação de atualização. + + Args: + tb_bairro_id (int): O ID do registro a ser atualizado. + bairro_schema (GTbBairroUpdateSchema): O esquema com os dados a serem atualizados. + + Returns: + O resultado da operação de atualização. + """ + # Instância o repositório de atualização + update_repository = UpdateRepository() + + # Chama o método de execução do repositório para realizar a atualização + return update_repository.execute(tb_bairro_id, bairro_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/controllers/g_tb_bairro_controller.py b/packages/v1/administrativo/controllers/g_tb_bairro_controller.py new file mode 100644 index 0000000..b736102 --- /dev/null +++ b/packages/v1/administrativo/controllers/g_tb_bairro_controller.py @@ -0,0 +1,114 @@ +from actions.dynamic_import.dynamic_import import DynamicImport +from packages.v1.administrativo.schemas.g_tb_bairro_schema import ( + GTbBairroSchema, + GTbBairroSaveSchema, + GTbBairroUpdateSchema, + GTbBairroIdSchema, + GTbBairroDescricaoSchema +) + + +class GTbBairroController: + + def __init__(self): + # Action responsável por carregar as services de acordo com o estado + self.dynamic_import = DynamicImport() + + # Define o pacote que deve ser carregado + self.dynamic_import.set_package("administrativo") + + # Define a tabela que o pacote pertence + self.dynamic_import.set_table("g_tb_bairro") + pass + + # Lista todos os registros de g_tb_bairro + def index(self): + + # Importação da classe desejada + indexService = self.dynamic_import.service("g_tb_bairro_index_service", "IndexService") + + # Instância da classe service + self.indexService = indexService() + + # Lista todos os registros de g_tb_bairro + return { + 'message': 'Registros de bairro localizados com sucesso', + 'data': self.indexService.execute() + } + + + # Busca um registro de g_tb_bairro específico pelo ID + def show(self, bairro_schema: GTbBairroIdSchema): + + #Importação da classe desejada + show_service = self.dynamic_import.service('g_tb_bairro_show_service', 'ShowService') + + # Instância da classe desejada + self.show_service = show_service() + + # Busca e retorna o registro de g_tb_bairro desejado + return { + 'message': 'Registro de bairro localizado com sucesso', + 'data': self.show_service.execute(bairro_schema) + } + + + # Busca um registro de g_tb_bairro pela descrição + def get_by_descricao(self, bairro_schema: GTbBairroDescricaoSchema): + + #Importação da classe desejada + show_service = self.dynamic_import.service('g_tb_bairro_get_descricao_service', 'GetByDescricaoService') + + # Instância da classe desejada + self.show_service = show_service() + + # Busca e retorna o registro de g_tb_bairro desejado + return { + 'message': 'Registro de bairro localizado com sucesso', + 'data': self.show_service.execute(bairro_schema, True) + } + + + # Cadastra um novo registro de g_tb_bairro + def save(self, bairro_schema: GTbBairroSaveSchema): + + #Importação da classe desejada + save_service = self.dynamic_import.service('g_tb_bairro_save_service', 'SaveService') + + # Instância da classe desejada + self.save_service = save_service() + # Busca e retorna o registro de g_tb_bairro desejado + return { + 'message': 'Registro de bairro salvo com sucesso', + 'data': self.save_service.execute(bairro_schema) + } + + # Atualiza os dados de um registro de g_tb_bairro + def update(self, tb_bairro_id: int, bairro_schema: GTbBairroUpdateSchema): + + #Importação da classe desejada + update_service = self.dynamic_import.service('g_tb_bairro_update_service', 'UpdateService') + + # Instância da classe desejada + self.update_service = update_service() + + # Busca e retorna o registro de g_tb_bairro desejado + return { + 'message': 'Registro de bairro atualizado com sucesso', + 'data': self.update_service.execute(tb_bairro_id, bairro_schema) + } + + # Exclui um registro de g_tb_bairro + def delete(self, bairro_schema: GTbBairroIdSchema): + + #Importação da classe desejada + delete_service = self.dynamic_import.service('g_tb_bairro_delete_service', 'DeleteService') + + # Instância da classe desejada + self.delete_service = delete_service() + + # Busca e retorna o registro de g_tb_bairro desejado + return { + 'message': 'Registro de bairro removido com sucesso', + 'data': self.delete_service.execute(bairro_schema) + } \ No newline at end of file diff --git a/packages/v1/administrativo/endpoints/g_tb_bairro_endpoint.py b/packages/v1/administrativo/endpoints/g_tb_bairro_endpoint.py new file mode 100644 index 0000000..fbb77a3 --- /dev/null +++ b/packages/v1/administrativo/endpoints/g_tb_bairro_endpoint.py @@ -0,0 +1,108 @@ +# Importação de bibliotecas +from typing import Optional +from fastapi import APIRouter, Body, Depends, status +from actions.jwt.get_current_user import get_current_user +from packages.v1.administrativo.controllers.g_tb_bairro_controller import GTbBairroController +from packages.v1.administrativo.schemas.g_tb_bairro_schema import ( + GTbBairroSchema, + GTbBairroSaveSchema, + GTbBairroUpdateSchema, + GTbBairroIdSchema +) + +# Inicializa o roteador para as rotas do tipo de reconhecimento +router = APIRouter() + +# Instanciamento do controller desejado +g_tb_bairro_controller = GTbBairroController() + +# Lista todos os registros de bairro +@router.get('/', + status_code=status.HTTP_200_OK, + summary='Lista todos os registros de bairro cadastrados', + response_description='Lista todos os registros de bairro cadastrados') +async def index(current_user: dict = Depends(get_current_user)): + + # Busca todos os registros de bairro cadastrados + response = g_tb_bairro_controller.index() + + # Retorna os dados localizados + return response + + +# Localiza um registro de bairro pela descrição +@router.get('/descricao', + status_code=status.HTTP_200_OK, + summary='Busca um registro de bairro em específico pela descrição', + response_description='Busca um registro de bairro em específico') +async def get_by_descricao(descricao : str, current_user: dict = Depends(get_current_user)): + + # Cria o schema com os dados recebidos + bairro_schema = GTbBairroSchema(descricao=descricao) + + # Busca um registro de bairro específico pela descrição + response = g_tb_bairro_controller.get_by_descricao(bairro_schema) + + # Retorna os dados localizados + return response + + +# Localiza um registro de bairro pelo ID +@router.get('/{tb_bairro_id}', + status_code=status.HTTP_200_OK, + summary='Busca um registro de bairro em específico pelo ID', + response_description='Busca um registro de bairro em específico') +async def show(tb_bairro_id : int, current_user: dict = Depends(get_current_user)): + + # Cria o schema com os dados recebidos + bairro_schema = GTbBairroIdSchema(tb_bairro_id=tb_bairro_id) + + # Busca um registro de bairro específico pelo ID + response = g_tb_bairro_controller.show(bairro_schema) + + # Retorna os dados localizados + return response + + +# Cadastro de registro de bairro +@router.post('/', + status_code=status.HTTP_201_CREATED, + summary='Cadastra um registro de bairro', + response_description='Cadastra um registro de bairro') +async def save(bairro_schema: GTbBairroSaveSchema, current_user: dict = Depends(get_current_user)): + + # Efetua o cadastro no banco de dados + response = g_tb_bairro_controller.save(bairro_schema) + + # Retorna os dados localizados + return response + + +# Atualiza os dados de um registro de bairro +@router.put('/{tb_bairro_id}', + status_code=status.HTTP_200_OK, + summary='Atualiza um registro de bairro', + response_description='Atualiza um registro de bairro') +async def update(tb_bairro_id: int, bairro_schema: GTbBairroUpdateSchema, current_user: dict = Depends(get_current_user)): + + # Efetua a atualização dos dados + response = g_tb_bairro_controller.update(tb_bairro_id, bairro_schema) + + # Retorna os dados localizados + return response + +# Exclui um determinado registro de bairro +@router.delete('/{tb_bairro_id}', + status_code=status.HTTP_200_OK, + summary='Remove um registro de bairro', + response_description='Remove um registro de bairro') +async def delete(tb_bairro_id: int, current_user: dict = Depends(get_current_user)): + + # Cria o schema com os dados recebidos + bairro_schema = GTbBairroIdSchema(tb_bairro_id=tb_bairro_id) + + # Efetua a exclusão do registro de bairro + response = g_tb_bairro_controller.delete(bairro_schema) + + # Retorna os dados localizados + return response \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_delete_repository.py b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_delete_repository.py new file mode 100644 index 0000000..561b246 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_delete_repository.py @@ -0,0 +1,41 @@ +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroIdSchema +from fastapi import HTTPException, status + +class DeleteRepository(BaseRepository): + """ + Repositório para a operação de exclusão de um registro na tabela + g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroIdSchema): + """ + Executa a consulta SQL para remover um registro pelo ID. + + Args: + bairro_schema (GTbBairroIdSchema): O esquema com o ID a ser removido. + + Returns: + O resultado da operação de exclusão. + """ + try: + # Montagem do sql + sql = """ DELETE FROM G_TB_BAIRRO WHERE TB_BAIRRO_ID = :tb_bairro_id """ + + # Preenchimento de parâmetros + params = { + "tb_bairro_id": bairro_schema.tb_bairro_id + } + + # Execução do sql + response = self.run(sql, params) + + # Retorna o resultado + return response + + except Exception as e: + # Informa que houve uma falha na exclusão + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao excluir o Bairro: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_get_by_descricao_repository.py b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_get_by_descricao_repository.py new file mode 100644 index 0000000..b5fa991 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_get_by_descricao_repository.py @@ -0,0 +1,29 @@ +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroDescricaoSchema + +class GetByDescricaoRepository(BaseRepository): + """ + Repositório para a operação de busca de um registro na tabela + g_tb_bairro por descrição. + """ + + def execute(self, bairro_schema: GTbBairroDescricaoSchema): + """ + Executa a consulta SQL para buscar um registro pela descrição. + + Args: + bairro_schema (GTbBairroDescricaoSchema): O esquema com a descrição a ser buscada. + + Returns: + Um dicionário contendo os dados do registro ou None se não for encontrado. + """ + # Montagem do SQL + sql = """ SELECT * FROM G_TB_BAIRRO WHERE DESCRICAO = :descricao """ + + # Preenchimento de parâmetros + params = { + 'descricao': bairro_schema.descricao + } + + # Execução do sql + return self.fetch_one(sql, params) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_index_repository.py b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_index_repository.py new file mode 100644 index 0000000..aba50a8 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_index_repository.py @@ -0,0 +1,23 @@ +from abstracts.repository import BaseRepository + +class IndexRepository(BaseRepository): + """ + Repositório para a operação de listagem de todos os registros + na tabela g_tb_bairro. + """ + + def execute(self): + """ + Executa a consulta SQL para buscar todos os registros. + + Returns: + Uma lista de dicionários contendo os dados dos registros. + """ + # Montagem do SQL + sql = """ SELECT * FROM G_TB_BAIRRO """ + + # Execução do sql + response = self.fetch_all(sql) + + # Retorna os dados localizados + return response \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_save_repository.py b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_save_repository.py new file mode 100644 index 0000000..c6c601c --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_save_repository.py @@ -0,0 +1,56 @@ +from fastapi import HTTPException, status +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroSaveSchema + + +class SaveRepository(BaseRepository): + """ + Repositório para a operação de salvamento de um novo registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroSaveSchema): + """ + Executa a operação de salvamento no banco de dados. + + Args: + bairro_schema (GTbBairroSaveSchema): O esquema com os dados a serem salvos. + + Returns: + O registro recém-criado. + + Raises: + HTTPException: Caso ocorra um erro na execução da query. + """ + try: + + # Montagem do SQL + sql = """ INSERT INTO G_TB_BAIRRO( + TB_BAIRRO_ID, + DESCRICAO, + SITUACAO, + SISTEMA_ID + ) VALUES ( + :tb_bairro_id, + :descricao, + :situacao, + :sistema_id + ) RETURNING *;""" + + # Preenchimento de parâmetros + params = { + 'tb_bairro_id': bairro_schema.tb_bairro_id, + 'descricao': bairro_schema.descricao, + 'situacao': bairro_schema.situacao, + 'sistema_id': bairro_schema.sistema_id + } + + # Execução do sql + return self.run_and_return(sql, params) + + except Exception as e: + + # Informa que houve uma falha no salvamento do registro + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao salvar o Bairro: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_show_repository.py b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_show_repository.py new file mode 100644 index 0000000..37cc191 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_show_repository.py @@ -0,0 +1,46 @@ +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroIdSchema +from fastapi import HTTPException, status + +class ShowRepository(BaseRepository): + """ + Repositório para a operação de exibição de um registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroIdSchema): + """ + Busca um registro específico de Bairro pelo ID. + + Args: + bairro_schema (GTbBairroIdSchema): O esquema que contém o ID do registro. + + Returns: + O registro encontrado ou None se não existir. + + Raises: + HTTPException: Caso ocorra um erro na execução da query. + """ + try: + # Montagem do SQL + sql = "SELECT * FROM G_TB_BAIRRO WHERE TB_BAIRRO_ID = :tb_bairro_id" + + # Preenchimento de parâmetros + params = { + 'tb_bairro_id': bairro_schema.tb_bairro_id + } + + # Execução do SQL + result = self.fetch_one(sql, params) + + if not result: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Registro não encontrado" + ) + + return result + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Erro ao buscar registro: {str(e)}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_update_repository.py b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_update_repository.py new file mode 100644 index 0000000..d44ea36 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_bairro/g_tb_bairro_update_repository.py @@ -0,0 +1,53 @@ +from fastapi import HTTPException, status +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroUpdateSchema + + +class UpdateRepository(BaseRepository): + """ + Repositório para a operação de atualização de um registro na tabela + g_tb_bairro. + """ + + def execute(self, tb_bairro_id: int, bairro_schema: GTbBairroUpdateSchema): + """ + Executa a operação de atualização no banco de dados. + + Args: + tb_bairro_id (int): O ID do registro a ser atualizado. + bairro_schema (GTbBairroUpdateSchema): O esquema com os dados a serem atualizados. + + Returns: + O resultado da operação de atualização. + """ + try: + # Montagem do SQL + sql = """ UPDATE G_TB_BAIRRO SET + DESCRICAO = :descricao, + SITUACAO = :situacao, + SISTEMA_ID = :sistema_id + WHERE + TB_BAIRRO_ID = :tb_bairro_id + RETURNING * """ + + # Preenchimento de parâmetros + params = { + 'tb_bairro_id': tb_bairro_id, + 'descricao': bairro_schema.descricao, + 'situacao': bairro_schema.situacao, + 'sistema_id': bairro_schema.sistema_id + } + + # Execução do sql + response = self.run_and_return(sql, params) + + # Retorna o resultado + return response + + except Exception as e: + + # Informa que houve uma falha na atualização do registro + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao atualizar o Bairro: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/schemas/g_tb_bairro_schema.py b/packages/v1/administrativo/schemas/g_tb_bairro_schema.py new file mode 100644 index 0000000..20469d5 --- /dev/null +++ b/packages/v1/administrativo/schemas/g_tb_bairro_schema.py @@ -0,0 +1,102 @@ +from pydantic import BaseModel, field_validator, model_validator +from fastapi import HTTPException, status +from typing import Optional + +# Funções para sanitização de entradas (evitar XSS, SQLi etc.) +from actions.validations.text import Text + + +# ---------------------------------------------------- +# Schema base +# ---------------------------------------------------- +class GTbBairroSchema(BaseModel): + tb_bairro_id: Optional[int] = None + descricao: Optional[str] = None + situacao: Optional[str] = None + sistema_id: Optional[int] = None + + class Config: + from_attributes = True + + +# ---------------------------------------------------- +# Schema para localizar um Bairro especifico pelo ID (GET) +# ---------------------------------------------------- +class GTbBairroIdSchema(BaseModel): + tb_bairro_id: int + + +# ---------------------------------------------------- +# Schema para localizar um Bairro especifico pela descrição (GET) +# ---------------------------------------------------- +class GTbBairroDescricaoSchema(BaseModel): + descricao: str + + +# ---------------------------------------------------- +# Schema para criação de novo Bairro (POST) +# ---------------------------------------------------- +class GTbBairroSaveSchema(BaseModel): + tb_bairro_id: Optional[int] = None + descricao: str + situacao: str + sistema_id: Optional[int] = None + + # Sanitiza os inputs enviados + @field_validator('descricao', 'situacao') + def sanitize_fields(cls, v): + if v: + return Text.sanitize_input(v) + return v + + # Verifica se os campos obrigatórios foram enviados + @model_validator(mode='after') + def validate_all_fields(self): + errors = [] + + if not self.descricao or len(self.descricao.strip()) == 0: + errors.append({'input': 'descricao', 'message': 'A descrição é obrigatória.'}) + + if not self.situacao or len(self.situacao.strip()) == 0: + errors.append({'input': 'situacao', 'message': 'A situação é obrigatória.'}) + + if errors: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=errors + ) + + return self + + +# ---------------------------------------------------- +# Schema para atualizar Bairro (PUT) +# ---------------------------------------------------- +class GTbBairroUpdateSchema(BaseModel): + + descricao: Optional[str] = None + situacao: Optional[str] = None + sistema_id: Optional[int] = None + + # Sanitiza os inputs enviados + @field_validator('descricao', 'situacao') + def sanitize_fields(cls, v): + if v: + return Text.sanitize_input(v) + return v + + # Verifica se os campos obrigatórios foram enviados + @model_validator(mode='after') + def validate_all_fields(self): + errors = [] + + if not self.descricao and not self.situacao: + errors.append({'input': 'descricao', 'message': 'A descrição é obrigatória para a atualização.'}) + + if errors: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=errors + ) + + return self \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_delete_service.py b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_delete_service.py new file mode 100644 index 0000000..e9e1b54 --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_delete_service.py @@ -0,0 +1,27 @@ +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroIdSchema +from packages.v1.administrativo.actions.g_tb_bairro.g_tb_bairro_delete_action import DeleteAction + +class DeleteService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de exclusão de um registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroIdSchema): + """ + Executa a operação de exclusão do registro no banco de dados. + + Args: + bairro_schema (GTbBairroIdSchema): O esquema com o ID do registro a ser excluído. + + Returns: + O resultado da operação de exclusão. + """ + # Instanciamento da ação + delete_action = DeleteAction() + + # Executa a ação em questão + data = delete_action.execute(bairro_schema) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_get_descricao_service.py b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_get_descricao_service.py new file mode 100644 index 0000000..80eea91 --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_get_descricao_service.py @@ -0,0 +1,38 @@ +from fastapi import HTTPException, status +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroDescricaoSchema +from packages.v1.administrativo.actions.g_tb_bairro.g_tb_bairro_get_by_descricao_action import GetByDescricaoAction + +class GetByDescricaoService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de busca de um registro na tabela g_tb_bairro pela sua descrição. + """ + + def execute(self, bairro_schema: GTbBairroDescricaoSchema, messageValidate: bool): + """ + Executa a operação de busca no banco de dados. + + Args: + bairro_schema (GTbBairroDescricaoSchema): O esquema com a descrição a ser buscada. + messageValidate (bool): Se True, lança uma exceção HTTP caso o registro não seja encontrado. + + Returns: + O registro encontrado ou None. + """ + # Instanciamento da ação + show_action = GetByDescricaoAction() + + # Executa a ação em questão + data = show_action.execute(bairro_schema) + + if messageValidate: + + if not data: + # Retorna uma exceção + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar o registro de Bairro' + ) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_index_service.py b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_index_service.py new file mode 100644 index 0000000..8d27ce8 --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_index_service.py @@ -0,0 +1,32 @@ +from fastapi import HTTPException, status +from packages.v1.administrativo.actions.g_tb_bairro.g_tb_bairro_index_action import IndexAction + +class IndexService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de listagem de registros na tabela g_tb_bairro. + """ + + def execute(self): + """ + Executa a operação de busca de todos os registros no banco de dados. + + Returns: + A lista de registros encontrados. + """ + # Instanciamento da ação + index_action = IndexAction() + + # Executa a busca de todas as ações + data = index_action.execute() + + # Verifica se foram localizados registros + if not data: + # Retorna uma exceção + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar os registros de Bairro' + ) + + # Retorna as informações localizadas + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_save_service.py b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_save_service.py new file mode 100644 index 0000000..4a1175c --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_save_service.py @@ -0,0 +1,70 @@ +from actions.dynamic_import.dynamic_import import DynamicImport +from packages.v1.sequencia.schemas.g_sequencia import GSequenciaSchema +from packages.v1.sequencia.services.g_sequencia.generate_service import GenerateService +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroSaveSchema, GTbBairroDescricaoSchema +from packages.v1.administrativo.actions.g_tb_bairro.g_tb_bairro_save_action import SaveAction +from fastapi import HTTPException, status + +class SaveService: + + def __init__(self): + # Ação responsável por carregar as services de acordo com o estado + self.dynamic_import = DynamicImport() + + # Define o pacote que deve ser carregado + self.dynamic_import.set_package("administrativo") + + # Define a tabela que o pacote pertence + self.dynamic_import.set_table("g_tb_bairro") + pass + + # Cadastra o novo Bairro + def execute(self, bairro_schema: GTbBairroSaveSchema): + + # Armazena possíveis erros + errors = [] + + # Verifica se a descrição já está sendo utilizada + # Importação de service + descricao_service = self.dynamic_import.service("g_tb_bairro_get_descricao_service", "GetByDescricaoService") + + # Instanciamento da service + self.descricao_service = descricao_service() + + # Verifica se a descrição já está sendo utilizada + self.response = self.descricao_service.execute(GTbBairroDescricaoSchema(descricao=bairro_schema.descricao), False) + + # Se houver retorno significa que a descrição já está sendo utilizada + if self.response: + errors.append({'input': 'descricao', 'message': 'a descrição informada já está sendo utilizada.'}) + + # Se houver erros, lança a exceção + if errors: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=errors + ) + + # Verifica se precisa gerar o ID de sequência + if not bairro_schema.tb_bairro_id: + + # Crio um objeto de sequencia + sequencia_schema = GSequenciaSchema() + + # Define os dados para atualizar a sequencia + sequencia_schema.tabela = 'G_TB_BAIRRO' + + # Busco a sequência atualizada + generate = GenerateService() + + # Busco a sequência atualizada + sequencia = generate.execute(sequencia_schema) + + # Atualiza os dados da chave primária + bairro_schema.tb_bairro_id = sequencia.sequencia + + # Instanciamento de ações + save_action = SaveAction() + + # Retorna o resultado da operação + return save_action.execute(bairro_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_show_service.py b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_show_service.py new file mode 100644 index 0000000..83a63cb --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_show_service.py @@ -0,0 +1,35 @@ +from fastapi import HTTPException, status +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroIdSchema +from packages.v1.administrativo.actions.g_tb_bairro.g_tb_bairro_show_action import ShowAction + +class ShowService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de busca de um registro na tabela g_tb_bairro. + """ + + def execute(self, bairro_schema: GTbBairroIdSchema): + """ + Executa a operação de busca no banco de dados. + + Args: + bairro_schema (GTbBairroIdSchema): O esquema com o ID a ser buscado. + + Returns: + O resultado da busca. + """ + # Instanciamento da ação + show_action = ShowAction() + + # Executa a ação em questão + data = show_action.execute(bairro_schema) + + if not data: + # Retorna uma exceção + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar o registro de Bairro' + ) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_update_service.py b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_update_service.py new file mode 100644 index 0000000..0ac28bd --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_bairro/go/g_tb_bairro_update_service.py @@ -0,0 +1,24 @@ +from packages.v1.administrativo.schemas.g_tb_bairro_schema import GTbBairroUpdateSchema +from packages.v1.administrativo.actions.g_tb_bairro.g_tb_bairro_update_action import UpdateAction + +class UpdateService: + """ + Serviço para a operação de atualização de um registro na tabela + g_tb_bairro. + """ + def execute(self, bairro_id : int, bairro_schema: GTbBairroUpdateSchema): + """ + Executa a operação de atualização no banco de dados. + + Args: + bairro_id (int): O ID do registro a ser atualizado. + bairro_schema (GTbBairroUpdateSchema): O esquema com os dados a serem atualizados. + + Returns: + O resultado da operação de atualização. + """ + # Instanciamento de ações + update_action = UpdateAction() + + # Retorna o resultado da operação + return update_action.execute(bairro_id, bairro_schema) \ No newline at end of file diff --git a/packages/v1/api.py b/packages/v1/api.py index c06235c..80c9b25 100644 --- a/packages/v1/api.py +++ b/packages/v1/api.py @@ -13,6 +13,7 @@ from packages.v1.administrativo.endpoints import g_tb_regimecomunhao_endpoint from packages.v1.administrativo.endpoints import g_tb_regimebens_endpoint from packages.v1.administrativo.endpoints import t_censec_endpoint from packages.v1.administrativo.endpoints import t_censec_naturezalitigio_endpoint +from packages.v1.administrativo.endpoints import g_tb_bairro_endpoint # Cria uma instância do APIRouter que vai agregar todas as rotas da API api_router = APIRouter() @@ -72,4 +73,10 @@ api_router.include_router( # Inclui as rotas de t_censec_naturezalitigio api_router.include_router( t_censec_naturezalitigio_endpoint.router, prefix="/administrativo/t_censec_naturezalitigio", tags=["CENSEC - Natureza Litígio"] +) + + +# Inclui as rotas de t_censec_naturezalitigio +api_router.include_router( + g_tb_bairro_endpoint.router, prefix="/administrativo/g_tb_bairro", tags=["CENSEC - Bairro"] ) \ No newline at end of file