/** * API Route: Record harvest event * POST /api/transport/harvest */ import type { NextApiRequest, NextApiResponse } from 'next'; import { getTransportChain } from '../../../lib/transport/tracker'; import { HarvestEvent, TransportLocation, TransportMethod } from '../../../lib/transport/types'; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method !== 'POST') { return res.status(405).json({ success: false, error: 'Method not allowed' }); } try { const { plantIds, harvestBatchId, harvestType, produceType, grossWeight, netWeight, weightUnit, itemCount, qualityGrade, packagingType, temperatureRequired, shelfLifeHours, fromLocation, toLocation, transportMethod, senderId, receiverId, distanceKm, durationMinutes, seedsSaved, seedBatchIdCreated, notes } = req.body; // Validate required fields if (!plantIds || !harvestBatchId || !harvestType || !produceType || !grossWeight || !netWeight || !fromLocation || !toLocation || !senderId || !receiverId) { return res.status(400).json({ success: false, error: 'Missing required fields: plantIds, harvestBatchId, harvestType, produceType, grossWeight, netWeight, fromLocation, toLocation, senderId, receiverId' }); } const transportChain = getTransportChain(); const event: HarvestEvent = { id: `harvest-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, timestamp: new Date().toISOString(), eventType: 'harvest', plantIds: Array.isArray(plantIds) ? plantIds : [plantIds], harvestBatchId, harvestType, produceType, grossWeight, netWeight, weightUnit: weightUnit || 'kg', itemCount, qualityGrade, packagingType: packagingType || 'bulk', temperatureRequired: temperatureRequired || { min: 2, max: 8, optimal: 4, unit: 'celsius' }, shelfLifeHours: shelfLifeHours || 168, fromLocation: fromLocation as TransportLocation, toLocation: toLocation as TransportLocation, distanceKm: distanceKm || 0, durationMinutes: durationMinutes || 0, transportMethod: (transportMethod as TransportMethod) || 'walking', carbonFootprintKg: 0, senderId, receiverId, status: 'verified', seedsSaved: seedsSaved || false, seedBatchIdCreated, notes }; const block = transportChain.recordEvent(event); res.status(201).json({ success: true, data: { event, block: { index: block.index, hash: block.hash, timestamp: block.timestamp, cumulativeCarbonKg: block.cumulativeCarbonKg, cumulativeFoodMiles: block.cumulativeFoodMiles } } }); } catch (error: any) { console.error('Error recording harvest event:', error); res.status(500).json({ success: false, error: error.message || 'Internal server error' }); } }