Initial commit: DashCaddy v1.0
Full codebase including API server (32 modules + routes), dashboard frontend, DashCA certificate distribution, installer script, and deployment skills.
This commit is contained in:
54
dashcaddy-api/routes/recipes/index.js
Normal file
54
dashcaddy-api/routes/recipes/index.js
Normal file
@@ -0,0 +1,54 @@
|
||||
const express = require('express');
|
||||
const deployRoutes = require('./deploy');
|
||||
const manageRoutes = require('./manage');
|
||||
|
||||
module.exports = function(ctx) {
|
||||
const router = express.Router();
|
||||
|
||||
// All recipe routes require premium license
|
||||
router.use(ctx.licenseManager.requirePremium('recipes'));
|
||||
|
||||
// GET /api/recipes/templates — list all recipe templates
|
||||
router.get('/templates', ctx.asyncHandler(async (req, res) => {
|
||||
const { RECIPE_TEMPLATES, RECIPE_CATEGORIES } = require('../../recipe-templates');
|
||||
const templates = Object.entries(RECIPE_TEMPLATES).map(([id, recipe]) => ({
|
||||
id,
|
||||
name: recipe.name,
|
||||
description: recipe.description,
|
||||
icon: recipe.icon,
|
||||
category: recipe.category,
|
||||
type: 'recipe',
|
||||
difficulty: recipe.difficulty,
|
||||
popularity: recipe.popularity,
|
||||
componentCount: recipe.components.length,
|
||||
requiredCount: recipe.components.filter(c => c.required).length,
|
||||
optionalCount: recipe.components.filter(c => !c.required).length,
|
||||
components: recipe.components.map(c => ({
|
||||
id: c.id,
|
||||
role: c.role,
|
||||
required: c.required,
|
||||
internal: c.internal || false,
|
||||
templateRef: c.templateRef || null,
|
||||
note: c.note || null
|
||||
})),
|
||||
setupInstructions: recipe.setupInstructions
|
||||
}));
|
||||
|
||||
res.json({ success: true, templates, categories: RECIPE_CATEGORIES });
|
||||
}, 'recipe-templates'));
|
||||
|
||||
// GET /api/recipes/templates/:recipeId — get single recipe template detail
|
||||
router.get('/templates/:recipeId', ctx.asyncHandler(async (req, res) => {
|
||||
const { RECIPE_TEMPLATES } = require('../../recipe-templates');
|
||||
const recipe = RECIPE_TEMPLATES[req.params.recipeId];
|
||||
if (!recipe) return ctx.errorResponse(res, 404, 'Recipe template not found');
|
||||
|
||||
res.json({ success: true, recipe: { id: req.params.recipeId, ...recipe } });
|
||||
}, 'recipe-template-detail'));
|
||||
|
||||
// Mount deploy and manage sub-routes
|
||||
router.use(deployRoutes(ctx));
|
||||
router.use(manageRoutes(ctx));
|
||||
|
||||
return router;
|
||||
};
|
||||
Reference in New Issue
Block a user