mirror of
https://github.com/nfonteyne/octane-website.git
synced 2026-09-03 23:24:48 +02:00
100 lines
2.7 KiB
JavaScript
100 lines
2.7 KiB
JavaScript
|
|
const express = require('express');
|
||
|
|
const songsRepo = require('../repositories/songsRepo');
|
||
|
|
const { requireAdmin } = require('../auth/middleware');
|
||
|
|
const asyncHandler = require('../lib/asyncHandler');
|
||
|
|
|
||
|
|
const router = express.Router();
|
||
|
|
|
||
|
|
router.get(
|
||
|
|
'/',
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
res.json(await songsRepo.findAll());
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
router.get(
|
||
|
|
'/:id',
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
const song = await songsRepo.findById(req.params.id);
|
||
|
|
if (!song) return res.status(404).json({ error: 'not_found' });
|
||
|
|
const tutorials = await songsRepo.findTutorials(req.params.id);
|
||
|
|
res.json({ ...song, tutorials });
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
router.post(
|
||
|
|
'/',
|
||
|
|
requireAdmin,
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
const { title, artist, notes } = req.body || {};
|
||
|
|
if (!title || !title.trim() || !artist || !artist.trim()) {
|
||
|
|
return res.status(400).json({ error: 'title_and_artist_required' });
|
||
|
|
}
|
||
|
|
const song = await songsRepo.create({ title: title.trim(), artist: artist.trim(), notes, addedBy: req.user.id });
|
||
|
|
res.status(201).json(song);
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
router.patch(
|
||
|
|
'/:id',
|
||
|
|
requireAdmin,
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
const { title, artist, notes } = req.body || {};
|
||
|
|
if (!title || !title.trim() || !artist || !artist.trim()) {
|
||
|
|
return res.status(400).json({ error: 'title_and_artist_required' });
|
||
|
|
}
|
||
|
|
const song = await songsRepo.update(req.params.id, { title: title.trim(), artist: artist.trim(), notes });
|
||
|
|
if (!song) return res.status(404).json({ error: 'not_found' });
|
||
|
|
res.json(song);
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
router.delete(
|
||
|
|
'/:id',
|
||
|
|
requireAdmin,
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
try {
|
||
|
|
await songsRepo.remove(req.params.id);
|
||
|
|
res.status(204).end();
|
||
|
|
} catch (err) {
|
||
|
|
if (err.code === '23503') {
|
||
|
|
return res
|
||
|
|
.status(409)
|
||
|
|
.json({ error: 'song_in_use', message: 'Ce morceau est utilisé dans une setlist et ne peut pas être supprimé.' });
|
||
|
|
}
|
||
|
|
throw err;
|
||
|
|
}
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
router.post(
|
||
|
|
'/:id/tutorials',
|
||
|
|
requireAdmin,
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
const { instrumentId, url, label } = req.body || {};
|
||
|
|
if (!instrumentId || !url || !url.trim()) {
|
||
|
|
return res.status(400).json({ error: 'instrument_and_url_required' });
|
||
|
|
}
|
||
|
|
const song = await songsRepo.findById(req.params.id);
|
||
|
|
if (!song) return res.status(404).json({ error: 'not_found' });
|
||
|
|
const tutorial = await songsRepo.addTutorial(req.params.id, {
|
||
|
|
instrumentId,
|
||
|
|
url: url.trim(),
|
||
|
|
label,
|
||
|
|
addedBy: req.user.id,
|
||
|
|
});
|
||
|
|
res.status(201).json(tutorial);
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
router.delete(
|
||
|
|
'/:songId/tutorials/:id',
|
||
|
|
requireAdmin,
|
||
|
|
asyncHandler(async (req, res) => {
|
||
|
|
await songsRepo.removeTutorial(req.params.songId, req.params.id);
|
||
|
|
res.status(204).end();
|
||
|
|
})
|
||
|
|
);
|
||
|
|
|
||
|
|
module.exports = router;
|