Skip to content

Commit fafcb92

Browse files
committed
-feat : Implémentation du tableau de bord Admin avec gestion des utilisateurs et des tournois**
- Ajout du composant AdminDashboard pour les fonctionnalités administratives. - Création de la AdminSideba` pour la navigation entre les sections Utilisateurs, Tournois et Création de tournoi. - Développement du composant CreateTournament pour la création de tournois avec sélection de date et d'équipes. - Implémentation du composant TournamentsList pour l'affichage et la gestion des tournois. - Ajout du composant `UsersList` pour la gestion des utilisateurs, y compris la mise à jour des rôles et la suppression. - Introduction des stores Zustand pour la gestion des données des tournois et des utilisateurs. - Intégration des appels API pour la récupération, la mise à jour et la suppression des tournois et des utilisateurs. - Ajout d’un utilitaire de liste de jeux pour la sélection dans les tournois.
1 parent 38b5744 commit fafcb92

31 files changed

Lines changed: 2294 additions & 1413 deletions

api_backend/controllers/auth.controller.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export const signup = async (req, res) => {
7474
//jwt
7575
generateTokenAndSetCookie(res, user._id);
7676

77-
await sendVerificationEmail(user.email, verificationToken);
77+
// await sendVerificationEmail(user.email, verificationToken);
7878

7979
res.status(201).json({
8080
sucess: true,
@@ -85,6 +85,8 @@ export const signup = async (req, res) => {
8585
}
8686
})
8787

88+
89+
8890
} catch (error) {
8991
return res.status(400).json({sucess:false, message: error.message});
9092
}
@@ -284,4 +286,4 @@ export const updateProfile = async (req, res) => {
284286
console.error("Erreur updateProfile:", error);
285287
return res.status(500).json({ message: "Erreur serveur" });
286288
}
287-
};
289+
};
Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,333 @@
1+
import Tournois from '../models/tournois.model.js';
2+
import Match from '../models/match.model.js';
3+
import Team from '../models/team.model.js';
4+
import Inscription from '../models/inscription.model.js';
5+
6+
export const inscriptionTournois = async (req, res) => {
7+
try {
8+
const { team_id, tournois_id } = req.body;
9+
10+
// Vérifie si cette équipe est déjà inscrite à ce tournoi
11+
const exists = await Inscription.findOne({ team_id, tournois_id });
12+
if (exists) {
13+
return res.status(400).json({ message: "Cette équipe est déjà inscrite à ce tournoi." });
14+
}
15+
16+
const inscription = new Inscription({ team_id, tournois_id });
17+
await inscription.save();
18+
19+
res.status(201).json({ message: "Équipe inscrite avec succès.", inscription });
20+
} catch (err) {
21+
res.status(500).json({ message: "Erreur serveur", error: err.message });
22+
}
23+
}
24+
25+
26+
export const genereMatchs = async (req, res) => {
27+
const tournoisId = req.params.id;
28+
29+
try {
30+
// Vérifier que le tournoi existe
31+
const tournoi = await Tournois.findById(tournoisId);
32+
if (!tournoi) {
33+
return res.status(404).json({ message: "Tournoi non trouvé" });
34+
}
35+
36+
// Récupérer les inscriptions avec population des équipes
37+
const inscriptions = await Inscription.find({ tournois_id: tournoisId })
38+
.populate('team_id')
39+
.lean();
40+
41+
// Vérifier que les inscriptions ont bien des équipes
42+
const validInscriptions = inscriptions.filter(ins => ins.team_id);
43+
if (validInscriptions.length !== inscriptions.length) {
44+
console.warn("Certaines inscriptions n'ont pas d'équipe valide");
45+
}
46+
47+
const teams = validInscriptions.map(ins => ins.team_id._id); // Utiliser _id directement
48+
49+
if (teams.length < 2) {
50+
return res.status(400).json({
51+
message: "Pas assez d'équipes inscrites",
52+
required: 2,
53+
registered: teams.length
54+
});
55+
}
56+
57+
// Supprimer anciens matchs
58+
await Match.deleteMany({ tournois_id: tournoisId });
59+
60+
// Créer les matchs - version améliorée avec gestion des byes
61+
const matchesToCreate = [];
62+
for (let i = 0; i < teams.length; i += 2) {
63+
const match = {
64+
tournois_id: tournoisId,
65+
team1_id: teams[i],
66+
round: 1,
67+
status: 'pending',
68+
createdAt: new Date()
69+
};
70+
71+
// Gérer le cas d'un nombre impair d'équipes
72+
if (i + 1 < teams.length) {
73+
match.team2_id = teams[i + 1];
74+
} else {
75+
// Équipe seule - victoire automatique
76+
match.status = 'completed';
77+
match.winner_id = teams[i];
78+
}
79+
80+
matchesToCreate.push(match);
81+
}
82+
83+
// Créer les matchs en base
84+
const createdMatches = await Match.insertMany(matchesToCreate);
85+
86+
// Mettre à jour le tournoi avec les nouveaux matchs
87+
await Tournois.findByIdAndUpdate(tournoisId, {
88+
$set: {
89+
matches: createdMatches.map(m => m._id),
90+
status: 'en cours'
91+
}
92+
});
93+
94+
res.status(201).json({
95+
success: true,
96+
message: `${createdMatches.length} matchs générés`,
97+
matches: createdMatches
98+
});
99+
100+
} catch (error) {
101+
console.error("Erreur détaillée:", error);
102+
res.status(500).json({
103+
message: "Erreur lors de la génération des matchs",
104+
error: error.message,
105+
stack: process.env.NODE_ENV === 'development' ? error.stack : undefined
106+
});
107+
}
108+
};
109+
110+
111+
export const getMatchsAvecEquipes = async (req, res) => {
112+
try {
113+
const tournoisId = req.params.id;
114+
115+
if (!tournoisId) {
116+
return res.status(400).json({ message: "ID du tournoi manquant" });
117+
}
118+
119+
const matches = await Match.find({ tournois_id: tournoisId })
120+
.populate('team1_id')
121+
.populate('team2_id')
122+
.populate('winner_id');
123+
124+
res.json({ matchs: matches });
125+
} catch (err) {
126+
console.error("Erreur lors du chargement des matchs :", err);
127+
res.status(500).json({ message: "Erreur lors du chargement des matchs" });
128+
}
129+
};
130+
131+
132+
export const resetTournois = async (req, res) => {
133+
try {
134+
await Match.deleteMany({ tournois_id: req.params.id });
135+
res.status(200).json({ message: 'Matchs supprimés' });
136+
} catch (err) {
137+
res.status(500).json({ message: 'Erreur suppression matchs' });
138+
}
139+
};
140+
141+
// Créer un nouveau tournoi
142+
export const createTournois = async (req, res) => {
143+
try {
144+
const { nom, jeu, dateDebut, dateFin, equipesParticipantes } = req.body;
145+
146+
const newTournois = new Tournois({
147+
nom,
148+
jeu,
149+
dateDebut: dateDebut ? new Date(dateDebut) : null,
150+
equipesParticipantes: equipesParticipantes || []
151+
});
152+
153+
const savedTournois = await newTournois.save();
154+
res.status(201).json(savedTournois);
155+
} catch (err) {
156+
res.status(400).json({ message: err.message });
157+
}
158+
};
159+
160+
// Récupérer tous les tournois
161+
export const getAllTournois = async (req, res) => {
162+
try {
163+
const tournois = await Tournois.find()
164+
.populate('matches')
165+
.populate('matchEnCours')
166+
.populate('equipesParticipantes')
167+
.populate('gagnant');
168+
res.json(tournois);
169+
} catch (err) {
170+
res.status(500).json({ message: err.message });
171+
}
172+
};
173+
174+
// Récupérer un tournoi par son ID
175+
export const getTournoisById = async (req, res) => {
176+
try {
177+
const tournois = await Tournois.findById(req.params.id)
178+
.populate({
179+
path: 'matches',
180+
populate: [
181+
{ path: 'team1_id', model: 'Team' },
182+
{ path: 'team2_id', model: 'Team' },
183+
{ path: 'winner_id', model: 'Team' }
184+
]
185+
})
186+
.populate('matchEnCours')
187+
.populate('equipesParticipantes')
188+
.populate('gagnant');
189+
190+
if (!tournois) {
191+
return res.status(404).json({ message: 'Tournoi non trouvé' });
192+
}
193+
res.json(tournois);
194+
} catch (err) {
195+
res.status(500).json({ message: err.message });
196+
}
197+
};
198+
199+
// Mettre à jour un tournoi
200+
export const updateTournois = async (req, res) => {
201+
try {
202+
const { nom, jeu, status, matchEnCours, equipesParticipantes, gagnant } = req.body;
203+
204+
const updatedTournois = await Tournois.findByIdAndUpdate(
205+
req.params.id,
206+
{
207+
nom,
208+
jeu,
209+
status,
210+
matchEnCours,
211+
equipesParticipantes,
212+
gagnant,
213+
// Mettre à jour la date de fin si le statut est "terminé"
214+
...(status === 'terminé' && { dateFin: new Date() }),
215+
// Mettre à jour la date de début si le statut passe à "en cours"
216+
...(status === 'en cours' && !this.dateDebut && { dateDebut: new Date() })
217+
},
218+
{ new: true }
219+
).populate('matches matchEnCours equipesParticipantes gagnant');
220+
221+
if (!updatedTournois) {
222+
return res.status(404).json({ message: 'Tournoi non trouvé' });
223+
}
224+
res.json(updatedTournois);
225+
} catch (err) {
226+
res.status(400).json({ message: err.message });
227+
}
228+
};
229+
230+
// Supprimer un tournoi
231+
export const deleteTournois = async (req, res) => {
232+
try {
233+
const deletedTournois = await Tournois.findByIdAndDelete(req.params.id);
234+
if (!deletedTournois) {
235+
return res.status(404).json({ message: 'Tournoi non trouvé' });
236+
}
237+
res.json({ message: 'Tournoi supprimé avec succès' });
238+
} catch (err) {
239+
res.status(500).json({ message: err.message });
240+
}
241+
};
242+
243+
// Ajouter un match à un tournoi
244+
export const addMatchToTournois = async (req, res) => {
245+
try {
246+
const { team1_id, team2_id, round } = req.body;
247+
248+
// Vérifier que le tournoi existe
249+
const tournois = await Tournois.findById(req.params.id);
250+
if (!tournois) {
251+
return res.status(404).json({ message: 'Tournoi non trouvé' });
252+
}
253+
254+
// Créer le nouveau match
255+
const newMatch = new Match({
256+
tournois_id: req.params.id,
257+
team1_id,
258+
team2_id,
259+
round
260+
});
261+
262+
const savedMatch = await newMatch.save();
263+
264+
// Ajouter le match au tournoi
265+
tournois.matches.push(savedMatch._id);
266+
await tournois.save();
267+
268+
res.status(201).json(savedMatch);
269+
} catch (err) {
270+
res.status(400).json({ message: err.message });
271+
}
272+
};
273+
274+
// Définir le match en cours
275+
export const setCurrentMatch = async (req, res) => {
276+
try {
277+
const { matchId } = req.body;
278+
279+
// Vérifier que le match existe
280+
const match = await Match.findById(matchId);
281+
if (!match) {
282+
return res.status(404).json({ message: 'Match non trouvé' });
283+
}
284+
285+
// Vérifier que le match appartient au tournoi
286+
if (match.tournois_id.toString() !== req.params.id) {
287+
return res.status(400).json({ message: 'Ce match ne fait pas partie de ce tournoi' });
288+
}
289+
290+
// Mettre à jour le tournoi
291+
const updatedTournois = await Tournois.findByIdAndUpdate(
292+
req.params.id,
293+
{ matchEnCours: matchId },
294+
{ new: true }
295+
).populate('matchEnCours');
296+
297+
res.json(updatedTournois);
298+
} catch (err) {
299+
res.status(400).json({ message: err.message });
300+
}
301+
};
302+
303+
// Ajouter une équipe au tournoi
304+
export const addTeamToTournois = async (req, res) => {
305+
try {
306+
const { teamId } = req.body;
307+
308+
// Vérifier que l'équipe existe
309+
const team = await Team.findById(teamId);
310+
if (!team) {
311+
return res.status(404).json({ message: 'Équipe non trouvée' });
312+
}
313+
314+
// Vérifier que le tournoi existe
315+
const tournois = await Tournois.findById(req.params.id);
316+
if (!tournois) {
317+
return res.status(404).json({ message: 'Tournoi non trouvé' });
318+
}
319+
320+
// Vérifier que l'équipe n'est pas déjà inscrite
321+
if (tournois.equipesParticipantes.includes(teamId)) {
322+
return res.status(400).json({ message: 'Cette équipe est déjà inscrite au tournoi' });
323+
}
324+
325+
// Ajouter l'équipe au tournoi
326+
tournois.equipesParticipantes.push(teamId);
327+
const updatedTournois = await tournois.save();
328+
329+
res.json(updatedTournois);
330+
} catch (err) {
331+
res.status(400).json({ message: err.message });
332+
}
333+
};

0 commit comments

Comments
 (0)