// @ts-check
/**
* ageUpdate-Statistik im geteilten Redis.
*
* Der ageUpdate-SystemBot (basic-bots) schreibt nach jedem nächtlichen Lauf das
* Ergebnis (Anzahl aktualisierter Personen) hierhin. members-back liest die Werte
* für die Admin-Anzeige (`GET /person/ageUpdate/stats`).
*
* Beide Seiten nutzen denselben zentralen Redis-Client aus @commtool/shared-auth,
* daher genügt der einfache Key-Aufbau unten.
*
* Aufbewahrung: 7 Tage (TTL) — die History zeigt die letzten 7 Läufe je Orga.
*/
import { getRedisClient } from '@commtool/shared-auth';
const TTL_SECONDS = 7 * 24 * 60 * 60; // 7 Tage
/**
* Liefert den geteilten Redis-Client. Bewusst lazy: `getRedisClient()` wirft,
* falls `configureAuth()` noch nicht gelaufen ist — das darf beim Modul-Import
* nicht passieren, sondern erst beim tatsächlichen Request (nach Serverstart).
* @returns {import('redis').RedisClientType}
*/
const getClient = () => getRedisClient();
/**
* Key-Präfix für die ageUpdate-Stats (gemeinsam von Bot + members-back genutzt).
*
* Per Env überschreibbar (`AGE_UPDATE_STATS_PREFIX`), damit parallele Umgebungen
* (z.B. Test-members-back neben Produktion) in SEPARATE Redis-Keys lesen und die
* Produktions-Statistik nicht mit Test-Läufen vermischen. Produktion nutzt den
* Default 'ageUpdate:stats:' (= Key-Aufbau des ageUpdate-SystemBots in basic-bots).
*/
export const AGE_UPDATE_STATS_PREFIX = process.env.AGE_UPDATE_STATS_PREFIX || 'ageUpdate:stats:';
/**
* Redis-Key für eine Organisation.
* @param {string} orgUID - Organisation (UUID-Format, wie im Bot/apiProvider)
* @returns {string}
*/
export const statsKey = (orgUID) => `${AGE_UPDATE_STATS_PREFIX}${orgUID}`;
// Hinweis: Das Schreiben übernimmt der ageUpdate-SystemBot (basic-bots) direkt in
// denselben Redis (Key-Aufbau in src/SystemBots/ageUpdate/index.js). members-back
// ist hier nur der Lese-Seite (Admin-Anzeige), daher gibt es hier bewusst kein record.
/**
* Stats für eine Organisation lesen.
* Wird von members-back (`GET /person/ageUpdate/stats`) aufgerufen.
*
* @param {string} orgUID - Organisation (UUID-Format)
* @returns {Promise<{ runs: Array<{ts:number, count:number, error?:string}>, lastRun: {ts:number, count:number}|null }>}
*/
export const readAgeUpdateStats = async (orgUID) => {
const key = statsKey(orgUID);
let client;
try {
client = getClient();
} catch {
// Redis noch nicht initialisiert → keine Statistik verfügbar
return { runs: [], lastRun: null };
}
const raw = await client.lRange(key, 0, 6).catch(() => []);
const runs = raw
.map((item) => {
try {
return JSON.parse(item);
} catch {
return null;
}
})
.filter((item) => item !== null);
return {
runs,
lastRun: runs[0] ?? null,
};
};