Skip to content

Commit ad129dc

Browse files
committed
feat(backend): Fixes #88 - Collection Partners
1 parent ad3ab2c commit ad129dc

4 files changed

Lines changed: 153 additions & 2 deletions

File tree

app/backend/src/app.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ import seasonsRoutes from './routes/seasons.js';
1919
import teamsRoutes from './routes/teams.js';
2020
import membersRoutes from './routes/members.js';
2121
import newsRoutes from './routes/news.js';
22-
import albumRoutes from './routes/albums.js';
22+
import albumsRoutes from './routes/albums.js';
2323
import mediasRoutes from './routes/medias.js';
24+
import partnersRoutes from './routes/partners.js';
2425

2526
// Utiliser les routes
2627
app.use('/api/users', usersRoutes);
@@ -29,7 +30,8 @@ app.use('/api/seasons', seasonsRoutes);
2930
app.use('/api/teams', teamsRoutes);
3031
app.use('/api/members', membersRoutes);
3132
app.use('/api/news', newsRoutes);
32-
app.use('/api/albums', albumRoutes);
33+
app.use('/api/albums', albumsRoutes);
3334
app.use('/api/medias', mediasRoutes);
35+
app.use('/api/partners', partnersRoutes);
3436

3537
export default app;
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import Partner from '../models/Partner.js';
2+
3+
// Liste des partenaires (actifs par défaut)
4+
export const getPartners = async (req, res) => {
5+
try {
6+
const filter = req.query.all === 'true' ? {} : { isActive: true };
7+
8+
const partners = await Partner.find(filter).sort({ priority: 1, createdAt: -1 });
9+
10+
res.json(partners);
11+
} catch (error) {
12+
res.status(500).json({ message: error.message });
13+
}
14+
};
15+
16+
// Partenaire par ID
17+
export const getPartnerById = async (req, res) => {
18+
try {
19+
const partner = await Partner.findById(req.params.id);
20+
21+
if (!partner) {
22+
return res.status(404).json({ message: 'Partenaire non trouvé' });
23+
}
24+
25+
res.json(partner);
26+
} catch (error) {
27+
res.status(500).json({ message: error.message });
28+
}
29+
};
30+
31+
// Créer un partenaire
32+
export const createPartner = async (req, res) => {
33+
try {
34+
const partner = await Partner.create(req.body);
35+
res.status(201).json(partner);
36+
} catch (error) {
37+
res.status(400).json({ message: error.message });
38+
}
39+
};
40+
41+
// Mettre à jour un partenaire
42+
export const updatePartner = async (req, res) => {
43+
try {
44+
const partner = await Partner.findByIdAndUpdate(req.params.id, req.body, {
45+
new: true,
46+
runValidators: true,
47+
});
48+
49+
if (!partner) {
50+
return res.status(404).json({ message: 'Partenaire non trouvé' });
51+
}
52+
53+
res.json(partner);
54+
} catch (error) {
55+
res.status(400).json({ message: error.message });
56+
}
57+
};
58+
59+
// Activer / désactiver
60+
export const togglePartnerStatus = async (req, res) => {
61+
try {
62+
const partner = await Partner.findById(req.params.id);
63+
64+
if (!partner) {
65+
return res.status(404).json({ message: 'Partenaire non trouvé' });
66+
}
67+
68+
partner.isActive = !partner.isActive;
69+
await partner.save();
70+
71+
res.json(partner);
72+
} catch (error) {
73+
res.status(500).json({ message: error.message });
74+
}
75+
};
76+
77+
// Supprimer un partenaire
78+
export const deletePartner = async (req, res) => {
79+
try {
80+
const partner = await Partner.findByIdAndDelete(req.params.id);
81+
82+
if (!partner) {
83+
return res.status(404).json({ message: 'Partenaire non trouvé' });
84+
}
85+
86+
res.json({ message: 'Partenaire supprimé' });
87+
} catch (error) {
88+
res.status(500).json({ message: error.message });
89+
}
90+
};

app/backend/src/models/Partner.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import mongoose from 'mongoose';
2+
3+
const partnerSchema = new mongoose.Schema(
4+
{
5+
name: {
6+
type: String,
7+
required: true,
8+
trim: true,
9+
},
10+
description: {
11+
type: String,
12+
default: '',
13+
trim: true,
14+
},
15+
logo: {
16+
type: String, // URL (Nextcloud ou externe)
17+
required: true,
18+
trim: true,
19+
},
20+
website: {
21+
type: String,
22+
default: '',
23+
trim: true,
24+
},
25+
priority: {
26+
type: Number,
27+
default: 0, // non required → 0 = ordre neutre
28+
},
29+
isActive: {
30+
type: Boolean,
31+
default: true,
32+
},
33+
},
34+
{
35+
timestamps: true,
36+
},
37+
);
38+
39+
export default mongoose.model('Partner', partnerSchema);

app/backend/src/routes/partners.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import express from 'express';
2+
import {
3+
getPartners,
4+
getPartnerById,
5+
createPartner,
6+
updatePartner,
7+
togglePartnerStatus,
8+
deletePartner,
9+
} from '../controllers/partnersController.js';
10+
11+
const router = express.Router();
12+
13+
router.get('/', getPartners);
14+
router.get('/:id', getPartnerById);
15+
router.post('/', createPartner);
16+
router.put('/:id', updatePartner);
17+
router.patch('/:id/toggle', togglePartnerStatus);
18+
router.delete('/:id', deletePartner);
19+
20+
export default router;

0 commit comments

Comments
 (0)