# Arquitectura general

```mermaid
flowchart LR
  usuario["Usuario"] --> navegador["Navegador web"]
  navegador --> angular["Frontend Angular<br/>semillero"]

  angular -- "HTTP /api/auth/*<br/>HTTP /api/invima/*" --> proxy["Proxy Angular dev<br/>/api -> http://localhost:3000"]
  proxy --> express["API REST Express<br/>backend/src/app.js"]

  express --> auth["Rutas /api/auth<br/>login, me, logout"]
  express --> invima["Rutas /api/invima<br/>datasets, categorias, filtros,<br/>sync, catalogo, export"]

  auth --> authService["auth.service.js<br/>usuarios, sesiones, tokens"]
  invima --> invimaService["invima/service.js<br/>catalogo, filtros, sincronizacion"]
  invima --> syncJob["sync-job-manager.js<br/>estado de sincronizacion"]

  authService --> postgres[("PostgreSQL<br/>app_users, app_sessions")]
  invimaService --> postgres
  invimaService -- "sincroniza datasets" --> socrata["datos.gov.co Socrata API<br/>https://www.datos.gov.co/resource/*.json"]
  socrata --> invimaService

  invimaService --> adapters["adapters.js<br/>normalizacion por dataset"]
  adapters --> postgresInvima[("PostgreSQL<br/>invima_api_raw, invima_api_catalog")]
  postgresInvima --- postgres
```

## Archivos analizados

- `diagramas/frontend-clases.mmd`
- `diagramas/frontend-clases.svg`
- `semillero/src/app/app.routes.ts`
- `semillero/src/app/app.config.ts`
- `semillero/proxy.conf.json`
- `backend/src/app.js`
- `backend/src/server.js`
- `backend/src/routes/index.js`
- `backend/src/routes/auth.routes.js`
- `backend/src/routes/invima.routes.js`
- `backend/src/auth/auth.service.js`
- `backend/src/db/pool.js`
- `backend/src/config/env.js`
- `backend/invima/service.js`
- `backend/invima/adapters.js`
- `backend/invima/sync-job-manager.js`
- `backend/APIinvima.js`
- `backend/APIinvima.json`
