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:
@@ -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'));
|
||||||
|
|
||||||
|
|||||||
@@ -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'));
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user