diff --git a/src/routes/v2/peruserver/trucky/live-jobs/index.js b/src/routes/v2/peruserver/trucky/live-jobs/index.js index 1a74c50..a00029a 100644 --- a/src/routes/v2/peruserver/trucky/live-jobs/index.js +++ b/src/routes/v2/peruserver/trucky/live-jobs/index.js @@ -1200,8 +1200,27 @@ router.get('/', async (req, res) => { errors: options.includeErrors ? snapshot.errors : [], }; + // Etiqueta de estado del backup + let backup_status = 'empty'; + if (responsePayload.jobs && Array.isArray(responsePayload.jobs)) { + if (responsePayload.jobs.length === 0) { + backup_status = 'empty'; + } else if (responsePayload.errors && responsePayload.errors.length === responsePayload.jobs.length) { + backup_status = 'corrupt'; + } else if (responsePayload.jobs.length > 0) { + backup_status = 'valid'; + } else { + backup_status = 'invalid'; + } + } else if (responsePayload.error) { + backup_status = 'error'; + } + + // Guardar snapshot en Supabase + try { await saveSnapshotInSupabase({ days: options.days, companiesSource: options.companiesSource }, responsePayload); } catch (e) { /* ignora error de backup */ } + res.set('Cache-Control', 'public, s-maxage=30, stale-while-revalidate=15'); - return res.json(responsePayload); + return res.json({ ...responsePayload, backup_status }); } catch (error) { const message = error instanceof Error ? error.message : 'Error desconocido'; res.set('Cache-Control', 'no-store, no-cache'); diff --git a/src/routes/v2/peruserver/trucky/top-km/index.js b/src/routes/v2/peruserver/trucky/top-km/index.js index 4615830..ccb3b87 100644 --- a/src/routes/v2/peruserver/trucky/top-km/index.js +++ b/src/routes/v2/peruserver/trucky/top-km/index.js @@ -670,8 +670,28 @@ router.get('/', async (req, res) => { } if (entry.payload) { + // Etiqueta de estado del backup + let backup_status = 'empty'; + if (entry.payload.items && Array.isArray(entry.payload.items)) { + if (entry.payload.items.length === 0) { + backup_status = 'empty'; + } else if (entry.payload.count_companies_errors === entry.payload.items.length) { + backup_status = 'corrupt'; + } else if (entry.payload.count_companies_processed > 0) { + backup_status = 'valid'; + } else { + backup_status = 'invalid'; + } + } else if (entry.payload.ok === false) { + backup_status = 'error'; + } + + // Guardar payload en Supabase + try { await saveBackupPayload(params, entry.payload); } catch (e) { /* ignora error de backup */ } + return res.json({ ...entry.payload, + backup_status, cache: { hasPayload: true, refreshing: Boolean(entry.inFlight), diff --git a/src/routes/v2/peruserver/trucky/top-km/monthly.js b/src/routes/v2/peruserver/trucky/top-km/monthly.js index 6e128e0..3f998c7 100644 --- a/src/routes/v2/peruserver/trucky/top-km/monthly.js +++ b/src/routes/v2/peruserver/trucky/top-km/monthly.js @@ -588,9 +588,28 @@ router.get('/', async (req, res) => { } } + // Etiqueta de estado del backup + let backup_status = 'empty'; + if (entry.payload && Array.isArray(entry.payload.items)) { + if (entry.payload.items.length === 0) { + backup_status = 'empty'; + } else if (entry.payload.count_companies_errors === entry.payload.items.length) { + backup_status = 'corrupt'; + } else if (entry.payload.count_companies_processed > 0) { + backup_status = 'valid'; + } else { + backup_status = 'invalid'; + } + } else if (entry.payload && entry.payload.ok === false) { + backup_status = 'error'; + } + + // Siempre guardar el payload retornado en Supabase if (entry.payload) { + try { await saveBackupPayload(params, entry.payload); } catch (e) { /* ignora error de backup */ } return res.json({ ...entry.payload, + backup_status, cache: { hasPayload: true, refreshing: Boolean(entry.inFlight),