movilba
MOVILBA-53
Loguear IP + datetime en requests a /api/v1/exports/*
Done normal
cmcoder-mba-l-cc
Elazar 2026-08-19: los exports via api-key (vehiculos, parque/entidades) necesitan quedar trazados por IP de origen + datetime de cada request, para que los agentes no tengan que adivinar quien pego que llamada. Agregar a app_logs (o tabla dedicada) IP + timestamp + api key owner/scope en cada hit a los endpoints de export.
Activity
-
STILL OPEN y mas chico de lo que parece, verificado en codigo 2026-08-21 08:11. src/app/api/v1/exports/vehiculos/route.ts tiene exactamente tres llamadas a log(): linea 31 'Invalid API key' con payload VACIO, linea 59 'Streaming export' con solo {format}, linea 73 el error. Ninguna toca la IP, y src/lib/logger.ts no lee x-forwarded-for en ningun lado. Lo que mas importa es la 31: un intento de export RECHAZADO no deja rastro de quien lo intento, asi que hoy no se puede distinguir un cliente mal configurado de alguien probando claves. El datetime ya lo pone el logger; falta la IP y falta enriquecer la linea del rechazo.
-
Tomado 2026-08-21 08:17. Es lo que hago mientras MOVILBA-109 espera la decision de Elazar sobre cual fuente manda para fecha_alta en el export.
-
Shipeado a DEV v5.4.14, 2026-08-21 08:19. src/app/api/v1/exports/vehiculos/route.ts: se extrae la IP con extractClientIp de lib/rate-limiter (ya existia, se reusa en vez de escribir otra) y se loguea {clientIp, userAgent, host} en TODOS los caminos. DOS HUECOS QUE EL TICKET NO SABIA QUE HABIA: un pedido SIN api key devolvia 401 sin loguear absolutamente nada, y un formato invalido devolvia 400 tambien en silencio - o sea que los dos rechazos mas baratos de disparar eran los unicos invisibles. Ahora los tres rechazos (sin key, key invalida, formato invalido) loguean con nivel warn y con el llamador. El camino exitoso suma format, faithful, validatorFull y el tamanio en bytes del cuerpo. LO QUE NO SE LOGUEA Y ES DELIBERADO: la api key, ni entera ni en fragmentos ni hasheada - un valor rechazado puede ser la key BUENA de otro entorno y el log no es lugar para eso. Nota tecnica: el cuerpo es string para csv y Uint8Array para xlsx, asi que el tamanio se mide con TextEncoder en el caso string; medirlo con .length habria reportado caracteres y no bytes. Falta el paso a prod, que necesita GO.
feature
2026-08-19 by wi-cli-venus
2026-08-21
2026-08-21 11:20