2.7 KiB
2.7 KiB
Emergency Incident Workspace Design
Summary
Replace /app/emergency with a real safety/emergency incident workspace using the existing systemIncidents Drizzle table. The MVP covers manual event creation, status triage, filters, and metrics.
Route Boundary
- Unscoped route:
app/(app)/app/emergency/page.tsx - Scoped route:
app/(app)/app/[organizationSlug]/emergency/page.tsx - Navigation remains under
运营. - Permissions:
- read:
incident:read - mutate:
incident:manage
- read:
Server Component behavior:
- Load
getCurrentAuthContext(). - Redirect unauthenticated users to
/login. - Redirect users without
incident:readto dashboard. - Require active organization.
- Load incidents through
listEmergencyIncidentData(organizationId). - Render client workspace with
canManage.
Data Model
Use existing system_incidents:
organizationIdseverity:info | warning | criticalstatus:open | acknowledged | resolved | closedtitledescriptionsource- acknowledgement / resolution account and time fields
No schema change is required for MVP. Elder/bed linking stays future work for the context optimization task.
Server Helpers
Create modules/emergency/:
modules/emergency/types.ts- labels, DTOs, create/status validators.
modules/emergency/server/operations.tslistEmergencyIncidentData(organizationId: string)createEmergencyIncident(input)updateEmergencyIncidentStatus(input)
modules/emergency/components/EmergencyWorkspaceClient.tsx- metrics, filters, event table, create dialog, status actions.
API Design
GET /api/emergency/incidents- permission:
incident:read - response:
{ success: true; reason: string; data }
- permission:
POST /api/emergency/incidents- permission:
incident:manage - request:
{ severity; title; description; source } - creates an organization-scoped incident
- permission:
PATCH /api/emergency/incidents/[id]- permission:
incident:manage - request:
{ status } - updates only rows in the active organization
- permission:
All create/update mutations write audit logs after successful persistence.
UI Design
- Metrics: open, acknowledged, critical, resolved/closed today.
- Filters: status, severity, search by title/source/description.
- Dense table columns: event, severity, status, source, created time, updated time, actions.
- Actions: acknowledge, resolve, close.
- Manual creation dialog for authorized operators.
- Read-only users can see rows but not mutation controls.
Compatibility
- Existing
/api/system/incidents/[id]stays for system status settings. - The emergency workspace uses dedicated
/api/emergency/...routes so tests and UI contracts are local to the operational module.