-- 0002_create_devices.up.sql -- -- DB 接入塊 2:建立 devices 表(裝置綁定身分長期保存)。 -- 對齊 docs/autoflow/04-architecture/database.md §2.2、§4、§5.1。 -- -- 接續 0001(users + models);owner_user_id 是 REFERENCES users(id) 的 FK,users 表已於 0001 建立。 -- -- 環境事實(已驗證,與 0001 相同):PostgreSQL 14.23,gen_random_uuid() PG14 內建可直接用。 -- devices(雙狀態模型:remote_status[tunnel-level] + status[USB-level],見 §2.2 Minor-3) CREATE TABLE devices ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), owner_user_id UUID NOT NULL REFERENCES users(id), name TEXT NOT NULL, device_type TEXT, serial_number TEXT, -- tunnel-level 狀態(雲端 remote-proxy 觀察 tunnel 連線) remote_status TEXT NOT NULL DEFAULT 'offline', -- online | offline | reconnecting | error last_seen_at TIMESTAMPTZ, -- 最後一次 tunnel heartbeat 時間 last_connected_at TIMESTAMPTZ, -- tunnel 最近一次建立時間 -- USB-level 狀態(local agent 上報) status TEXT NOT NULL DEFAULT 'unknown', -- online | offline | unknown created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), paired_at TIMESTAMPTZ, -- 配對完成時間(nullable) deleted_at TIMESTAMPTZ ); -- partial unique index(取代 table-level UNIQUE(owner_user_id, serial_number))。 -- 決策:已 soft-delete 的 device serial「能」重新註冊(見 §4 / §0.4 決策 2)。 -- 語意:唯一性只對「未刪除」(deleted_at IS NULL)紀錄成立; -- 刪掉一筆後,同 (owner, serial) 可再 INSERT 一筆新的(新 id),不違反 unique。 -- 這讓使用者把裝置刪了之後仍能用同一個實體 serial 重新註冊。 CREATE UNIQUE INDEX uq_devices_owner_serial_active ON devices (owner_user_id, serial_number) WHERE deleted_at IS NULL; -- owner-scoped index(List by owner;只索引未刪除紀錄)。 CREATE INDEX idx_devices_owner_active ON devices (owner_user_id) WHERE deleted_at IS NULL; -- remote_status filter(前端優先顯示雲端連線狀態;只索引未刪除紀錄)。 CREATE INDEX idx_devices_remote_status ON devices (remote_status) WHERE deleted_at IS NULL;