10 Commits

Author SHA1 Message Date
Carlos Narro
21f5682aac telemetría: instalaciones únicas con id anónimo de instalación
Nueva tabla telemetry_active(install_id, day) (create_all la crea). add_telemetry
hace upsert (install_id, day) si viene install_id. El summary añade installsTotal
(únicas de siempre), installsActive (en el periodo) y dauToday. Tests: dos ids
únicos + uno duplicado → 2 únicas.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 14:42:02 +02:00
Carlos Narro
f41ae0ffd7 telemetría: guardar la versión de la app (fragmentación)
add_telemetry cuenta 'ver:<versión>' por envío (usa app_version, que la app ya
mandaba pero se ignoraba). El summary lo devuelve como una fila más; la app lo
agrupa aparte como distribución de versiones. Test actualizado.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 08:27:07 +02:00
Carlos Narro
d9f3e91aa8 telemetría: tiempo por pantalla (columna seconds) + Aprende/subsecciones
telemetry_daily gana columna `seconds` (migración idempotente ALTER ADD COLUMN
IF NOT EXISTS para el Postgres ya desplegado; create_all para SQLite fresco). El
POST acepta seconds_by_module y lo agrega por clave (tope 86400/clave/envío); el
summary suma y devuelve seconds por módulo/vista. Las claves ya eran genéricas,
así que Aprende ('aprende', 'aprende:<tema>') y las vistas ('today', '__other__')
entran sin cambios de esquema. Tests actualizados.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 00:01:46 +02:00
Carlos Narro
3092e19b73 telemetría anónima: POST /telemetry (contadores agregados) + GET /telemetry/summary
Tabla telemetry_daily (day, module, active, opens) sin identificador de usuario
ni contenido: solo cuenta cuántas instalaciones tienen cada módulo activo y
cuántas veces lo abren (fila __submissions__ = envíos del día). El POST agrega
por módulo antes de tocar la BD (evita PK duplicada intra-request). create_all
crea la tabla nueva; no necesita migración ALTER. Tests en SQLite en memoria.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 21:27:39 +02:00
Carlos Narro
9157d12f67 recetas B3: DELETE /cookbook/{author_id} (opt-out del respaldo, borra solo privadas)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 08:22:40 +02:00
Carlos Narro
0844287043 recetas Fase B: modelo ampliado (pasos/notas/categoría/autoría/linaje/visibilidad), migración idempotente ALTER, publicar guarda todo, buscar solo públicas, endpoint /cookbook/{author_id}
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 07:13:53 +02:00
Carlos Narro
07fb68a18f fix(review): validar raciones/items, upsert por id (no duplicar), escape LIKE, clamp limit, 404, dedupe en 1 query
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 23:29:57 +02:00
Carlos Narro
b90c48c257 fix(off): usar search-a-licious (el cgi/search.pl legacy da 503 a datacenter)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 19:57:45 +02:00
Carlos Narro
461a1c8a8c fix: arranque resiliente (crea tablas con reintentos; no tumba /health si la BD tarda)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 19:42:24 +02:00
Carlos Narro
150a323a37 feat: autoayuno-api (FastAPI) — alimentos (OFF) y recetas
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 19:35:02 +02:00