update: integrate discord webhook

This commit is contained in:
Nathan FONTEYNE 2026-07-16 12:00:30 +02:00
parent 0b4abe5b80
commit 60d20e764d
6 changed files with 229 additions and 0 deletions

View file

@ -3,6 +3,8 @@ const usersRepo = require('../repositories/usersRepo');
const songsRepo = require('../repositories/songsRepo');
const suggestionsRepo = require('../repositories/suggestionsRepo');
const setlistsRepo = require('../repositories/setlistsRepo');
const discordWebhooksRepo = require('../repositories/discordWebhooksRepo');
const discord = require('../lib/discord');
const { requireAdmin } = require('../auth/middleware');
const asyncHandler = require('../lib/asyncHandler');
@ -53,4 +55,42 @@ router.get(
})
);
router.get(
'/discord-webhooks',
requireAdmin,
asyncHandler(async (req, res) => {
const webhooks = await discordWebhooksRepo.findAll();
res.json(webhooks.map((w) => ({ id: w.id, label: w.label, url: w.url, createdAt: w.created_at })));
})
);
router.post(
'/discord-webhooks',
requireAdmin,
asyncHandler(async (req, res) => {
const { label, url } = req.body || {};
if (!url || !discord.isValidWebhookUrl(url.trim())) {
return res.status(400).json({ error: 'invalid_webhook_url' });
}
const trimmedUrl = url.trim();
try {
const reachable = await discord.checkWebhookReachable(trimmedUrl);
if (!reachable) return res.status(400).json({ error: 'webhook_unreachable' });
} catch (err) {
return res.status(400).json({ error: 'webhook_unreachable', message: err.message });
}
const webhook = await discordWebhooksRepo.create({ label: label ? label.trim() : null, url: trimmedUrl });
res.status(201).json({ id: webhook.id, label: webhook.label, url: webhook.url, createdAt: webhook.created_at });
})
);
router.delete(
'/discord-webhooks/:id',
requireAdmin,
asyncHandler(async (req, res) => {
await discordWebhooksRepo.remove(parseInt(req.params.id, 10));
res.status(204).end();
})
);
module.exports = router;

View file

@ -1,5 +1,6 @@
const express = require('express');
const rehearsalsRepo = require('../repositories/rehearsalsRepo');
const discord = require('../lib/discord');
const asyncHandler = require('../lib/asyncHandler');
const router = express.Router();
@ -46,6 +47,9 @@ router.post(
location: location ? location.trim() : null,
proposedBy: req.user.id,
});
discord.notifyAll(
discord.rehearsalProposedMessage({ userName: req.user.name, startsAt: rehearsal.starts_at, location: rehearsal.location })
);
res.status(201).json({
id: rehearsal.id,
startsAt: rehearsal.starts_at,
@ -65,6 +69,7 @@ router.delete(
return res.status(403).json({ error: 'forbidden' });
}
await rehearsalsRepo.remove(req.params.id);
discord.notifyAll(discord.rehearsalRemovedMessage({ userName: req.user.name, startsAt: rehearsal.starts_at }));
res.status(204).end();
})
);
@ -79,6 +84,7 @@ router.post(
const rehearsal = await rehearsalsRepo.findById(req.params.id);
if (!rehearsal) return res.status(404).json({ error: 'not_found' });
const saved = await rehearsalsRepo.upsertVote(req.params.id, req.user.id, vote);
discord.notifyAll(discord.rehearsalVoteMessage({ userName: req.user.name, vote, startsAt: rehearsal.starts_at }));
res.json({
id: saved.id,
rehearsalId: saved.rehearsal_id,