Vier Bereiche unter Einstellungen -> System: Adresse und Agent, Kaufmaennisches, Sicherheit sowie Firma und Darstellung. Alles liegt als eine JSON-Zeile in der Tabelle Einstellung; fehlende Felder bekommen ihren Vorgabewert, eine kaputte Zeile legt den Betrieb nicht lahm. Die Werte wirken auch wirklich: Die Dashboard-Adresse und der Melderhythmus landen im ausgelieferten Einzeiler und im systemd-Timer (live geprueft), der Steuersatz in neuen Rechnungspositionen, die Sitzungsdauer im Token, die Firmenangaben im Kopf der PDF-Dateien. Nebenbei geschlossen: die OIDC-Luecke aus #024. Erlaubte Domaenen und ein Schalter gegen automatisch angelegte Konten. Dazu raeumt der Worker nachts nach den eingestellten Fristen auf - der juengste Report je Host bleibt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { prisma } from "@/lib/db";
|
||
import { einstellungen } from "@/server/einstellungen";
|
||
|
||
/**
|
||
* Löscht alte Reports und Protokolleinträge nach den eingestellten Fristen (#025).
|
||
*
|
||
* Der jüngste Report jedes Hosts bleibt **immer** erhalten – sonst stünde ein Host, der lange
|
||
* nicht gemeldet hat, plötzlich ohne jede Angabe da. Eine Frist von 0 heißt: nichts löschen.
|
||
*/
|
||
export async function altdatenLoeschen(jetzt: Date = new Date()): Promise<{
|
||
reports: number;
|
||
protokoll: number;
|
||
}> {
|
||
const { aufbewahrungReportsTage, aufbewahrungAuditTage } = await einstellungen();
|
||
|
||
let reports = 0;
|
||
if (aufbewahrungReportsTage > 0) {
|
||
const grenze = new Date(jetzt.getTime() - aufbewahrungReportsTage * 86_400_000);
|
||
|
||
const neueste = await prisma.report.groupBy({
|
||
by: ["hostId"],
|
||
_max: { erhobenAm: true },
|
||
});
|
||
const behalten = await prisma.report.findMany({
|
||
where: {
|
||
OR: neueste
|
||
.filter((eintrag) => eintrag._max.erhobenAm !== null)
|
||
.map((eintrag) => ({ hostId: eintrag.hostId, erhobenAm: eintrag._max.erhobenAm as Date })),
|
||
},
|
||
select: { id: true },
|
||
});
|
||
|
||
const ergebnis = await prisma.report.deleteMany({
|
||
where: {
|
||
erhobenAm: { lt: grenze },
|
||
id: { notIn: behalten.map((eintrag) => eintrag.id) },
|
||
},
|
||
});
|
||
reports = ergebnis.count;
|
||
}
|
||
|
||
let protokoll = 0;
|
||
if (aufbewahrungAuditTage > 0) {
|
||
const grenze = new Date(jetzt.getTime() - aufbewahrungAuditTage * 86_400_000);
|
||
const ergebnis = await prisma.auditEintrag.deleteMany({ where: { erstelltAm: { lt: grenze } } });
|
||
protokoll = ergebnis.count;
|
||
}
|
||
|
||
return { reports, protokoll };
|
||
}
|