- replace bearer auth with session+CSRF flow and add admin user directory - update frontend moderation flow, force password change gate, and new CLI - refresh changelog/docs/feature plan + ensure swagger dev experience
145 lines
4.5 KiB
JavaScript
145 lines
4.5 KiB
JavaScript
const express = require('express');
|
|
const { Router } = require('express');
|
|
const MigrationService = require('../services/MigrationService');
|
|
const dbManager = require('../database/DatabaseManager');
|
|
const { requireAdminAuth } = require('../middlewares/auth');
|
|
const { requireCsrf } = require('../middlewares/csrf');
|
|
|
|
const router = Router();
|
|
|
|
router.get('/status', async (req, res) => {
|
|
/*
|
|
#swagger.tags = ['System Migration']
|
|
#swagger.summary = 'Get migration status'
|
|
#swagger.description = 'Returns current database migration status and history'
|
|
#swagger.responses[200] = {
|
|
description: 'Migration status',
|
|
schema: {
|
|
migrationComplete: true,
|
|
jsonBackupExists: true,
|
|
sqliteActive: true,
|
|
lastMigration: '2025-11-01T10:00:00Z'
|
|
}
|
|
}
|
|
*/
|
|
try {
|
|
const status = await MigrationService.getMigrationStatus();
|
|
res.json(status);
|
|
} catch (error) {
|
|
console.error('Fehler beim Abrufen des Migrationsstatus:', error);
|
|
res.status(500).json({
|
|
error: 'Internal server error',
|
|
message: 'Fehler beim Abrufen des Migrationsstatus',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// Protect dangerous migration operations with admin auth
|
|
router.post('/migrate', requireAdminAuth, requireCsrf, async (req, res) => {
|
|
/*
|
|
#swagger.tags = ['System Migration']
|
|
#swagger.summary = 'Manually trigger migration'
|
|
#swagger.description = 'Triggers manual migration from JSON to SQLite database'
|
|
#swagger.responses[200] = {
|
|
description: 'Migration successful',
|
|
schema: {
|
|
success: true,
|
|
message: 'Migration completed successfully',
|
|
groupsMigrated: 24,
|
|
imagesMigrated: 348
|
|
}
|
|
}
|
|
#swagger.responses[500] = {
|
|
description: 'Migration failed'
|
|
}
|
|
*/
|
|
try {
|
|
const result = await MigrationService.migrateJsonToSqlite();
|
|
res.json(result);
|
|
} catch (error) {
|
|
console.error('Fehler bei der Migration:', error);
|
|
res.status(500).json({
|
|
error: 'Migration failed',
|
|
message: 'Fehler bei der Migration',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
router.post('/rollback', requireAdminAuth, requireCsrf, async (req, res) => {
|
|
/*
|
|
#swagger.tags = ['System Migration']
|
|
#swagger.summary = 'Rollback to JSON'
|
|
#swagger.description = 'Emergency rollback from SQLite to JSON file storage'
|
|
#swagger.responses[200] = {
|
|
description: 'Rollback successful',
|
|
schema: {
|
|
success: true,
|
|
message: 'Rolled back to JSON successfully',
|
|
groupsRestored: 24
|
|
}
|
|
}
|
|
#swagger.responses[500] = {
|
|
description: 'Rollback failed'
|
|
}
|
|
*/
|
|
try {
|
|
const result = await MigrationService.rollbackToJson();
|
|
res.json(result);
|
|
} catch (error) {
|
|
console.error('Fehler beim Rollback:', error);
|
|
res.status(500).json({
|
|
error: 'Rollback failed',
|
|
message: 'Fehler beim Rollback',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
router.get('/health', async (req, res) => {
|
|
/*
|
|
#swagger.tags = ['System Migration']
|
|
#swagger.summary = 'Database health check'
|
|
#swagger.description = 'Checks database connectivity and health status'
|
|
#swagger.responses[200] = {
|
|
description: 'Database healthy',
|
|
schema: {
|
|
database: {
|
|
healthy: true,
|
|
status: 'OK'
|
|
}
|
|
}
|
|
}
|
|
#swagger.responses[500] = {
|
|
description: 'Database unhealthy',
|
|
schema: {
|
|
database: {
|
|
healthy: false,
|
|
status: 'ERROR',
|
|
error: 'Connection failed'
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
try {
|
|
const isHealthy = await dbManager.healthCheck();
|
|
res.json({
|
|
database: {
|
|
healthy: isHealthy,
|
|
status: isHealthy ? 'OK' : 'ERROR'
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('Health Check fehlgeschlagen:', error);
|
|
res.status(500).json({
|
|
database: {
|
|
healthy: false,
|
|
status: 'ERROR',
|
|
error: error.message
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router; |