morethanadiagnosis-hub/openspec/specs/data-model.md
admin 556f74b196 docs(openspec): approve and apply 3 infrastructure proposals (Data Model, Authentication, Design System)
Approved proposals:
- Data Model v1: Consolidated schema with PHI/PII classification
- Authentication System: OAuth2/OIDC with RBAC & pseudonym support
- Design System: Unified components with WCAG 2.2 AA+ compliance

Applied to specs:
- openspec/specs/data-model.md (updated with full schema)
- openspec/specs/authentication.md (new)
- openspec/specs/design-system.md (new)
- openspec/specs/architecture.md (added infrastructure references)

All infrastructure proposals now approved and ready for implementation.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 00:39:01 +00:00

3.6 KiB

Data Model v1 (Consolidated Schema)

Status: approved Owners: Architecture, Data, Compliance Last updated: 2025-11-18 Related proposal: openspec/changes/2025-11-17-data-model-v1/proposal.md

Core Entities

User & Identity

  • User: id, email (PII), password_hash, created_at, updated_at, deleted_at
  • Profile: id, user_id (FK), display_name, pseudonym, pronouns, avatar_url, bio, health_journey (PHI), consent_flags, created_at, updated_at
  • Role: id, name (member, moderator, admin), permissions
  • UserRole: id, user_id (FK), role_id (FK)
  • Consent: id, user_id (FK), consent_type, granted, granted_at, revoked_at

Forum Domain

  • ForumCategory: id, name, description, order, created_at
  • ForumThread: id, category_id (FK), author_id (FK User), title, pinned, locked, created_at, updated_at
  • ForumPost: id, thread_id (FK), author_id (FK User), parent_post_id (FK), content (may contain PHI), deleted_at, created_at, updated_at
  • ForumReaction: id, post_id (FK), user_id (FK), emoji_code, created_at
  • ForumReport: id, post_id (FK), reporter_id (FK User), reason, status, moderator_notes, resolved_at, created_at

Content Domain

  • BlogPost: id, author_id (FK User), title, slug, content, published_at, created_at, updated_at
  • Resource: id, title, slug, content, access_tier (public/members), tags, created_at, updated_at

Media & Tributes

  • PodcastEpisode: id, title, description, audio_url, duration, published_at, created_at
  • TributeEntry: id, author_id (FK User), subject_name, memorial_text (may contain PHI), published, created_at, updated_at

Commerce

  • MerchProduct: id, name, description, price, stock_count, created_at, updated_at
  • Order: id, user_id (FK), total, status, shipping_address (PII), created_at, updated_at

Data Classification

  • Public: ForumCategory, PodcastEpisode, Resource (public tier), MerchProduct, BlogPost (published)
  • PII: User.email, Profile.display_name, Order.shipping_address, Profile.avatar_url
  • PHI: Profile.health_journey, ForumPost.content (context-dependent), TributeEntry.memorial_text (context-dependent)

Relationships & Constraints

  • User → Profile (1:1, cascade delete)
  • User → ForumPost (1:N, soft-delete user → anonymize posts)
  • User → ForumThread (1:N)
  • ForumCategory → ForumThread (1:N)
  • ForumThread → ForumPost (1:N, cascade delete)
  • ForumPost → ForumReaction (1:N, cascade delete)
  • ForumPost → ForumReport (1:N)
  • User → BlogPost (1:N)
  • User → TributeEntry (1:N)
  • User → Order (1:N)

Indexing Strategy

  • User: email (unique), created_at
  • Profile: user_id (unique FK)
  • ForumThread: category_id, author_id, created_at
  • ForumPost: thread_id, author_id, created_at
  • BlogPost: slug (unique), author_id, published_at
  • Resource: slug (unique), access_tier, tags (GIN/array)
  • Order: user_id, created_at

Retention & Soft-Delete

  • User: soft-delete (90-day window); anonymize posts on hard-delete
  • ForumPost: soft-delete (90-day window); replace author with "[deleted]" on user delete
  • BlogPost, TributeEntry: indefinite retention unless user requests DSR delete
  • Order: 7-year retention (tax compliance), then hard-delete

Migrations

  • Versioned migrations (Alembic, Flyway, or similar)
  • Idempotent scripts for rollback safety
  • Seed data: initial categories, default consents, sample resources

Security & Compliance

  • Encryption at rest: PII/PHI fields encrypted at database or app level
  • Access controls: RBAC at API layer; RLS for multi-tenancy if needed
  • Audit logging: all PHI/PII mutations logged (excluding content)
  • DSR support: export and delete operations mapped to all entities