Files
miriamgemeinde/controllers/worshipLeaderController.js

89 lines
2.9 KiB
JavaScript

const { WorshipLeader } = require('../models');
const { Op } = require('sequelize');
function normalizeLeaderPayload(body) {
const code = String(body.code || '').trim();
const name = String(body.name || '').trim();
const aliases = String(body.aliases || '').trim();
const active = body.active === undefined ? true : !!body.active;
return { code, name, aliases, active };
}
exports.getAllWorshipLeaders = async (req, res) => {
try {
const includeInactive = String(req.query?.includeInactive || '').toLowerCase();
const wantsInactive = includeInactive === '1' || includeInactive === 'true' || includeInactive === 'yes';
const where = wantsInactive ? undefined : { active: true };
const leaders = await WorshipLeader.findAll({
where,
order: [['code', 'ASC']],
});
res.json(leaders);
} catch (error) {
console.error('getAllWorshipLeaders:', error);
res.status(500).json({ error: 'Failed to fetch worship leaders' });
}
};
exports.createWorshipLeader = async (req, res) => {
try {
const payload = normalizeLeaderPayload(req.body || {});
if (!payload.code || !payload.name) {
return res.status(400).json({ message: 'code und name sind Pflichtfelder.' });
}
const existing = await WorshipLeader.findOne({ where: { code: payload.code } });
if (existing) {
return res.status(409).json({ message: `Kürzel "${payload.code}" existiert bereits.` });
}
const created = await WorshipLeader.create(payload);
res.status(201).json(created);
} catch (error) {
console.error('createWorshipLeader:', error);
res.status(500).json({ error: 'Failed to create worship leader' });
}
};
exports.updateWorshipLeader = async (req, res) => {
try {
const { id } = req.params;
const leader = await WorshipLeader.findByPk(id);
if (!leader) {
return res.status(404).json({ message: 'Worship leader not found' });
}
const payload = normalizeLeaderPayload(req.body || {});
if (!payload.code || !payload.name) {
return res.status(400).json({ message: 'code und name sind Pflichtfelder.' });
}
const codeClash = await WorshipLeader.findOne({
where: { code: payload.code, id: { [Op.ne]: id } },
});
if (codeClash) {
return res.status(409).json({ message: `Kürzel "${payload.code}" existiert bereits.` });
}
await leader.update(payload);
res.json(leader);
} catch (error) {
console.error('updateWorshipLeader:', error);
res.status(500).json({ error: 'Failed to update worship leader' });
}
};
exports.deleteWorshipLeader = async (req, res) => {
try {
const { id } = req.params;
const deleted = await WorshipLeader.destroy({ where: { id } });
if (!deleted) {
return res.status(404).json({ message: 'Worship leader not found' });
}
res.status(204).json();
} catch (error) {
console.error('deleteWorshipLeader:', error);
res.status(500).json({ error: 'Failed to delete worship leader' });
}
};