Arquitectura

Diseño y componentes del sistema de extracción de normas BCN

Visión General

El Extractor de Normas BCN está diseñado como un sistema modular que sigue el patrón ELT (Extract, Load, Transform) para procesamiento de datos legales.

Principios de Diseño

  • Modularidad: Componentes independientes y reutilizables
  • Escalabilidad: Diseño preparado para grandes volúmenes de datos
  • Resiliencia: Manejo robusto de errores y reintentos automáticos
  • Trazabilidad: Logging completo de todas las operaciones
  • Reproducibilidad: Docker para entornos consistentes

Diagrama de Arquitectura

┌───────────────────────────────────────────────────────────┐
│                         USUARIO                           │
└────────────────────────────┬──────────────────────────────┘
                             │
                             ▼
┌───────────────────────────────────────────────────────────┐
│                    INTERFACES DE USUARIO                  │
│    ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│    │   CLI App    │  │   REST API   │  │  Web UI (*)  │   │
│    │  (bcn_cli)   │  │  (FastAPI)   │  │              │   │
│    └──────────────┘  └──────────────┘  └──────────────┘   │
└────────────────────────────┬──────────────────────────────┘
                             │
                             ▼
┌───────────────────────────────────────────────────────────┐
│                     PYTHON APPLICATION                    │
│    ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│    │  BCN Client  │  │  XML Parser  │  │   Managers   │   │
│    │   (HTTP)     │→ │   (lxml)     │→ │  (Database)  │   │
│    └──────────────┘  └──────────────┘  └──────────────┘   │
└─────────────────────────────┬─────────────────────────────┘
                              │
                              ▼
┌───────────────────────────────────────────────────────────┐
│                    POSTGRESQL DATABASE                    │
│    ┌──────────────┐  ┌──────────────┐  ┌──────────────┐   │
│    │   Normas     │  │Instituciones │  │Tipos Normas  │   │
│    │              │  │              │  │              │   │
│    │  (+ FTS)     │  │              │  │              │   │
│    └──────────────┘  └──────────────┘  └──────────────┘   │
└─────────────────────────────┬─────────────────────────────┘
                              │
                              ▼
┌───────────────────────────────────────────────────────────┐
│                      DOCKER VOLUMES                       │
│     ┌──────────────┐              ┌──────────────┐        │
│     │  PostgreSQL  │              │   XML Files  │        │
│     │     Data     │              │   (backup)   │        │
│     └──────────────┘              └──────────────┘        │
└───────────────────────────────────────────────────────────┘

(*) En roadmap

Componentes Principales

BCN Client

Módulo HTTP para interactuar con los servicios web de la Biblioteca del Congreso Nacional.

Archivo: bcn_client.py
Responsabilidades: Construcción de URLs, manejo de requests, rate limiting
Features: Reintentos automáticos, timeout configurable, cache de respuestas

XML Parser

Procesador de documentos XML que extrae metadatos y convierte contenido a Markdown.

Archivo: utils/norm_parser.py
Responsabilidades: Parseo XML, extracción de metadatos, conversión a MD
Features: Validación de schema, limpieza de HTML, generación de hash MD5

Database Managers

Capa de abstracción para operaciones de base de datos.

NormsManager

Gestión completa de normas legales

InstitutionManager

CRUD de instituciones

TiposNormasManager

Catálogo de tipos de normas

CLI Interface

Interfaz de línea de comandos para gestionar el sistema.

Archivo: bcn_cli.py
Comandos: list, sync, search, stats, export

REST API

API REST construida con FastAPI para consultas programáticas.

Archivo: api.py
Features: Documentación automática, validación con Pydantic, CORS

Flujo de Datos

El proceso de extracción de normas sigue este flujo:

1

Solicitud de Normas

El usuario ejecuta bcn_cli.py sync <institucion_id>

2

Consulta a la API BCN

BCN Client construye la URL y realiza la petición HTTP al servicio web

3

Descarga de XML

Se descargan los XMLs individuales de cada norma y se guardan en data/xml/

4

Parseo y Transformación

XML Parser extrae metadatos, genera hash MD5, y convierte a Markdown

5

Almacenamiento

NormsManager inserta/actualiza los datos en PostgreSQL usando upsert

6

Logging

Se registra el resultado de la operación en la tabla descargas

Patrones de Diseño Utilizados

Repository Pattern

Los Managers actúan como repositorios que abstraen el acceso a datos

Dependency Injection

Las conexiones de base de datos se inyectan en los managers

Singleton

El logger y el cliente HTTP se instancian una sola vez

Template Method

El flujo de sincronización define pasos que pueden personalizarse

Explorar Más