130 lines
3.0 KiB
JavaScript
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,
|
|
}; |