chahinebrini 8e562c982d feat(backend): MDM-Managed Flag — migration + endpoint + guards
- Prisma migration: users.mdm_managed (Boolean DEFAULT false) + users.mdm_detected_at (DateTime?)
- setMdmManaged() helper in server/db/profile.ts
- POST /api/users/me/mdm-status — App reports MDM status to backend
- cooldown/status + cooldown/request — early-return 400 when mdm_managed
- protection/state — response extended with mdmManaged: boolean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 00:46:44 +02:00

21 lines
1019 B
SQL

-- Profile.mdm_managed + Profile.mdm_detected_at
--
-- mdm_managed: true wenn das Device des Users via MDM (NEFilter-Profil sideloaded
-- + non-removable) verwaltet wird. Wird vom App-Code nach nativem NEFilterManager-
-- Check gesetzt (POST /api/users/me/mdm-status).
--
-- mdm_detected_at: Zeitstempel des ersten mdm_managed=true-Writes. Wird nur beim
-- Übergang false→true gesetzt und danach nie überschrieben — Audit-Trail.
--
-- Effekte:
-- - /api/cooldown/status: canDisableProtection=false, reason="mdm_managed"
-- - /api/cooldown/request: HTTP 400 error="mdm_managed_cannot_self_deactivate"
-- - /api/protection/state: mdmManaged=true
--
-- Backfill: alle existierenden Profile bekommen mdm_managed=false (DEFAULT) und
-- mdm_detected_at=NULL — keine Verhaltensänderung für laufende Sessions.
ALTER TABLE "rebreak"."profiles"
ADD COLUMN IF NOT EXISTS "mdm_managed" BOOLEAN NOT NULL DEFAULT false,
ADD COLUMN IF NOT EXISTS "mdm_detected_at" TIMESTAMPTZ NULL;