Skip to content

Commit b7f3f04

Browse files
authored
Merge pull request #83 from RustyRory/feat/82-collection-news
feat(backend): Fixes #82 - Collection News
2 parents 05abb1b + e2534ba commit b7f3f04

4 files changed

Lines changed: 118 additions & 0 deletions

File tree

app/backend/src/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ import clubsRoutes from './routes/clubs.js';
1818
import seasonsRoutes from './routes/seasons.js';
1919
import teamsRoutes from './routes/teams.js';
2020
import membersRoutes from './routes/members.js';
21+
import newsRoutes from './routes/news.js';
2122

2223
// Utiliser les routes
2324
app.use('/api/users', usersRoutes);
2425
app.use('/api/clubs', clubsRoutes);
2526
app.use('/api/seasons', seasonsRoutes);
2627
app.use('/api/teams', teamsRoutes);
2728
app.use('/api/members', membersRoutes);
29+
app.use('/api/news', newsRoutes);
2830

2931
export default app;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import News from '../models/News.js';
2+
3+
// GET all news
4+
export const getNews = async (req, res) => {
5+
try {
6+
const news = await News.find().populate('authorId', 'firstName lastName').populate('albumId'); // Si tu veux récupérer les infos de l'album
7+
res.json(news);
8+
} catch (error) {
9+
res.status(500).json({ message: error.message });
10+
}
11+
};
12+
13+
// GET single news by ID
14+
export const getNewsById = async (req, res) => {
15+
try {
16+
const newsItem = await News.findById(req.params.id).populate('authorId', 'firstName lastName').populate('albumId');
17+
if (!newsItem) return res.status(404).json({ message: 'News non trouvée' });
18+
res.json(newsItem);
19+
} catch (error) {
20+
res.status(500).json({ message: error.message });
21+
}
22+
};
23+
24+
// CREATE news
25+
export const createNews = async (req, res) => {
26+
try {
27+
const newsItem = await News.create(req.body);
28+
res.status(201).json(newsItem);
29+
} catch (error) {
30+
res.status(400).json({ message: error.message });
31+
}
32+
};
33+
34+
// UPDATE news
35+
export const updateNews = async (req, res) => {
36+
try {
37+
const newsItem = await News.findByIdAndUpdate(req.params.id, req.body, {
38+
new: true,
39+
runValidators: true,
40+
});
41+
if (!newsItem) return res.status(404).json({ message: 'News non trouvée' });
42+
res.json(newsItem);
43+
} catch (error) {
44+
res.status(400).json({ message: error.message });
45+
}
46+
};
47+
48+
// DELETE news
49+
export const deleteNews = async (req, res) => {
50+
try {
51+
const newsItem = await News.findByIdAndDelete(req.params.id);
52+
if (!newsItem) return res.status(404).json({ message: 'News non trouvée' });
53+
res.json({ message: 'News supprimée', newsItem });
54+
} catch (error) {
55+
res.status(500).json({ message: error.message });
56+
}
57+
};

app/backend/src/models/News.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import mongoose from 'mongoose';
2+
3+
const newsSchema = new mongoose.Schema(
4+
{
5+
title: {
6+
type: String,
7+
required: true,
8+
trim: true,
9+
},
10+
slug: {
11+
type: String,
12+
required: true,
13+
trim: true,
14+
unique: true, // SEO-friendly unique URL
15+
},
16+
content: {
17+
type: String,
18+
required: true,
19+
},
20+
albumId: {
21+
type: mongoose.Schema.Types.ObjectId,
22+
ref: 'Album',
23+
default: null,
24+
},
25+
authorId: {
26+
type: mongoose.Schema.Types.ObjectId,
27+
ref: 'User',
28+
required: true,
29+
},
30+
isPublished: {
31+
type: Boolean,
32+
default: false,
33+
},
34+
isFeatured: {
35+
type: Boolean,
36+
default: false,
37+
},
38+
publishedAt: {
39+
type: Date,
40+
default: null,
41+
},
42+
},
43+
{ timestamps: true }, // createdAt et updatedAt automatiques
44+
);
45+
46+
export default mongoose.model('News', newsSchema);

app/backend/src/routes/news.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import express from 'express';
2+
import { getNews, getNewsById, createNews, updateNews, deleteNews } from '../controllers/newsController.js';
3+
4+
const router = express.Router();
5+
6+
// CRUD news
7+
router.get('/', getNews);
8+
router.get('/:id', getNewsById);
9+
router.post('/', createNews);
10+
router.put('/:id', updateNews);
11+
router.delete('/:id', deleteNews);
12+
13+
export default router;

0 commit comments

Comments
 (0)