Files

3.2 KiB

Design

Boundaries

This task is a completion pass over existing persisted modules. It does not add schema or a new AI provider path.

  • Collaboration data remains owned by modules/devices, modules/notices, modules/alerts, and modules/family.
  • Dashboard data loading stays in the Server Component at app/(app)/app/dashboard/page.tsx.
  • Presentation stays in modules/dashboard/components/DashboardHome.tsx.
  • AI board aggregation belongs in modules/ai/server/analysis.ts because redaction depends on existing AI analysis scope rules.

Data Flow

  1. Dashboard page loads auth context and checks whether any visible dashboard section is permitted.
  2. It conditionally calls existing operations for core care/health/emergency and collaboration modules.
  3. It calls a new AI analysis listing function only when ai:read is present.
  4. The AI service lists organization-scoped elder_ai_analyses, joins elders for display names, and maps each row through canViewAnalysisScopes.
  5. The dashboard component receives only serializable data and renders queue cards/summary cards from that data.

Seeding Strategy

Existing seedDefaultWorkspaceData exits early when core room/bed/elder/admission rows already exist. That protected existing workspaces, but it skipped collaboration seed records added later. Add a separate idempotent collaboration seeding helper that:

  • reads existing rows by stable natural keys per table;
  • inserts only missing default rows;
  • resolves dependencies from existing or newly inserted rows;
  • never updates or deletes existing operator data;
  • runs both for fully new workspaces and for already-initialized workspaces.

Stable keys:

  • devices: code
  • tickets: title
  • notices: title
  • alert rules: name
  • alert triggers: title
  • family contacts: elderId + name
  • family visits: elderId + contactId + scheduled offset/status/notes is not stable across reruns, so use elderId + contactId + notes for default records
  • family feedback: elderId + contactId + content

Permission Model

  • Dashboard visibility expands to collaboration and AI read permissions.
  • Collaboration sections call server operations only when their read permission is present.
  • AI board calls the aggregation function only with ai:read.
  • Redaction uses the existing canViewAnalysisScopes and getPermissionForDataScope rules, so a user may see that an analysis exists without seeing restricted result details.

UI Shape

  • Keep DashboardHome as a single Server-rendered component with small local helper render functions.
  • Add collaboration queue cards for device tickets, notices, alert triggers, and family items.
  • Add an AI analysis board card with risk/status badges, data scopes, created time, and a link back to the elder workspace.
  • Empty states must be honest: no generated counts or placeholder rows.

Compatibility

No schema migration is required. The seeding helper is additive and only inserts missing default data.

Rollback

Rollback is limited to the AI aggregation helper, dashboard props/rendering, dashboard page conditional loads, and the additive seed helper. Existing collaboration CRUD modules remain untouched unless tests expose a direct integration bug.