Files
HealthLog/prisma/migrations/0485_drop_user_preview_features/migration.sql
T
Marc-André Bombeck 2ae23f4ca8 refactor(settings): remove the preview-feature opt-ins
The per-account preview switch was kept for the topic overview pages,
which were dropped before they shipped. Its one flag was stored, served
and backed up, and read by nothing; the column-reader audit listed it as
a pending consumer that will not come.

Removed completely:

- `/api/settings/preview-features` (GET, PATCH) is retired: it answers
  410 Gone with `meta.errorCode: route.retired` and `removedIn: 1.46.0`,
  and the contract publishes it under Retired. The route, its validation
  schema, the `PreviewFeatures` OpenAPI schemas and the settings module
  are deleted.
- Migration 0485 drops `users.preview_features_json` under a bounded lock
  wait, with the retry marker.
- The backup no longer writes the field. A file from v1.44 or v1.45 that
  carries it still restores: the schema accepts it and no codec reads it,
  so nothing is refused or written for it. The backup-parity goldens
  lose the field and apply one setting fewer.
- The data-wipe plan entry and the sharing-surface actor entry go with
  the route (frozen count 273 -> 272).

No client build reads the route: neither iOS repository nor any local
checkout references it.
2026-10-25 00:44:15 +02:00

28 lines
1.1 KiB
SQL

-- Drop the per-user preview-feature opt-ins.
--
-- `users.preview_features_json` (0440) stored one flag, `topics`, for the
-- topic overview pages. Those pages were dropped before they shipped, so no
-- surface ever read the flag; `/api/settings/preview-features` is retired
-- with this release and answers 410.
--
-- What is lost is a switch that switched nothing. A backup written by a
-- release that still had the column carries the field, and the restore
-- accepts and ignores it.
--
-- Dropping a column takes an ACCESS EXCLUSIVE lock on `users` for a catalogue
-- update only (no rewrite). The lock wait is bounded so a long-running reader
-- cannot queue every sign-in behind this statement; the deploy retries a
-- timed-out attempt.
--
-- Reversibility: re-adding the nullable column restores the shape; every
-- account then reads as all flags off, which is what every account had.
--
-- @retry-on-lock-timeout
DO $migration$
BEGIN
PERFORM set_config('lock_timeout', '5s', true);
ALTER TABLE "users" DROP COLUMN IF EXISTS "preview_features_json";
END
$migration$;