Files
THE-TIP-TOP/backend/src/controllers/game.controller.js
Emma781227 902e304a5e changement
2026-07-23 13:45:53 +02:00

130 lines
3.0 KiB
JavaScript

const prisma = require("../config/prisma");
const { getGameWindow, expireOverdueClaims } = require("../utils/gameWindow");
const participate = async (req, res) => {
try {
const { code } = req.body;
const userId = req.user.id;
const gameWindow = await getGameWindow();
if (!gameWindow.isOpen) {
return res.status(410).json({
message: "Le jeu-concours est terminé. Vous ne pouvez plus tester de code ni réclamer de lot.",
});
}
const ticket = await prisma.ticket.findUnique({
where: { code },
include: {
lot: true,
},
});
if (!ticket) {
return res.status(404).json({
message: "Code invalide.",
});
}
if (ticket.isUsed) {
return res.status(409).json({
message: "Ce code a déjà été utilisé.",
});
}
const result = await prisma.$transaction(async (tx) => {
const updatedTicket = await tx.ticket.update({
where: { id: ticket.id },
data: {
isUsed: true,
usedAt: new Date(),
userId,
},
include: {
lot: true,
},
});
const participation = await tx.participation.create({
data: {
userId,
ticketId: updatedTicket.id,
lotId: updatedTicket.lotId,
},
});
const claim = await tx.claim.create({
data: {
participationId: participation.id,
status: "PENDING",
},
});
return {
ticket: updatedTicket,
participation,
claim,
};
});
return res.status(201).json({
message: "Participation enregistrée avec succès.",
gain: {
name: result.ticket.lot.name,
description: result.ticket.lot.description,
value: result.ticket.lot.value,
},
claim: {
id: result.claim.id,
status: result.claim.status,
},
});
} catch (error) {
console.error("Erreur participation:", error);
return res.status(500).json({
message: "Erreur serveur lors de la participation.",
});
}
};
const myGains = async (req, res) => {
try {
const userId = req.user.id;
await expireOverdueClaims();
const participations = await prisma.participation.findMany({
where: { userId },
include: {
ticket: true,
lot: true,
claim: true,
},
orderBy: {
createdAt: "desc",
},
});
return res.json({
gains: participations.map((participation) => ({
participationId: participation.id,
ticketCode: participation.ticket.code,
lot: participation.lot.name,
description: participation.lot.description,
value: participation.lot.value,
claimStatus: participation.claim?.status,
wonAt: participation.createdAt,
})),
});
} catch (error) {
console.error("Erreur historique gains:", error);
return res.status(500).json({
message: "Erreur serveur lors de la récupération des gains.",
});
}
};
module.exports = {
participate,
myGains,
};