From c00c5cab3c35a7dfe84670cea176dd901505bdb4 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Mon, 17 Nov 2025 11:45:28 -0300 Subject: [PATCH] =?UTF-8?q?feat():=20Aplicado=20fun=C3=A7=C3=A3o=20que=20i?= =?UTF-8?q?r=C3=A1=20efetuar=20a=20descomp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compress_decompress.py | 49 +++++++++++++++++++ .../ato_principal_show_atos_repository.py | 5 +- 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 actions/compress_decompress/compress_decompress.py diff --git a/actions/compress_decompress/compress_decompress.py b/actions/compress_decompress/compress_decompress.py new file mode 100644 index 0000000..cb9718a --- /dev/null +++ b/actions/compress_decompress/compress_decompress.py @@ -0,0 +1,49 @@ +@staticmethod +def decompress(vf_string): + """ + Descomprime e decodifica texto compactado ou codificado. + + Agora: + - Tenta automaticamente Base64 decode ANTES de tudo. + - Depois detecta zlib. + - Decodifica ISO-8859-1 se não for zlib. + """ + + if not vf_string: + return "" + + # Caso seja stream (ex.: BLOB Firebird) + if hasattr(vf_string, "read"): + vf_string = vf_string.read() + + # Garante bytes + if isinstance(vf_string, str): + vf_bytes = vf_string.encode("latin1", errors="ignore") + else: + vf_bytes = vf_string + + # --- NOVO: TENTATIVA DE BASE64 DECODE ANTES --- + try: + # Remove quebras e espaços — comum em JSON, Firebird, Delphi + cleaned = vf_bytes.strip().replace(b"\n", b"").replace(b"\r", b"") + decoded = base64.b64decode(cleaned, validate=True) + vf_bytes = decoded + except Exception: + # Não era base64, segue normalmente + pass + + # Detecta assinatura zlib + is_zlib = len(vf_bytes) > 2 and vf_bytes[0] == 0x78 and vf_bytes[1] in (0x9C, 0xDA) + + if is_zlib: + try: + text = zlib.decompress(vf_bytes).decode("iso-8859-1", errors="ignore") + return text + except Exception: + pass + + # Caso não seja zlib, tenta apenas decodificar ISO-8859-1 + try: + return vf_bytes.decode("iso-8859-1", errors="ignore") + except Exception: + return str(vf_string) diff --git a/packages/v1/administrativo/repositories/ato_principal/ato_principal_show_atos_repository.py b/packages/v1/administrativo/repositories/ato_principal/ato_principal_show_atos_repository.py index 792ef82..22d1e37 100644 --- a/packages/v1/administrativo/repositories/ato_principal/ato_principal_show_atos_repository.py +++ b/packages/v1/administrativo/repositories/ato_principal/ato_principal_show_atos_repository.py @@ -2,6 +2,7 @@ from typing import Optional, Dict, Any, List from sqlalchemy import func from fastapi import HTTPException, status from database.mysql import SessionLocal, get_database_settings +from actions.compress_decompress.compress_decompress import decompress from packages.v1.administrativo.models.ato_principal_model import AtoPrincipal from packages.v1.administrativo.models.ato_parte_model import AtoParte from packages.v1.administrativo.models.ato_documento_model import AtoDocumento @@ -267,8 +268,8 @@ class ShowAtosRepository: # === 5. Montar JSON final === return { - "inteiro_teor": ( - ato.inteiro_teor.decode("utf-8") if ato.inteiro_teor else None + "inteiro_teor": decompress( + (ato.inteiro_teor.decode("utf-8") if ato.inteiro_teor else None) ), "identificacao_pedido_na_cgj": ato.identificacao_pedido_cgj, "tipo_de_ato": ato.tipo_ato,