38 lines
2.0 KiB
SQL
38 lines
2.0 KiB
SQL
-- ====================================================================
|
|
-- 0062_push_platform — Push-Abos plattformfähig machen (Web + Expo/nativ)
|
|
-- ====================================================================
|
|
-- Migration 0060 legte push_subscriptions für Web-Push (VAPID) an:
|
|
-- endpoint/p256dh/auth sind Browser-Push-Spezifika und NOT NULL. Die native
|
|
-- App nutzt stattdessen den Expo-Push-Service (ein Token, Expo relayed an
|
|
-- APNs/FCM) — dort gibt es kein p256dh/auth. Wir erweitern die Tabelle um
|
|
-- eine platform-Spalte und einen expo_push_token, und lockern die Web-only-
|
|
-- Spalten auf NULLable, damit Expo-Abos ohne sie gespeichert werden können.
|
|
--
|
|
-- Bestandsdaten: alle vorhandenen Zeilen sind Web-Abos → platform='web'
|
|
-- (Default deckt das ab). Der Versand-Fork in lib/push.ts wählt anhand von
|
|
-- platform den richtigen Kanal.
|
|
|
|
alter table public.push_subscriptions
|
|
add column if not exists platform text not null default 'web',
|
|
add column if not exists expo_push_token text;
|
|
|
|
-- Web-only-Spalten für Expo-Abos optional machen.
|
|
alter table public.push_subscriptions alter column endpoint drop not null;
|
|
alter table public.push_subscriptions alter column p256dh drop not null;
|
|
alter table public.push_subscriptions alter column auth drop not null;
|
|
|
|
-- Ein Expo-Push-Token darf nur einmal existieren (ein Gerät = ein Abo),
|
|
-- analog zum unique endpoint bei Web. Partieller Index, damit mehrere
|
|
-- Web-Zeilen mit NULL-Token nicht kollidieren.
|
|
create unique index if not exists push_subscriptions_expo_token_key
|
|
on public.push_subscriptions (expo_push_token)
|
|
where expo_push_token is not null;
|
|
|
|
-- Integrität: je nach platform müssen die passenden Felder gesetzt sein.
|
|
alter table public.push_subscriptions drop constraint if exists push_subscriptions_platform_fields;
|
|
alter table public.push_subscriptions add constraint push_subscriptions_platform_fields check (
|
|
(platform = 'web' and endpoint is not null and p256dh is not null and auth is not null)
|
|
or
|
|
(platform = 'expo' and expo_push_token is not null)
|
|
);
|