-- 设备推送标识(cid)注册表
-- 用于:通知服务按 user_id 查找当前用户的设备 client id,推送时调用 uniCloud sendMessage。
--
-- 设计要点:
--   - cid 由 App 端调用 uni.getPushClientId 获取后上报,此处持久化以便后续推送查找。
--   - cid 全局唯一(同一设备多次注册会被覆盖为同一行);user_id+cid 联合索引方便按用户反查。
--   - active=false 表示该设备已下线(用户主动登出、token 失效等),推送时按 active=TRUE 过滤。
--   - 序列起始 10000:为测试数据/手动 INSERT 预留。

BEGIN;

CREATE TABLE IF NOT EXISTS public.user_devices (
    id          BIGINT       NOT NULL PRIMARY KEY,
    user_id     BIGINT       NOT NULL,
    cid         VARCHAR(128) NOT NULL,
    platform    VARCHAR(20)  NOT NULL DEFAULT '',
    app_version VARCHAR(32)  NOT NULL DEFAULT '',
    device_model VARCHAR(64) NOT NULL DEFAULT '',
    active      BOOLEAN      NOT NULL DEFAULT TRUE,
    created_at  BIGINT       NOT NULL,
    updated_at  BIGINT       NOT NULL
);

-- cid 全局唯一
CREATE UNIQUE INDEX IF NOT EXISTS uq_user_devices_cid
    ON public.user_devices(cid);

-- 按用户查询活跃设备
CREATE INDEX IF NOT EXISTS idx_user_devices_user_active
    ON public.user_devices(user_id) WHERE active = TRUE;

-- 序列:预留给测试/手动 insert
CREATE SEQUENCE IF NOT EXISTS user_devices_id_seq START WITH 10000;

-- 同步序列(防止已有数据场景下序列落后)
SELECT setval(
    'user_devices_id_seq',
    GREATEST(10000, (SELECT COALESCE(MAX(id), 0) FROM public.user_devices))
);

COMMIT;