Project-Image-Uploader/backend/src/routes/migration.js
matthias.lotz 6332b82c6a Feature Request: admin session security
- 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
2025-11-23 21:18:42 +01:00

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;