changement

This commit is contained in:
Emma781227
2026-07-23 13:45:53 +02:00
parent 7f816c165b
commit 902e304a5e
8 changed files with 131 additions and 4 deletions

View File

@@ -0,0 +1,51 @@
const prisma = require("../config/prisma");
const GAME_DURATION_DAYS = 30;
const CLAIM_EXTENSION_DAYS = 30;
const DAY_MS = 24 * 60 * 60 * 1000;
// Fenêtre pendant laquelle un joueur peut à la fois tester son code et
// réclamer son lot : 30 jours de jeu + 30 jours supplémentaires à compter
// de startDate. Tant qu'aucune GameSettings n'existe, le jeu est considéré
// comme non démarré et donc ouvert (comportement de dev par défaut).
async function getGameWindow() {
const settings = await prisma.gameSettings.findFirst({ orderBy: { id: "asc" } });
if (!settings) {
return {
configured: false,
startDate: null,
participationDeadline: null,
claimDeadline: null,
isOpen: true,
};
}
const participationDeadline = new Date(settings.startDate.getTime() + GAME_DURATION_DAYS * DAY_MS);
const claimDeadline = new Date(
settings.startDate.getTime() + (GAME_DURATION_DAYS + CLAIM_EXTENSION_DAYS) * DAY_MS
);
return {
configured: true,
startDate: settings.startDate,
participationDeadline,
claimDeadline,
isOpen: new Date() <= claimDeadline,
};
}
// Bascule en CANCELLED les gains PENDING non réclamés une fois la fenêtre
// fermée. Appelé au fil de l'eau (pas de cron) avant toute lecture/écriture
// de claims, ce qui suffit pour ce projet.
async function expireOverdueClaims() {
const window = await getGameWindow();
if (window.isOpen) return;
await prisma.claim.updateMany({
where: { status: "PENDING" },
data: { status: "CANCELLED" },
});
}
module.exports = { getGameWindow, expireOverdueClaims };