Convert ~160 raw res.json()/res.status().json() calls across 32+ files to use centralized helpers from src/utils/responses.js (ok, errorResponse, successMessage, notFound, validationError, forbidden, unauthorized, conflict). No behavior changes — response shapes are identical. Future schema changes (e.g., requestId envelope) only need to update one module. Fix error vs errorResponse signature mismatch in routes/health.js CA cert endpoint where error(res, message, statusCode) was being called with errorResponse(res, statusCode, message, extras) argument order. Files changed: middleware.js, csrf-protection.js, error-handler.js, license-manager.js, src/app.js, and 27 route files. Test suite: 755 pass / 4 pre-existing failures (services credential tests).
66 lines
2.4 KiB
JavaScript
66 lines
2.4 KiB
JavaScript
const express = require('express');
|
|
const { ok } = require('../src/utils/responses');
|
|
|
|
/**
|
|
* Workflows routes factory
|
|
* @param {Object} deps - Explicit dependencies
|
|
* @param {Object} deps.workflowEngine - WorkflowEngine instance
|
|
* @param {Object} deps.licenseManager - License manager for premium gating
|
|
* @param {Function} deps.asyncHandler - Async route handler wrapper
|
|
* @returns {express.Router}
|
|
*/
|
|
module.exports = function({ workflowEngine, licenseManager, asyncHandler }) {
|
|
const router = express.Router();
|
|
|
|
// Apply premium gating to all workflows routes
|
|
router.use(licenseManager.requirePremium('workflows'));
|
|
|
|
// ===== WORKFLOW MANAGEMENT ENDPOINTS =====
|
|
|
|
// List all bundled workflows
|
|
router.get('/workflows', asyncHandler(async (req, res) => {
|
|
const workflows = workflowEngine.listWorkflows();
|
|
ok(res, { workflows });
|
|
}, 'workflows-list'));
|
|
|
|
// Enable a workflow
|
|
router.post('/workflows/:workflowId/enable', asyncHandler(async (req, res) => {
|
|
const { workflowId } = req.params;
|
|
const result = workflowEngine.setWorkflowEnabled(workflowId, true);
|
|
ok(res, result);
|
|
}, 'workflows-enable'));
|
|
|
|
// Disable a workflow
|
|
router.post('/workflows/:workflowId/disable', asyncHandler(async (req, res) => {
|
|
const { workflowId } = req.params;
|
|
const result = workflowEngine.setWorkflowEnabled(workflowId, false);
|
|
ok(res, result);
|
|
}, 'workflows-disable'));
|
|
|
|
// Manually trigger a workflow
|
|
router.post('/workflows/:workflowId/run', asyncHandler(async (req, res) => {
|
|
const { workflowId } = req.params;
|
|
const triggerData = req.body || {};
|
|
triggerData.trigger = 'manual';
|
|
|
|
const result = await workflowEngine.executeWorkflow(workflowId, triggerData);
|
|
ok(res, { result });
|
|
}, 'workflows-run'));
|
|
|
|
// Get execution history for a workflow
|
|
router.get('/workflows/:workflowId/history', asyncHandler(async (req, res) => {
|
|
const { workflowId } = req.params;
|
|
const limit = parseInt(req.query.limit) || 50;
|
|
const history = workflowEngine.getHistory(workflowId, limit);
|
|
ok(res, { history });
|
|
}, 'workflows-history'));
|
|
|
|
// Get all workflow execution history
|
|
router.get('/workflows/history', asyncHandler(async (req, res) => {
|
|
const limit = parseInt(req.query.limit) || 100;
|
|
const history = workflowEngine.getHistory(null, limit);
|
|
ok(res, { history });
|
|
}, 'workflows-all-history'));
|
|
|
|
return router;
|
|
}; |