246 lines
7.6 KiB
JavaScript
246 lines
7.6 KiB
JavaScript
const { Router } = require('express');
|
|
const { endpoints } = require('../constants');
|
|
const GroupRepository = require('../repositories/GroupRepository');
|
|
const MigrationService = require('../services/MigrationService');
|
|
|
|
const router = Router();
|
|
|
|
// Alle Gruppen abrufen (für Slideshow mit vollständigen Bilddaten)
|
|
router.get(endpoints.GET_ALL_GROUPS, async (req, res) => {
|
|
try {
|
|
// Auto-Migration beim ersten Zugriff
|
|
const migrationStatus = await MigrationService.getMigrationStatus();
|
|
if (migrationStatus.needsMigration) {
|
|
console.log('🔄 Starte automatische Migration...');
|
|
await MigrationService.migrateJsonToSqlite();
|
|
}
|
|
|
|
const groups = await GroupRepository.getAllGroupsWithImages();
|
|
res.json({
|
|
groups,
|
|
totalCount: groups.length
|
|
});
|
|
} catch (error) {
|
|
console.error('Error fetching all groups:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Laden der Gruppen',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// Alle Gruppen für Moderation abrufen (mit Freigabestatus) - MUSS VOR den :groupId routen stehen!
|
|
router.get('/moderation/groups', async (req, res) => {
|
|
try {
|
|
const groups = await GroupRepository.getAllGroupsWithModerationInfo();
|
|
res.json({
|
|
groups,
|
|
totalCount: groups.length,
|
|
pendingCount: groups.filter(g => !g.approved).length,
|
|
approvedCount: groups.filter(g => g.approved).length
|
|
});
|
|
} catch (error) {
|
|
console.error('Error fetching moderation groups:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Laden der Moderations-Gruppen',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// Einzelne Gruppe für Moderation abrufen (inkl. nicht-freigegebene)
|
|
router.get('/moderation/groups/:groupId', async (req, res) => {
|
|
try {
|
|
const { groupId } = req.params;
|
|
const group = await GroupRepository.getGroupForModeration(groupId);
|
|
|
|
if (!group) {
|
|
return res.status(404).json({
|
|
error: 'Group not found',
|
|
message: `Gruppe mit ID ${groupId} wurde nicht gefunden`
|
|
});
|
|
}
|
|
|
|
res.json(group);
|
|
} catch (error) {
|
|
console.error('Error fetching group for moderation:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Laden der Gruppe für Moderation',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// Einzelne Gruppe abrufen
|
|
router.get(endpoints.GET_GROUP, async (req, res) => {
|
|
try {
|
|
const { groupId } = req.params;
|
|
const group = await GroupRepository.getGroupById(groupId);
|
|
|
|
if (!group) {
|
|
return res.status(404).json({
|
|
error: 'Group not found',
|
|
message: `Gruppe mit ID ${groupId} wurde nicht gefunden`
|
|
});
|
|
}
|
|
|
|
res.json(group);
|
|
} catch (error) {
|
|
console.error('Error fetching group:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Laden der Gruppe',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// Gruppe freigeben/genehmigen
|
|
router.patch('/groups/:groupId/approve', async (req, res) => {
|
|
try {
|
|
const { groupId } = req.params;
|
|
const { approved } = req.body;
|
|
|
|
// Validierung
|
|
if (typeof approved !== 'boolean') {
|
|
return res.status(400).json({
|
|
error: 'Invalid request',
|
|
message: 'approved muss ein boolean Wert sein'
|
|
});
|
|
}
|
|
|
|
const updated = await GroupRepository.updateGroupApproval(groupId, approved);
|
|
|
|
if (!updated) {
|
|
return res.status(404).json({
|
|
error: 'Group not found',
|
|
message: `Gruppe mit ID ${groupId} wurde nicht gefunden`
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: approved ? 'Gruppe freigegeben' : 'Gruppe gesperrt',
|
|
groupId: groupId,
|
|
approved: approved
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error updating group approval:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Aktualisieren der Freigabe'
|
|
});
|
|
}
|
|
});
|
|
|
|
// Gruppe bearbeiten (Metadaten aktualisieren)
|
|
router.patch('/groups/:groupId', async (req, res) => {
|
|
try {
|
|
const { groupId } = req.params;
|
|
|
|
// Erlaubte Felder zum Aktualisieren
|
|
const allowed = ['year', 'title', 'description', 'name'];
|
|
const updates = {};
|
|
|
|
for (const field of allowed) {
|
|
if (req.body[field] !== undefined) {
|
|
updates[field] = req.body[field];
|
|
}
|
|
}
|
|
|
|
if (Object.keys(updates).length === 0) {
|
|
return res.status(400).json({
|
|
error: 'Invalid request',
|
|
message: 'Keine gültigen Felder zum Aktualisieren angegeben'
|
|
});
|
|
}
|
|
|
|
const updated = await GroupRepository.updateGroup(groupId, updates);
|
|
|
|
if (!updated) {
|
|
return res.status(404).json({
|
|
error: 'Group not found',
|
|
message: `Gruppe mit ID ${groupId} wurde nicht gefunden`
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Gruppe erfolgreich aktualisiert',
|
|
groupId: groupId,
|
|
updates: updates
|
|
});
|
|
} catch (error) {
|
|
console.error('Error updating group:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Aktualisieren der Gruppe',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// Einzelnes Bild löschen
|
|
router.delete('/groups/:groupId/images/:imageId', async (req, res) => {
|
|
try {
|
|
const { groupId, imageId } = req.params;
|
|
|
|
const deleted = await GroupRepository.deleteImage(groupId, parseInt(imageId));
|
|
|
|
if (!deleted) {
|
|
return res.status(404).json({
|
|
error: 'Image not found',
|
|
message: `Bild mit ID ${imageId} in Gruppe ${groupId} wurde nicht gefunden`
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Bild erfolgreich gelöscht',
|
|
groupId: groupId,
|
|
imageId: parseInt(imageId)
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error deleting image:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Löschen des Bildes'
|
|
});
|
|
}
|
|
});
|
|
|
|
// Gruppe löschen
|
|
router.delete(endpoints.DELETE_GROUP, async (req, res) => {
|
|
try {
|
|
const { groupId } = req.params;
|
|
|
|
const deleted = await GroupRepository.deleteGroup(groupId);
|
|
|
|
if (!deleted) {
|
|
return res.status(404).json({
|
|
error: 'Group not found',
|
|
message: `Gruppe mit ID ${groupId} wurde nicht gefunden`
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Gruppe erfolgreich gelöscht',
|
|
groupId: groupId
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error deleting group:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Löschen der Gruppe'
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router; |