Refactor recipes routes: explicit dependency injection
- Updated all recipes route modules to use destructured dependencies - Added JSDoc comments for factory functions - Replaced ctx. references with direct parameter access - All files pass syntax validation Files refactored: - routes/recipes/deploy.js - routes/recipes/manage.js - routes/recipes/index.js (orchestrator)
This commit is contained in:
@@ -2,14 +2,22 @@ const express = require('express');
|
||||
const { DOCKER } = require('../../constants');
|
||||
const { NotFoundError } = require('../../errors');
|
||||
|
||||
module.exports = function(ctx) {
|
||||
module.exports = function({ servicesStateManager, asyncHandler, log }) {
|
||||
const router = express.Router();
|
||||
/**
|
||||
* Recipes management routes factory
|
||||
* @param {Object} deps - Explicit dependencies
|
||||
* @param {Object} deps.servicesStateManager - Services state manager
|
||||
* @param {Function} deps.asyncHandler - Async route handler wrapper
|
||||
* @param {Object} deps.log - Logger instance
|
||||
* @returns {express.Router}
|
||||
*/
|
||||
|
||||
/**
|
||||
* GET /api/recipes/deployed — list all deployed recipes (grouped by recipeId)
|
||||
*/
|
||||
router.get('/deployed', ctx.asyncHandler(async (req, res) => {
|
||||
const services = await ctx.servicesStateManager.read();
|
||||
router.get('/deployed', asyncHandler(async (req, res) => {
|
||||
const services = await servicesStateManager.read();
|
||||
const recipeGroups = {};
|
||||
|
||||
for (const service of services) {
|
||||
@@ -64,7 +72,7 @@ module.exports = function(ctx) {
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
ctx.log.warn('recipe', 'Could not list Docker containers for recipe discovery', { error: e.message });
|
||||
log.warn('recipe', 'Could not list Docker containers for recipe discovery', { error: e.message });
|
||||
}
|
||||
|
||||
// Enrich with container state
|
||||
@@ -92,7 +100,7 @@ module.exports = function(ctx) {
|
||||
/**
|
||||
* POST /api/recipes/:recipeId/start — start all containers in a recipe
|
||||
*/
|
||||
router.post('/:recipeId/start', ctx.asyncHandler(async (req, res) => {
|
||||
router.post('/:recipeId/start', asyncHandler(async (req, res) => {
|
||||
const { recipeId } = req.params;
|
||||
const containers = await findRecipeContainers(recipeId);
|
||||
|
||||
@@ -116,14 +124,14 @@ module.exports = function(ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
ctx.log.info('recipe', 'Recipe started', { recipeId, results });
|
||||
log.info('recipe', 'Recipe started', { recipeId, results });
|
||||
res.json({ success: true, recipeId, results });
|
||||
}, 'recipe-start'));
|
||||
|
||||
/**
|
||||
* POST /api/recipes/:recipeId/stop — stop all containers in a recipe
|
||||
*/
|
||||
router.post('/:recipeId/stop', ctx.asyncHandler(async (req, res) => {
|
||||
router.post('/:recipeId/stop', asyncHandler(async (req, res) => {
|
||||
const { recipeId } = req.params;
|
||||
const containers = await findRecipeContainers(recipeId);
|
||||
|
||||
@@ -148,14 +156,14 @@ module.exports = function(ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
ctx.log.info('recipe', 'Recipe stopped', { recipeId, results });
|
||||
log.info('recipe', 'Recipe stopped', { recipeId, results });
|
||||
res.json({ success: true, recipeId, results });
|
||||
}, 'recipe-stop'));
|
||||
|
||||
/**
|
||||
* POST /api/recipes/:recipeId/restart — restart all containers in a recipe
|
||||
*/
|
||||
router.post('/:recipeId/restart', ctx.asyncHandler(async (req, res) => {
|
||||
router.post('/:recipeId/restart', asyncHandler(async (req, res) => {
|
||||
const { recipeId } = req.params;
|
||||
const containers = await findRecipeContainers(recipeId);
|
||||
|
||||
@@ -174,14 +182,14 @@ module.exports = function(ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
ctx.log.info('recipe', 'Recipe restarted', { recipeId, results });
|
||||
log.info('recipe', 'Recipe restarted', { recipeId, results });
|
||||
res.json({ success: true, recipeId, results });
|
||||
}, 'recipe-restart'));
|
||||
|
||||
/**
|
||||
* DELETE /api/recipes/:recipeId — remove entire recipe (containers, network, services)
|
||||
*/
|
||||
router.delete('/:recipeId', ctx.asyncHandler(async (req, res) => {
|
||||
router.delete('/:recipeId', asyncHandler(async (req, res) => {
|
||||
const { recipeId } = req.params;
|
||||
const containers = await findRecipeContainers(recipeId);
|
||||
|
||||
@@ -189,7 +197,7 @@ module.exports = function(ctx) {
|
||||
throw new NotFoundError('Containers for recipe');
|
||||
}
|
||||
|
||||
ctx.log.info('recipe', 'Removing recipe', { recipeId, containerCount: containers.length });
|
||||
log.info('recipe', 'Removing recipe', { recipeId, containerCount: containers.length });
|
||||
|
||||
const results = [];
|
||||
const networkNames = new Set();
|
||||
@@ -213,7 +221,7 @@ module.exports = function(ctx) {
|
||||
try {
|
||||
await removeCaddyBlock(subdomain);
|
||||
} catch (e) {
|
||||
ctx.log.warn('recipe', 'Failed to remove Caddy config', { subdomain, error: e.message });
|
||||
log.warn('recipe', 'Failed to remove Caddy config', { subdomain, error: e.message });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,7 +234,7 @@ module.exports = function(ctx) {
|
||||
}
|
||||
|
||||
// Remove recipe services from services.json
|
||||
await ctx.servicesStateManager.update(services => {
|
||||
await servicesStateManager.update(services => {
|
||||
return services.filter(s => s.recipeId !== recipeId);
|
||||
});
|
||||
|
||||
@@ -235,9 +243,9 @@ module.exports = function(ctx) {
|
||||
try {
|
||||
const network = ctx.docker.client.getNetwork(netName);
|
||||
await network.remove();
|
||||
ctx.log.info('recipe', 'Removed Docker network', { netName });
|
||||
log.info('recipe', 'Removed Docker network', { netName });
|
||||
} catch (e) {
|
||||
ctx.log.warn('recipe', 'Failed to remove network', { netName, error: e.message });
|
||||
log.warn('recipe', 'Failed to remove network', { netName, error: e.message });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,7 +254,7 @@ module.exports = function(ctx) {
|
||||
'info'
|
||||
);
|
||||
|
||||
ctx.log.info('recipe', 'Recipe removed', { recipeId, results });
|
||||
log.info('recipe', 'Recipe removed', { recipeId, results });
|
||||
res.json({ success: true, recipeId, results });
|
||||
}, 'recipe-remove'));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user