Skip to content

Commit 204ec45

Browse files
committed
feat(backend): Fixes #80 - Collection Members
1 parent c7e1522 commit 204ec45

14 files changed

Lines changed: 250 additions & 49 deletions

File tree

app/assets/images/default_club_photo.png

Loading

app/assets/images/default_logo.png

Loading

app/backend/server.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ const MONGO_URI = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/saintbarth
1010
// Connexion à MongoDB
1111
mongoose.connect(MONGO_URI)
1212
.then(() => {
13-
console.log('MongoDB connecté');
13+
console.log('MongoDB connected');
1414

1515
// Lancer le serveur
1616
app.listen(PORT, () => {
17-
console.log(`Serveur lancé sur http://localhost:${PORT}`);
17+
console.log(`Server launched on http://localhost:${PORT}`);
1818
});
1919
})
20-
.catch(err => console.error('Erreur MongoDB:', err));
20+
.catch(err => console.error('Error MongoDB:', err));

app/backend/src/app.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import express from 'express';
22
import cors from 'cors';
3-
3+
// Création de l'application Express
44
const app = express();
5-
5+
// Middlewares
66
app.use(cors());
7+
// Pour parser le corps des requêtes en JSON
78
app.use(express.json());
89

9-
// Route test
10+
// Route par défaut pour tester l'API
1011
app.get('/', (req, res) => {
1112
res.send('API Volley fonctionne !');
1213
});
@@ -16,10 +17,13 @@ import usersRoutes from './routes/users.js';
1617
import clubsRoutes from './routes/clubs.js';
1718
import seasonsRoutes from './routes/seasons.js';
1819
import teamsRoutes from './routes/teams.js';
20+
import membersRoutes from './routes/members.js';
1921

22+
// Utiliser les routes
2023
app.use('/api/users', usersRoutes);
2124
app.use('/api/clubs', clubsRoutes);
2225
app.use('/api/seasons', seasonsRoutes);
2326
app.use('/api/teams', teamsRoutes);
27+
app.use('/api/members', membersRoutes);
2428

2529
export default app;

app/backend/src/controllers/clubsController.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const getAllClubs = async (req, res) => {
1414
export const getClubById = async (req, res) => {
1515
try {
1616
const club = await Club.findById(req.params.id);
17-
if (!club) return res.status(404).json({ message: 'Club non trouvé' });
17+
if (!club) return res.status(404).json({ message: 'Club not found' });
1818
res.json(club);
1919
} catch (err) {
2020
res.status(500).json({ message: err.message });
@@ -26,7 +26,7 @@ export const createClub = async (req, res) => {
2626
try {
2727
const club = new Club(req.body);
2828
await club.save();
29-
res.status(201).json({ message: 'Club créé', clubId: club._id });
29+
res.status(201).json({ message: 'Club created', clubId: club._id });
3030
} catch (err) {
3131
res.status(400).json({ message: err.message });
3232
}
@@ -36,11 +36,11 @@ export const createClub = async (req, res) => {
3636
export const updateClub = async (req, res) => {
3737
try {
3838
const club = await Club.findById(req.params.id);
39-
if (!club) return res.status(404).json({ message: 'Club non trouvé' });
39+
if (!club) return res.status(404).json({ message: 'Club not found' });
4040

4141
Object.assign(club, req.body); // Met à jour tous les champs reçus
4242
await club.save();
43-
res.json({ message: 'Club mis à jour' });
43+
res.json({ message: 'Club updated' });
4444
} catch (err) {
4545
res.status(400).json({ message: err.message });
4646
}
@@ -50,8 +50,8 @@ export const updateClub = async (req, res) => {
5050
export const deleteClub = async (req, res) => {
5151
try {
5252
const club = await Club.findByIdAndDelete(req.params.id);
53-
if (!club) return res.status(404).json({ message: 'Club non trouvé' });
54-
res.json({ message: 'Club supprimé' });
53+
if (!club) return res.status(404).json({ message: 'Club not found' });
54+
res.json({ message: 'Club deleted' });
5555
} catch (err) {
5656
res.status(500).json({ message: err.message });
5757
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import Member from '../models/Member.js';
2+
3+
export const getMembers = async (req, res) => {
4+
try {
5+
const members = await Member.find({ isActive: true }).populate('teamId').populate('seasonId');
6+
7+
res.json(members);
8+
} catch (error) {
9+
res.status(500).json({ message: error.message });
10+
}
11+
};
12+
13+
export const getMemberById = async (req, res) => {
14+
try {
15+
const member = await Member.findById(req.params.id).populate('teamId').populate('seasonId');
16+
17+
if (!member) {
18+
return res.status(404).json({ message: 'Member not found' });
19+
}
20+
21+
res.json(member);
22+
} catch (error) {
23+
res.status(500).json({ message: error.message });
24+
}
25+
};
26+
27+
export const createMember = async (req, res) => {
28+
try {
29+
const member = await Member.create(req.body);
30+
res.status(201).json(member);
31+
} catch (error) {
32+
res.status(400).json({ message: error.message });
33+
}
34+
};
35+
36+
export const updateMember = async (req, res) => {
37+
try {
38+
const member = await Member.findByIdAndUpdate(req.params.id, req.body, {
39+
new: true,
40+
runValidators: true,
41+
});
42+
43+
if (!member) {
44+
return res.status(404).json({ message: 'Member not found' });
45+
}
46+
47+
res.json(member);
48+
} catch (error) {
49+
res.status(400).json({ message: error.message });
50+
}
51+
};
52+
53+
export const deactivateMember = async (req, res) => {
54+
try {
55+
const member = await Member.findByIdAndUpdate(req.params.id, { isActive: false }, { new: true });
56+
57+
if (!member) {
58+
return res.status(404).json({ message: 'Member not found' });
59+
}
60+
61+
res.json({ message: 'Member deactivated', member });
62+
} catch (error) {
63+
res.status(500).json({ message: error.message });
64+
}
65+
};
66+
67+
export const deleteMember = async (req, res) => {
68+
try {
69+
const member = await Member.findByIdAndDelete(req.params.id);
70+
71+
if (!member) {
72+
return res.status(404).json({ message: 'Member not found' });
73+
}
74+
75+
res.json({ message: 'Member deleted' });
76+
} catch (error) {
77+
res.status(500).json({ message: error.message });
78+
}
79+
};

app/backend/src/controllers/seasonsController.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const createSeason = async (req, res) => {
55
try {
66
const season = new Season(req.body);
77
await season.save();
8-
res.status(201).json({ message: 'Saison créée', season });
8+
res.status(201).json({ message: 'Season created', season });
99
} catch (err) {
1010
res.status(400).json({ message: err.message });
1111
}
@@ -25,7 +25,7 @@ export const getSeasons = async (req, res) => {
2525
export const getSeasonById = async (req, res) => {
2626
try {
2727
const season = await Season.findById(req.params.id);
28-
if (!season) return res.status(404).json({ message: 'Saison non trouvée' });
28+
if (!season) return res.status(404).json({ message: 'Season not found' });
2929
res.json(season);
3030
} catch (err) {
3131
res.status(500).json({ message: err.message });
@@ -38,8 +38,8 @@ export const updateSeason = async (req, res) => {
3838
const season = await Season.findByIdAndUpdate(req.params.id, req.body, {
3939
new: true,
4040
});
41-
if (!season) return res.status(404).json({ message: 'Saison non trouvée' });
42-
res.json({ message: 'Saison mise à jour', season });
41+
if (!season) return res.status(404).json({ message: 'Season not found' });
42+
res.json({ message: 'Season updated', season });
4343
} catch (err) {
4444
res.status(400).json({ message: err.message });
4545
}
@@ -49,8 +49,8 @@ export const updateSeason = async (req, res) => {
4949
export const deleteSeason = async (req, res) => {
5050
try {
5151
const season = await Season.findByIdAndDelete(req.params.id);
52-
if (!season) return res.status(404).json({ message: 'Saison non trouvée' });
53-
res.json({ message: 'Saison supprimée' });
52+
if (!season) return res.status(404).json({ message: 'Season not found' });
53+
res.json({ message: 'Season deleted' });
5454
} catch (err) {
5555
res.status(500).json({ message: err.message });
5656
}

app/backend/src/controllers/teamsController.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const getTeamById = async (req, res) => {
1515
const team = await Team.findById(req.params.id).populate('seasonId').populate('coachIds');
1616

1717
if (!team) {
18-
return res.status(404).json({ message: 'Équipe non trouvée' });
18+
return res.status(404).json({ message: 'Team not found' });
1919
}
2020

2121
res.json(team);
@@ -41,7 +41,7 @@ export const updateTeam = async (req, res) => {
4141
});
4242

4343
if (!team) {
44-
return res.status(404).json({ message: 'Équipe non trouvée' });
44+
return res.status(404).json({ message: 'Team not found' });
4545
}
4646

4747
res.json(team);
@@ -55,10 +55,10 @@ export const archiveTeam = async (req, res) => {
5555
const team = await Team.findByIdAndUpdate(req.params.id, { isArchived: true }, { new: true });
5656

5757
if (!team) {
58-
return res.status(404).json({ message: 'Équipe non trouvée' });
58+
return res.status(404).json({ message: 'Team not found' });
5959
}
6060

61-
res.json({ message: 'Équipe archivée', team });
61+
res.json({ message: 'Team archived', team });
6262
} catch (error) {
6363
res.status(500).json({ message: error.message });
6464
}
@@ -69,10 +69,10 @@ export const deleteTeam = async (req, res) => {
6969
const team = await Team.findByIdAndDelete(req.params.id);
7070

7171
if (!team) {
72-
return res.status(404).json({ message: 'Équipe non trouvée' });
72+
return res.status(404).json({ message: 'Team not found' });
7373
}
7474

75-
res.json({ message: 'Équipe supprimée' });
75+
res.json({ message: 'Team deleted' });
7676
} catch (error) {
7777
res.status(500).json({ message: error.message });
7878
}

app/backend/src/controllers/usersController.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const getAllUsers = async (req, res) => {
1414
export const getUserById = async (req, res) => {
1515
try {
1616
const user = await User.findById(req.params.id).select('-passwordHash');
17-
if (!user) return res.status(404).json({ message: 'Utilisateur non trouvé' });
17+
if (!user) return res.status(404).json({ message: 'User not found' });
1818
res.json(user);
1919
} catch (err) {
2020
res.status(500).json({ message: err.message });
@@ -28,7 +28,7 @@ export const createUser = async (req, res) => {
2828
const user = new User({ email, role, firstName, lastName });
2929
await user.setPassword(password);
3030
await user.save();
31-
res.status(201).json({ message: 'Utilisateur créé', userId: user._id });
31+
res.status(201).json({ message: 'User created', userId: user._id });
3232
} catch (err) {
3333
res.status(400).json({ message: err.message });
3434
}
@@ -39,7 +39,7 @@ export const updateUser = async (req, res) => {
3939
try {
4040
const { email, role, firstName, lastName, isActive, password } = req.body;
4141
const user = await User.findById(req.params.id);
42-
if (!user) return res.status(404).json({ message: 'Utilisateur non trouvé' });
42+
if (!user) return res.status(404).json({ message: 'User not found' });
4343

4444
if (email) user.email = email;
4545
if (role) user.role = role;
@@ -49,7 +49,7 @@ export const updateUser = async (req, res) => {
4949
if (password) await user.setPassword(password);
5050

5151
await user.save();
52-
res.json({ message: 'Utilisateur mis à jour' });
52+
res.json({ message: 'User updated' });
5353
} catch (err) {
5454
res.status(400).json({ message: err.message });
5555
}
@@ -59,8 +59,8 @@ export const updateUser = async (req, res) => {
5959
export const deleteUser = async (req, res) => {
6060
try {
6161
const user = await User.findByIdAndDelete(req.params.id);
62-
if (!user) return res.status(404).json({ message: 'Utilisateur non trouvé' });
63-
res.json({ message: 'Utilisateur supprimé' });
62+
if (!user) return res.status(404).json({ message: 'User not found' });
63+
res.json({ message: 'User deleted' });
6464
} catch (err) {
6565
res.status(500).json({ message: err.message });
6666
}

app/backend/src/models/Club.js

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,69 @@ import mongoose from 'mongoose';
22

33
const ClubSchema = new mongoose.Schema(
44
{
5-
name: { type: String, required: true },
6-
subtitle: { type: String, default: '' },
7-
homeDescription: { type: String, default: '' },
8-
clubDescription: { type: String, default: '' },
9-
ownerDescription: { type: String, default: '' },
10-
logo: { type: String, default: '' }, // URL ou chemin du logo
5+
name: {
6+
type: String,
7+
default: 'Saint Barthélémy Volley-Ball',
8+
required: true,
9+
},
10+
subtitle: {
11+
type: String,
12+
default: 'Passion, Performance, Partage', // Slogan plus dynamique
13+
required: true,
14+
},
15+
homeDescription: {
16+
type: String,
17+
default:
18+
'Bienvenue sur le site officiel du Saint Barthélémy Volley-Ball, le club où la passion du volley rencontre l’esprit d’équipe et la convivialité.',
19+
},
20+
clubDescription: {
21+
type: String,
22+
default:
23+
'Le club propose des entraînements pour tous les niveaux, des jeunes aux seniors, dans un esprit de partage et de progression.',
24+
},
25+
ownerDescription: {
26+
type: String,
27+
default:
28+
'Notre équipe dirigeante est composée de bénévoles passionnés, engagés pour le développement du volley-ball à Saint-Barthélémy.',
29+
},
30+
logo: {
31+
type: String,
32+
default: '/assets/images/default_logo.png', // chemin local par défaut
33+
},
1134
photo: {
12-
type: String, // URL Nextcloud
13-
trim: true,
35+
type: String,
36+
default: '/assets/images/default_club_photo.png', // chemin local par défaut
1437
},
15-
email: { type: String, default: '' },
16-
phone: { type: String, default: '' },
17-
address: { type: String, default: '' },
38+
email: { type: String, default: 'contact@saintbarthvolley.fr' },
39+
phone: { type: String, default: '(+33) 02 41 XX XX XX' },
40+
address: { type: String, default: 'Saint-Barthélemy, Caraïbes' },
1841

1942
// Liens sociaux
2043
social_links: {
2144
facebook: { type: String, default: '' },
2245
instagram: { type: String, default: '' },
2346
youtube: { type: String, default: '' },
2447
sporteasy: { type: String, default: '' },
48+
clubMerch: { type: String, default: '' },
49+
clubRegistration: { type: String, default: '' },
2550
website: { type: String, default: '' },
2651
other: { type: String, default: '' },
2752
},
2853

2954
// Informations légales
3055
legal_info: {
31-
associationName: { type: String, default: '' },
32-
legalForm: { type: String, default: '' },
56+
associationName: { type: String, default: 'Saint Barth Volley-Ball' },
57+
legalForm: { type: String, default: 'Association loi 1901' },
3358
siret: { type: String, default: '' },
3459
rna: { type: String, default: '' },
35-
headOffice: { type: String, default: '' },
60+
headOffice: { type: String, default: 'Saint-Barthélemy' },
3661
publicationDate: { type: Date, default: null },
3762
responsible: { type: String, default: '' },
3863
hostingProvider: { type: String, default: '' },
3964
updatedAt: { type: Date, default: null },
4065
},
4166
},
4267
{ timestamps: true },
43-
); // createdAt et updatedAt automatiques
68+
);
4469

4570
export default mongoose.model('Club', ClubSchema);

0 commit comments

Comments
 (0)