48 lines
2.7 KiB
SQL
48 lines
2.7 KiB
SQL
-- 0001_init: telesrv 第一阶段持久化 schema(auth_key / user / authorization)。
|
||
--
|
||
-- 协议产物(auth_keys)与业务产物(authorizations)分表,遵循协议/业务隔离边界。
|
||
|
||
-- MTProto auth key:密钥交换产物。server 重启后据此解密客户端加密包,避免客户端重建密钥。
|
||
CREATE TABLE IF NOT EXISTS auth_keys (
|
||
auth_key_id BIGINT PRIMARY KEY, -- SHA1(auth_key) 低 64 位,小端解释为 int64
|
||
body BYTEA NOT NULL, -- 256 字节 auth key 原文
|
||
server_salt BIGINT NOT NULL, -- 密钥交换产出的初始 server salt
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
-- 用户:第一阶段仅登录链路必须字段。access_hash 为任何 InputUser 校验所必须,不可省。
|
||
CREATE TABLE IF NOT EXISTS users (
|
||
-- 普通用户 ID 从 2026-06-01 00:00:00 Asia/Shanghai 的 Unix 秒级时间戳开始。
|
||
-- 777000 等系统兼容账号显式插入,低于该区间。
|
||
id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1780243200) PRIMARY KEY,
|
||
access_hash BIGINT NOT NULL,
|
||
phone VARCHAR(32) NOT NULL,
|
||
first_name VARCHAR(64) NOT NULL DEFAULT '',
|
||
last_name VARCHAR(64) NOT NULL DEFAULT '',
|
||
username VARCHAR(64) NOT NULL DEFAULT '',
|
||
country_code VARCHAR(8) NOT NULL DEFAULT '',
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
CONSTRAINT users_phone_key UNIQUE (phone)
|
||
);
|
||
|
||
-- 授权:auth_key ↔ user 绑定 + initConnection 带来的设备信息。
|
||
-- 这是 auth.signIn 后绑定关系与 account.getAuthorizations 的权威来源;
|
||
-- 也是 rpc.ClientInfo(device/app/layer)的持久化归宿。
|
||
CREATE TABLE IF NOT EXISTS authorizations (
|
||
auth_key_id BIGINT PRIMARY KEY REFERENCES auth_keys(auth_key_id) ON DELETE CASCADE,
|
||
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
hash BIGINT NOT NULL DEFAULT 0, -- getAuthorizations 列表项 hash
|
||
layer INT NOT NULL DEFAULT 0,
|
||
device_model VARCHAR(128) NOT NULL DEFAULT '',
|
||
platform VARCHAR(64) NOT NULL DEFAULT '',
|
||
system_version VARCHAR(64) NOT NULL DEFAULT '',
|
||
api_id INT NOT NULL DEFAULT 0,
|
||
app_version VARCHAR(64) NOT NULL DEFAULT '',
|
||
ip VARCHAR(64) NOT NULL DEFAULT '',
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||
active_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||
);
|
||
|
||
-- 按 user 反查授权(PushToUser / getAuthorizations)。
|
||
CREATE INDEX IF NOT EXISTS authorizations_user_id_idx ON authorizations (user_id);
|