-- cdrop MVP schema (PROJECT_BRIEF.md §4) -- 以 IF NOT EXISTS 形式由 internal/db/bootstrap.go 启动期单事务执行。 CREATE TABLE IF NOT EXISTS devices ( user_id TEXT NOT NULL, name TEXT NOT NULL, type TEXT NOT NULL, last_seen INTEGER NOT NULL, PRIMARY KEY (user_id, name) ); CREATE TABLE IF NOT EXISTS shortcut_tokens ( jti TEXT PRIMARY KEY, user_id TEXT NOT NULL, label TEXT NOT NULL, scopes TEXT NOT NULL, created_at INTEGER NOT NULL, expires_at INTEGER NOT NULL, last_used_at INTEGER, revoked INTEGER NOT NULL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS transfer_sessions ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, sender_name TEXT NOT NULL, receiver_name TEXT NOT NULL, state TEXT NOT NULL, mode TEXT, file_name TEXT NOT NULL, file_size INTEGER NOT NULL, file_sha256 TEXT, bytes_transferred INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, finished_at INTEGER, fail_reason TEXT ); CREATE TABLE IF NOT EXISTS clipboard_state ( user_id TEXT PRIMARY KEY, content_type TEXT NOT NULL, content TEXT, source_device TEXT, updated_at INTEGER NOT NULL, -- version 是每用户严格单调递增的版本号(每次写 +1),变更探测 / ETag 用; -- updated_at 仍是墙钟(TTL / 展示)。既有库由 bootstrap 的幂等 ALTER 补列。 version INTEGER NOT NULL DEFAULT 0, -- origin_ts 是内容在源设备被复制的时刻(ms)。冲突收敛按它做 LWW——写入仅在 -- origin_ts 严格大于现存时被接受,故延迟/乱序到达的旧复制不会盖掉新的。 origin_ts INTEGER NOT NULL DEFAULT 0 );