Merge pull request 'feat(cron): regenerate-variants' (#68) from feat/cron-regenerate-variants into main
All checks were successful
CI / test (push) Successful in 2m11s

This commit is contained in:
tarzzan 2026-06-02 01:27:22 +00:00
commit b8b421e839

View file

@ -5,10 +5,11 @@
import "server-only";
import { BookingStatus } from "@/generated/prisma/enums";
import { BookingStatus, MediaType } from "@/generated/prisma/enums";
import { prisma } from "@/lib/prisma";
import { recordAudit } from "@/lib/admin/audit";
import { purgeExpiredResetTokens } from "@/lib/password-reset";
import { generateImageVariants } from "@/lib/variants-server";
const PENDING_TTL_DAYS = 7;
@ -67,9 +68,44 @@ export async function listUpcomingArrivalsInThreeDays() {
});
}
/** Régénère les variantes responsives pour tous les Media PHOTO en base. */
export async function regenerateAllVariants(): Promise<{ scanned: number; ok: number; skipped: number; failed: number }> {
const medias = await prisma.media.findMany({
where: { type: MediaType.PHOTO },
select: { id: true, s3Key: true },
});
let ok = 0;
let skipped = 0;
let failed = 0;
for (const m of medias) {
const ext = m.s3Key.split(".").pop()?.toLowerCase();
if (!ext || !["jpg", "jpeg", "png", "webp", "avif"].includes(ext)) {
skipped++;
continue;
}
const mime =
ext === "png" ? "image/png" :
ext === "webp" ? "image/webp" :
ext === "avif" ? "image/avif" :
"image/jpeg";
const result = await generateImageVariants({ originalS3Key: m.s3Key, mime });
if (result.skipped) skipped++;
else if (result.results.every((r) => r.ok)) ok++;
else failed++;
}
await recordAudit({
scope: "cron",
event: "variants.regenerate-all",
actorEmail: null,
details: { scanned: medias.length, ok, skipped, failed },
});
return { scanned: medias.length, ok, skipped, failed };
}
export const SCHEDULED_TASKS = {
"auto-cancel-stale-pending": autoCancelStalePending,
"purge-reset-tokens": purgeResetTokens,
"regenerate-variants": regenerateAllVariants,
} as const;
export type ScheduledTaskName = keyof typeof SCHEDULED_TASKS;