m2-inno-bedpressure/app/api/test-scenarios/route.ts
2025-06-21 13:29:01 +07:00

197 lines
No EOL
8.2 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
interface TestSensorData {
sensorId: string;
value: number;
status: string;
warningStartTime?: number;
}
// Test scenarios for the bed pressure monitoring system
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { scenario } = body;
let testData: TestSensorData[] = [];
switch (scenario) {
case 'normal':
testData = generateNormalScenario();
break;
case 'warning':
testData = generateWarningScenario();
break;
case 'alarm':
testData = generateAlarmScenario();
break;
case 'escalation':
testData = generateEscalationScenario();
break;
case 'mixed':
testData = generateMixedScenario();
break;
default:
return NextResponse.json({
success: false,
error: 'Invalid scenario. Use: normal, warning, alarm, escalation, or mixed'
}, { status: 400 });
}
return NextResponse.json({
success: true,
scenario,
message: `Generated ${scenario} test scenario`,
testData,
timestamp: new Date().toISOString()
});
} catch (error) {
console.error('Test scenario API error:', error);
return NextResponse.json({
success: false,
error: 'Failed to generate test scenario'
}, { status: 500 });
}
}
function generateNormalScenario() {
return [
{ sensorId: 'head-1', value: 1200, status: 'normal' },
{ sensorId: 'head-2', value: 1150, status: 'normal' },
{ sensorId: 'shoulder-1', value: 1800, status: 'normal' },
{ sensorId: 'shoulder-2', value: 1750, status: 'normal' },
{ sensorId: 'back-1', value: 2000, status: 'normal' },
{ sensorId: 'back-2', value: 2100, status: 'normal' },
{ sensorId: 'back-3', value: 1950, status: 'normal' },
{ sensorId: 'hip-1', value: 1900, status: 'normal' },
{ sensorId: 'hip-2', value: 2000, status: 'normal' },
{ sensorId: 'hip-3', value: 1850, status: 'normal' },
{ sensorId: 'thigh-1', value: 1600, status: 'normal' },
{ sensorId: 'thigh-2', value: 1550, status: 'normal' },
{ sensorId: 'calf-1', value: 1400, status: 'normal' },
{ sensorId: 'calf-2', value: 1350, status: 'normal' },
{ sensorId: 'feet-1', value: 1200, status: 'normal' },
{ sensorId: 'feet-2', value: 1150, status: 'normal' }
];
}
function generateWarningScenario() {
return [
{ sensorId: 'head-1', value: 3100, status: 'warning' }, // Above warning threshold
{ sensorId: 'head-2', value: 1150, status: 'normal' },
{ sensorId: 'shoulder-1', value: 2900, status: 'warning' }, // Above warning threshold
{ sensorId: 'shoulder-2', value: 1750, status: 'normal' },
{ sensorId: 'back-1', value: 2600, status: 'warning' }, // Above warning threshold
{ sensorId: 'back-2', value: 2100, status: 'normal' },
{ sensorId: 'back-3', value: 1950, status: 'normal' },
{ sensorId: 'hip-1', value: 1900, status: 'normal' },
{ sensorId: 'hip-2', value: 2300, status: 'warning' }, // Above warning threshold
{ sensorId: 'hip-3', value: 1850, status: 'normal' },
{ sensorId: 'thigh-1', value: 1600, status: 'normal' },
{ sensorId: 'thigh-2', value: 1550, status: 'normal' },
{ sensorId: 'calf-1', value: 1400, status: 'normal' },
{ sensorId: 'calf-2', value: 1350, status: 'normal' },
{ sensorId: 'feet-1', value: 1200, status: 'normal' },
{ sensorId: 'feet-2', value: 1150, status: 'normal' }
];
}
function generateAlarmScenario() {
return [
{ sensorId: 'head-1', value: 3600, status: 'alarm' }, // Above alarm threshold
{ sensorId: 'head-2', value: 3550, status: 'alarm' }, // Above alarm threshold
{ sensorId: 'shoulder-1', value: 3300, status: 'alarm' }, // Above alarm threshold
{ sensorId: 'shoulder-2', value: 1750, status: 'normal' },
{ sensorId: 'back-1', value: 3100, status: 'alarm' }, // Above alarm threshold
{ sensorId: 'back-2', value: 2100, status: 'normal' },
{ sensorId: 'back-3', value: 1950, status: 'normal' },
{ sensorId: 'hip-1', value: 2900, status: 'alarm' }, // Above alarm threshold
{ sensorId: 'hip-2', value: 2000, status: 'normal' },
{ sensorId: 'hip-3', value: 1850, status: 'normal' },
{ sensorId: 'thigh-1', value: 1600, status: 'normal' },
{ sensorId: 'thigh-2', value: 1550, status: 'normal' },
{ sensorId: 'calf-1', value: 1400, status: 'normal' },
{ sensorId: 'calf-2', value: 1350, status: 'normal' },
{ sensorId: 'feet-1', value: 1200, status: 'normal' },
{ sensorId: 'feet-2', value: 1150, status: 'normal' }
];
}
function generateEscalationScenario() {
// This scenario would simulate sensors that have been in warning state for a while
// and are about to escalate to alarm
const now = Date.now();
const warningStartTime = now - 25000; // Started warning 25 seconds ago (close to 30s threshold)
return [
{ sensorId: 'head-1', value: 3100, status: 'warning', warningStartTime },
{ sensorId: 'head-2', value: 1150, status: 'normal' },
{ sensorId: 'shoulder-1', value: 2900, status: 'warning', warningStartTime: now - 40000 }, // Close to 45s threshold
{ sensorId: 'shoulder-2', value: 1750, status: 'normal' },
{ sensorId: 'back-1', value: 2600, status: 'warning', warningStartTime: now - 55000 }, // Close to 60s threshold
{ sensorId: 'back-2', value: 2100, status: 'normal' },
{ sensorId: 'back-3', value: 1950, status: 'normal' },
{ sensorId: 'hip-1', value: 1900, status: 'normal' },
{ sensorId: 'hip-2', value: 2300, status: 'warning', warningStartTime: now - 85000 }, // Close to 90s threshold
{ sensorId: 'hip-3', value: 1850, status: 'normal' },
{ sensorId: 'thigh-1', value: 2100, status: 'warning', warningStartTime: now - 115000 }, // Close to 120s threshold
{ sensorId: 'thigh-2', value: 1550, status: 'normal' },
{ sensorId: 'calf-1', value: 1400, status: 'normal' },
{ sensorId: 'calf-2', value: 1350, status: 'normal' },
{ sensorId: 'feet-1', value: 1200, status: 'normal' },
{ sensorId: 'feet-2', value: 1150, status: 'normal' }
];
}
function generateMixedScenario() {
const now = Date.now();
return [
{ sensorId: 'head-1', value: 3600, status: 'alarm' }, // Immediate alarm
{ sensorId: 'head-2', value: 3100, status: 'warning', warningStartTime: now - 10000 }, // Recent warning
{ sensorId: 'shoulder-1', value: 2900, status: 'warning', warningStartTime: now - 40000 }, // Long warning
{ sensorId: 'shoulder-2', value: 1750, status: 'normal' },
{ sensorId: 'back-1', value: 3100, status: 'alarm' }, // Immediate alarm
{ sensorId: 'back-2', value: 2600, status: 'warning', warningStartTime: now - 30000 }, // Warning close to escalation
{ sensorId: 'back-3', value: 1950, status: 'normal' },
{ sensorId: 'hip-1', value: 1900, status: 'normal' },
{ sensorId: 'hip-2', value: 2900, status: 'alarm' }, // Immediate alarm
{ sensorId: 'hip-3', value: 2300, status: 'warning', warningStartTime: now - 60000 }, // Warning
{ sensorId: 'thigh-1', value: 1600, status: 'normal' },
{ sensorId: 'thigh-2', value: 2100, status: 'warning', warningStartTime: now - 90000 }, // Warning
{ sensorId: 'calf-1', value: 2300, status: 'alarm' }, // Immediate alarm
{ sensorId: 'calf-2', value: 1900, status: 'warning', warningStartTime: now - 120000 }, // Warning
{ sensorId: 'feet-1', value: 1200, status: 'normal' },
{ sensorId: 'feet-2', value: 1900, status: 'alarm' } // Immediate alarm
];
}
export async function GET() {
return NextResponse.json({
success: true,
availableScenarios: [
{
name: 'normal',
description: 'All sensors operating within normal ranges'
},
{
name: 'warning',
description: 'Several sensors in warning state (above warning threshold)'
},
{
name: 'alarm',
description: 'Multiple sensors in immediate alarm state (above alarm threshold)'
},
{
name: 'escalation',
description: 'Sensors in warning state close to escalating to alarm after delay'
},
{
name: 'mixed',
description: 'Mixed scenario with normal, warning, and alarm states'
}
],
usage: 'POST to /api/test-scenarios with body: { "scenario": "scenario_name" }'
});
}