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