Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
14b3741
FUNDING Sponsors available
galigaribaldi Apr 25, 2026
51d7a64
Merge pull request #32 from galigaribaldi/DEV
galigaribaldi Apr 25, 2026
b7b2ec6
Merge pull request #32 from galigaribaldi/DEV
galigaribaldi Apr 25, 2026
596da18
Merge pull request #33 from galigaribaldi/DEV
galigaribaldi Apr 25, 2026
8f15340
Habilitar CORS
galigaribaldi Apr 25, 2026
37e1871
Merge pull request #34 from galigaribaldi/DEV
galigaribaldi Apr 25, 2026
9fa6c23
Bump github.com/jackc/pgx/v5 from 5.6.0 to 5.9.2
dependabot[bot] Apr 25, 2026
af39fff
Primera implementacion de carga de datos sobre Plutarco Extension
galigaribaldi Jun 6, 2026
dea988e
Primera implementacion de carga de datos sobre Plutarco Extension
galigaribaldi Jun 6, 2026
46a8ca2
Merge branch 'DEV-fix-plutarco-extension' of https://github.com/galig…
galigaribaldi Jun 6, 2026
09939a0
feat(analitico): GeoJSON AGEBS endpoint + linea_id en estaciones y li…
galigaribaldi Jun 6, 2026
9d53c94
chore: Tracker CLAUDE.md y .claude/settings.json para trabajo MultiEq…
galigaribaldi Jun 18, 2026
65498e7
docs(CLAUDE.md); agregar sección de continuidad entre sesiones y equipos
galigaribaldi Jun 18, 2026
8c39ee7
feat(plutarco): ETL afluencia por línea + migraciones + catálogo homo…
galigaribaldi Jun 21, 2026
0a56268
feat(plutarco): ETL afluencia por línea + migraciones + catálogo homo…
galigaribaldi Jun 21, 2026
496c979
feat(plutarco): endpoint GET /analitico/afluencia-linea + docs fuente…
galigaribaldi Jun 21, 2026
24a3cba
feat(plutarco): DDL + ETL afluencia por estación Metro — 38,219 regis…
galigaribaldi Jun 21, 2026
55f0e80
fix: corregir .gitignore — separar reglas ETL/Data/AGEBS y ETL/Data/P…
galigaribaldi Jun 21, 2026
a7e0c53
feat(plutarco): endpoint GET /analitico/afluencia-estacion + disclaim…
galigaribaldi Jun 21, 2026
cd2a225
docs (Swagger): Agregar @Failure 503 en endpoints analíticos Plutarco
galigaribaldi Jun 24, 2026
8c354e2
fix: agregar alias MEXIBUS sin acento en Middleware + Gitignore Plutarco
galigaribaldi Jun 24, 2026
f95b2e8
Merge pull request #48 from galigaribaldi/DEV-fix-plutarco-extension
galigaribaldi Jun 24, 2026
04bb8ca
ci: extender Dependabot - gomod, pip docker, npm, github-actions
galigaribaldi Jun 24, 2026
cd3e6c5
Merge pull request #25 from galigaribaldi/dependabot/go_modules/githu…
galigaribaldi Jun 24, 2026
1db4ae7
Merge pull request #55 from galigaribaldi/fix/dependabot-config
galigaribaldi Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"permissions": {
"allow": [
"Read(**)",
"Glob(**)",
"Grep(**)"
],
"deny": [
"Bash(git add*)",
"Bash(git commit*)",
"Bash(git push*)",
"Bash(git reset*)",
"Bash(git checkout -- *)",
"Bash(rm -rf*)"
]
}
}
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github: galigaribaldi
75 changes: 75 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
version: 2
updates:
# Go modules — runtime principal, expuesto a internet
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
target-branch: "DEV"
labels:
- "dependencies"
- "go"
groups:
go-minor-patch:
patterns:
- "*"
update-types:
- "minor"
- "patch"
ignore:
- dependency-name: "gorm.io/gorm"
update-types: ["version-update:semver-major"]
- dependency-name: "gorm.io/driver/postgres"
update-types: ["version-update:semver-major"]
open-pull-requests-limit: 3

# Python (ETL) — scripts offline contra la DB
- package-ecosystem: "pip"
directory: "/ETL"
schedule:
interval: "monthly"
target-branch: "DEV"
labels:
- "dependencies"
- "python"
open-pull-requests-limit: 3

# Docker — imagenes base (postgis/postgis, golang, node)
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "monthly"
target-branch: "DEV"
labels:
- "dependencies"
- "docker"
open-pull-requests-limit: 2

# npm (frontend) — visor interactivo MapLibre
- package-ecosystem: "npm"
directory: "/web"
schedule:
interval: "weekly"
target-branch: "DEV"
labels:
- "dependencies"
- "frontend"
groups:
npm-minor-patch:
patterns:
- "*"
update-types:
- "minor"
- "patch"
open-pull-requests-limit: 3

# GitHub Actions — CI/CD workflows
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
target-branch: "DEV"
labels:
- "dependencies"
- "ci"
open-pull-requests-limit: 2
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ CLAUDE.md
.env.dev
.env.qa
.env.main
.env.prod

## Binarios y temporales de Go/Air
bin/
Expand All @@ -213,4 +214,8 @@ db/init/seed.sql
*.jpg
*.jpeg
*.JPEG
.env.prod

## Extension Plutarco (datos fuente y seed pesado)
ETL/Data/AGEBS/*
ETL/Data/Pesos/*
db/init/seed_plutarco.sql
179 changes: 179 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# Apimetro — Contexto para Claude Code

## Descripcion del proyecto
API REST de datos geoespaciales sobre el sistema de transporte publico de la Ciudad de Mexico y el Area Metropolitana. Sirve como motor de datos para trazar lineas, puntos y poligonos en aplicaciones de mapas. Software libre bajo licencia BSL 1.1 (convierte a Apache 2.0 el 2029-04-12).

Dos tipos de respuesta:
- **JSON descriptivo**: datos operativos, filtros avanzados (CRUD completo)
- **GeoJSON geografico**: geometrias PostGIS listas para mapas (solo lectura)

Repositorio: https://github.com/galigaribaldi/Apimetro
Produccion: https://apimetro.dev

## Stack tecnologico
- **Lenguaje**: Go 1.25
- **Framework web**: Gin v1.9 + CORS (gin-contrib/cors v1.7.7)
- **Base de datos**: PostgreSQL 15 + PostGIS 3.4 (imagen `postgis/postgis:15-3.4`)
- **ORM**: GORM v1.25
- **Documentacion**: Swaggo v1.16.4 (anotaciones en codigo -> genera Swagger UI en `/swagger/`)
- **Hot reload**: Air (`.air.toml`)
- **Contenedores**: Docker + docker-compose con perfiles (dev/qa/main/prod)
- **ETL**: Python 3 (scripts en `ETL/`)

## Estructura de carpetas
```
cmd/
main.go <- Entry point + anotaciones Swagger globales
pkg/
controller/
Controller.go <- Conexion a DB, buildDSN, auto-migrate
geojson/ <- Consultas espaciales (ST_AsGeoJSON, PostGIS) + AGEBs (plutarco)
transporte/ <- CRUD de entidades
middleware/ <- ValidarSistema (valida :sistema en la ruta)
utils/GeoJson/ <- Structs para mapear resultados de consultas espaciales
models/ <- Modelos GORM + structs de respuesta GeoJSON
routes/
Routes.go <- Router principal, embed.FS para static, grupos de rutas
static/ <- Landing page (index.html), docs (docs.html), logo.png
GeoJsonRoutes*.go <- Handlers GeoJSON + Analitico + anotaciones Swagger
docs/ <- Swagger autogenerado (NO editar manualmente)
docs/ <- Copia del Swagger generado
db/
init/
init.sql <- DDL esquema public (tablas, indices, PostGIS)
init_plutarco.sql <- DDL esquema plutarco (6 tablas: agebs, calles, uso_suelo, curvas_nivel, afluencia_linea, catalogo_homologacion)
roles.sh <- Crea rol apimetro_read (SELECT-only) al iniciar Docker
seed.sql <- Datos (~37MB), NO en git — se genera con scripts/load-seed.sh
migrations/
v2.0_afluencia.sql <- Patch para entornos existentes (tablas afluencia)
seed_catalogo_homologacion.sql <- Seed del catalogo de mapeo CSV→linea_id
NOTES.txt <- Guia de entornos, tablas, comandos Make, proceso seed
ETL/
main.py <- Orquestador de cargas ETL
conf.py <- Config DB (usa os.getenv)
DataCharge/ <- Scripts de carga (LoadAgebs.py, LoadPlutarcoGeo.py, LoadAfluencia.py)
Data/ <- Datos fuente (shapefiles, CSVs) — NO en git
scripts/
load-seed.sh <- Genera seed.sql local y sube al servidor via SCP
Makefile <- Comandos de build, docs, Docker
docker-compose.yml <- Multi-entorno (dev/qa/main) con perfiles
docker-compose.prod.yml <- Produccion (127.0.0.1:8080, solo Nginx)
```

## Comandos principales

```bash
# Desarrollo local con hot-reload (regenera Swagger al inicio)
make dev

# Solo regenerar documentacion Swagger
make docs

# Compilar binario
make build

# Docker — levantar entorno DEV (API :8080, DB :5433)
make docker-dev

# Docker — levantar entorno QA (API :8081, DB :5434)
make docker-qa

# Docker — levantar entorno MAIN (API :8082, DB :5435)
make docker-main

# Bajar contenedores
make docker-down-dev
make docker-down-qa
make docker-down-main

# Exportar esquema DB local a init.sql
make db-sync
```

Los archivos `.env.*` viven en `~/.SecretsFiles/` (fuera del repo). El Makefile los referencia con `SECRETS_DIR`.

## Sistemas de transporte soportados
`METRO`, `MB` (Metrobus), `CBB` (Cablebus), `RTP`, `TROLE` (Trolebus), `TL` (Tren Ligero), `MEXIBUS`, `MEXICABLE`, `INTERURBANO`, `CC` (Cable Car), `TODOS`

## Rutas de la API
```
# Paginas web (embed.FS)
GET / -> Landing page (index.html)
GET /docs -> Referencia API (docs.html)
GET /swagger/*any -> Swagger UI

# GeoJSON (solo lectura)
GET /movilidad/mapas/geojsonEstacion -> Estaciones en GeoJSON
GET /movilidad/mapas/geojsonLinea -> Lineas en GeoJSON con metricas operativas
GET /movilidad/mapas/geojsonPoligono -> Poligonos administrativos en GeoJSON

# Analitico (esquema plutarco, sin ValidarSistema)
GET /movilidad/analitico/agebs -> AGEBs urbanas en GeoJSON (paginado)

# CRUD (JSON descriptivo)
CRUD /movilidad/:sistema/linea
CRUD /movilidad/:sistema/estacion
CRUD /movilidad/:sistema/descripcion-linea
CRUD /movilidad/:sistema/descripcion-estacion
```

## Base de datos

### Esquemas
- **public**: datos de transporte (lineas, ramals, estacions, historico_operacion, limites_territoriales)
- **plutarco**: datos INEGI para analisis (agebs, calles, uso_suelo, curvas_nivel, afluencia_linea, catalogo_homologacion)

### Seguridad
- Rol `apimetro_read`: SELECT-only sobre esquemas public y plutarco — lo usa la API
- Rol `admin_apimetro` (POSTGRES_USER): superusuario, solo Docker para init
- Nunca exponer credenciales admin en la API
- AutoMigrate solo corre cuando DB_HOST="" o DB_HOST=localhost (entorno local)

### DSN por defecto (desarrollo local sin Docker)
```
postgresql://prueba:postgres@localhost:5432/db_apimetro
```
Extension requerida: PostGIS.

## Convenciones del proyecto

### Codigo Go
- Anotaciones Swagger en archivos de `routes/` y en `main.go`. Los archivos en `docs/` y `cmd/docs/` son autogenerados — nunca editarlos manualmente
- Los modelos en `models/` usan tags `example:` para Swagger — mantener esos tags al modificar structs
- El middleware `ValidarSistema` normaliza `:sistema` a mayusculas y lo inyecta como `sistemaValidado` en el contexto Gin
- Los campos de texto en queries usan `norm.NFC.String()` para normalizar caracteres especiales (n con tilde, tildes) antes de buscar
- Queries PostGIS en el grupo `/analitico/` usan Raw SQL con `ST_AsGeoJSON(geom, 6)` (6 decimales, ~11cm precision)
- Paginacion obligatoria en endpoints de datos masivos (ej. AGEBs: default 500)

### Branching
- `main` — produccion (deployed en apimetro.dev)
- `DEV` — desarrollo activo, PRs van aqui primero
- `QA` — pruebas de integracion
- Feature branches: `DEV-<descripcion>` o `feature/<descripcion>` desde DEV

### Archivos estaticos
Los archivos en `cmd/pkg/routes/static/` se embeben en el binario con `//go:embed static`. Cambios en HTML/CSS/imagenes requieren rebuild (`docker compose build api` en produccion).

## Reglas de trabajo con Claude Code
1. **Nunca ejecutar operaciones git** (`add`, `commit`, `push`, `reset`, `checkout --`). Mostrar los comandos para que el usuario los ejecute.
2. **Mostrar los cambios propuestos al usuario antes de aplicarlos.** Esperar aprobacion explicita.
3. Al crear multiples archivos en secuencia, numerarlos ("Modulo 3 de 8") para indicar progreso.
4. Al cerrar un issue de backend, actualizar Swagger (`make docs`) y la coleccion Postman en `cmd/docs/postman_collection/`.
5. Probar cada endpoint nuevo en el contenedor DEV con curl antes de reportar como cerrado. Swagger UI apunta a `apimetro.dev` por `@host` en main.go — probar siempre contra localhost.
6. Los archivos `.env.*` contienen credenciales y viven fuera del repo (`~/.SecretsFiles/`). Nunca commitearlos.

## Continuidad entre sesiones y equipos

Los issues de GitHub contienen **comentarios de handoff** con contexto acumulado de sesiones previas (DDL, decisiones tecnicas, estado de BD, blockers). Al iniciar trabajo sobre un issue, leer sus comentarios para recuperar contexto:

```bash
gh issue view <numero> --json title,body,comments
```

Al terminar una sesion de trabajo sobre un issue, dejar un comentario de handoff con:
- Que se hizo y que queda pendiente
- Decisiones tomadas y por que
- Archivos creados o modificados
- Blockers si los hay

Issues con informacion de seguridad (#8 auth, #9 rate limiting) se documentan en GitHub Security Advisories (privados, solo admins).
Binary file added ETL/Data/Pesos/MatrizOD.xlsx
Binary file not shown.
Loading
Loading