Phase 3 (WIP): Refactor license, credentials, backups routes

- All use explicit deps instead of ctx
- Pattern consistent across all refactored routes
This commit is contained in:
Krystie
2026-03-22 11:09:55 +01:00
parent 81f778df72
commit 883cce27df
3 changed files with 36 additions and 46 deletions

View File

@@ -1,36 +1,32 @@
const express = require('express'); const express = require('express');
const asyncHandler = require('../src/utils/async-handler');
module.exports = function(ctx) { module.exports = function({ backupManager }) {
const router = express.Router(); const router = express.Router();
// Get backup configuration router.get('/backups/config', asyncHandler(async (req, res) => {
router.get('/backups/config', ctx.asyncHandler(async (req, res) => { const config = backupManager.getConfig();
const config = ctx.backupManager.getConfig();
res.json({ success: true, config }); res.json({ success: true, config });
}, 'backups-config-get')); }, 'backups-config-get'));
// Update backup configuration router.post('/backups/config', asyncHandler(async (req, res) => {
router.post('/backups/config', ctx.asyncHandler(async (req, res) => { backupManager.updateConfig(req.body);
ctx.backupManager.updateConfig(req.body);
res.json({ success: true, message: 'Backup configuration updated' }); res.json({ success: true, message: 'Backup configuration updated' });
}, 'backups-config-update')); }, 'backups-config-update'));
// Execute manual backup router.post('/backups/execute', asyncHandler(async (req, res) => {
router.post('/backups/execute', ctx.asyncHandler(async (req, res) => { const backup = await backupManager.executeBackup('manual', req.body);
const backup = await ctx.backupManager.executeBackup('manual', req.body);
res.json({ success: true, backup }); res.json({ success: true, backup });
}, 'backups-execute')); }, 'backups-execute'));
// Get backup history router.get('/backups/history', asyncHandler(async (req, res) => {
router.get('/backups/history', ctx.asyncHandler(async (req, res) => {
const limit = parseInt(req.query.limit) || 50; const limit = parseInt(req.query.limit) || 50;
const history = ctx.backupManager.getHistory(limit); const history = backupManager.getHistory(limit);
res.json({ success: true, history }); res.json({ success: true, history });
}, 'backups-history')); }, 'backups-history'));
// Restore from backup router.post('/backups/restore/:backupId', asyncHandler(async (req, res) => {
router.post('/backups/restore/:backupId', ctx.asyncHandler(async (req, res) => { const result = await backupManager.restoreBackup(req.params.backupId, req.body);
const result = await ctx.backupManager.restoreBackup(req.params.backupId, req.body);
res.json({ success: true, result }); res.json({ success: true, result });
}, 'backups-restore')); }, 'backups-restore'));

View File

@@ -1,21 +1,21 @@
const express = require('express'); const express = require('express');
const asyncHandler = require('../src/utils/async-handler');
const { errorResponse } = require('../src/utils/responses');
module.exports = function(ctx) { module.exports = function({ credentialManager }) {
const router = express.Router(); const router = express.Router();
// List all stored credentials (keys only, no values) router.get('/credentials/list', asyncHandler(async (req, res) => {
router.get('/credentials/list', ctx.asyncHandler(async (req, res) => { const keys = await credentialManager.list();
const keys = await ctx.credentialManager.list();
res.json({ success: true, credentials: keys, count: keys.length }); res.json({ success: true, credentials: keys, count: keys.length });
}, 'credentials-list')); }, 'credentials-list'));
// Rotate encryption key — re-encrypts all stored credentials router.post('/credentials/rotate-key', asyncHandler(async (req, res) => {
router.post('/credentials/rotate-key', ctx.asyncHandler(async (req, res) => { const success = await credentialManager.rotateEncryptionKey();
const success = await ctx.credentialManager.rotateEncryptionKey();
if (success) { if (success) {
res.json({ success: true, message: 'Encryption key rotated, all credentials re-encrypted' }); res.json({ success: true, message: 'Encryption key rotated, all credentials re-encrypted' });
} else { } else {
ctx.errorResponse(res, 500, 'Key rotation failed'); errorResponse(res, 500, 'Key rotation failed');
} }
}, 'credentials-rotate')); }, 'credentials-rotate'));

View File

@@ -1,50 +1,44 @@
const express = require('express'); const express = require('express');
const asyncHandler = require('../src/utils/async-handler');
const { errorResponse } = require('../src/utils/responses');
module.exports = function(ctx) { module.exports = function({ licenseManager }) {
const router = express.Router(); const router = express.Router();
// Activate a license code router.post('/activate', asyncHandler(async (req, res) => {
router.post('/activate', ctx.asyncHandler(async (req, res) => {
const { code } = req.body; const { code } = req.body;
if (!code) { if (!code) {
return ctx.errorResponse(res, 400, 'License code is required'); return errorResponse(res, 400, 'License code is required');
} }
const result = await ctx.licenseManager.activate(code); const result = await licenseManager.activate(code);
if (result.success) { if (result.success) {
res.json({ res.json({ success: true, message: result.message, license: result.activation });
success: true,
message: result.message,
license: result.activation,
});
} else { } else {
ctx.errorResponse(res, 400, result.message); errorResponse(res, 400, result.message);
} }
}, 'license-activate')); }, 'license-activate'));
// Get current license status router.get('/status', asyncHandler(async (req, res) => {
router.get('/status', ctx.asyncHandler(async (req, res) => { const status = licenseManager.getStatus();
const status = ctx.licenseManager.getStatus();
res.json({ success: true, license: status }); res.json({ success: true, license: status });
}, 'license-status')); }, 'license-status'));
// Deactivate current license router.post('/deactivate', asyncHandler(async (req, res) => {
router.post('/deactivate', ctx.asyncHandler(async (req, res) => { const result = await licenseManager.deactivate();
const result = await ctx.licenseManager.deactivate();
if (result.success) { if (result.success) {
res.json({ success: true, message: result.message }); res.json({ success: true, message: result.message });
} else { } else {
ctx.errorResponse(res, 400, result.message); errorResponse(res, 400, result.message);
} }
}, 'license-deactivate')); }, 'license-deactivate'));
// Check if a specific feature is available (lightweight check for frontend) router.get('/feature/:feature', asyncHandler(async (req, res) => {
router.get('/feature/:feature', ctx.asyncHandler(async (req, res) => {
const { feature } = req.params; const { feature } = req.params;
const available = ctx.licenseManager.hasFeature(feature); const available = licenseManager.hasFeature(feature);
const status = ctx.licenseManager.getStatus(); const status = licenseManager.getStatus();
res.json({ res.json({
success: true, success: true,