Transport API (11 endpoints): - POST /api/transport/seed-acquisition - Record seed acquisition events - POST /api/transport/planting - Record planting events - POST /api/transport/growing - Record growing transport events - POST /api/transport/harvest - Record harvest events - POST /api/transport/distribution - Record distribution events - POST /api/transport/seed-saving - Record seed saving events - POST /api/transport/seed-sharing - Record seed sharing events - GET /api/transport/journey/[plantId] - Get plant journey - GET /api/transport/footprint/[userId] - Get environmental impact - GET /api/transport/verify/[blockHash] - Verify block integrity - GET /api/transport/qr/[id] - Generate QR code data Demand API (6 endpoints): - POST/GET /api/demand/preferences - Consumer preferences - POST /api/demand/signal - Generate demand signal - GET /api/demand/recommendations - Get planting recommendations - GET /api/demand/forecast - Get demand forecast - POST /api/demand/supply - Register supply commitment - POST /api/demand/match - Create market match Vertical Farm API (9 endpoints): - POST /api/vertical-farm/register - Register new farm - GET /api/vertical-farm/[farmId] - Get farm details - GET/POST /api/vertical-farm/[farmId]/zones - Manage zones - GET /api/vertical-farm/[farmId]/analytics - Get farm analytics - POST /api/vertical-farm/batch/start - Start crop batch - GET /api/vertical-farm/batch/[batchId] - Get batch details - PUT /api/vertical-farm/batch/[batchId]/environment - Record environment - POST /api/vertical-farm/batch/[batchId]/harvest - Complete harvest - GET /api/vertical-farm/recipes - List growing recipes
70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
/**
|
|
* API Route: List growing recipes
|
|
* GET /api/vertical-farm/recipes
|
|
*/
|
|
|
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
import { getVerticalFarmController } from '../../../lib/vertical-farming/controller';
|
|
|
|
export default async function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse
|
|
) {
|
|
if (req.method !== 'GET') {
|
|
return res.status(405).json({ success: false, error: 'Method not allowed' });
|
|
}
|
|
|
|
try {
|
|
const { cropType, source } = req.query;
|
|
|
|
const controller = getVerticalFarmController();
|
|
let recipes = controller.getRecipes();
|
|
|
|
// Filter by crop type if provided
|
|
if (cropType && typeof cropType === 'string') {
|
|
recipes = recipes.filter(r => r.cropType.toLowerCase() === cropType.toLowerCase());
|
|
}
|
|
|
|
// Filter by source if provided
|
|
if (source && typeof source === 'string') {
|
|
recipes = recipes.filter(r => r.source === source);
|
|
}
|
|
|
|
// Sort by rating (highest first) then by times used
|
|
recipes.sort((a, b) => {
|
|
if ((b.rating || 0) !== (a.rating || 0)) {
|
|
return (b.rating || 0) - (a.rating || 0);
|
|
}
|
|
return b.timesUsed - a.timesUsed;
|
|
});
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
data: {
|
|
totalRecipes: recipes.length,
|
|
recipes: recipes.map(recipe => ({
|
|
id: recipe.id,
|
|
name: recipe.name,
|
|
cropType: recipe.cropType,
|
|
variety: recipe.variety,
|
|
version: recipe.version,
|
|
expectedDays: recipe.expectedDays,
|
|
expectedYieldGrams: recipe.expectedYieldGrams,
|
|
expectedYieldPerSqm: recipe.expectedYieldPerSqm,
|
|
requirements: recipe.requirements,
|
|
source: recipe.source,
|
|
rating: recipe.rating,
|
|
timesUsed: recipe.timesUsed,
|
|
stages: recipe.stages.map(s => ({
|
|
name: s.name,
|
|
daysStart: s.daysStart,
|
|
daysEnd: s.daysEnd
|
|
}))
|
|
}))
|
|
}
|
|
});
|
|
} catch (error: any) {
|
|
console.error('Error fetching recipes:', error);
|
|
res.status(500).json({ success: false, error: error.message || 'Internal server error' });
|
|
}
|
|
}
|