vdi-cloud/platform/internal/store/schema.sql

60 lines
3.7 KiB
SQL

CREATE TABLE IF NOT EXISTS platform_metadata (
singleton boolean PRIMARY KEY DEFAULT true CHECK(singleton), mode text NOT NULL CHECK(mode IN ('demo','production'))
);
CREATE TABLE IF NOT EXISTS administrators (
id text PRIMARY KEY, username text NOT NULL UNIQUE, display_name text NOT NULL,
role text NOT NULL CHECK (role IN ('super_admin','operator','viewer')), password_hash text NOT NULL
);
CREATE TABLE IF NOT EXISTS admin_sessions (
id text PRIMARY KEY, admin_id text NOT NULL REFERENCES administrators(id), expires_at timestamptz NOT NULL
);
CREATE TABLE IF NOT EXISTS desktops (
id text PRIMARY KEY, name text NOT NULL, os text NOT NULL, node text NOT NULL, vmid integer NOT NULL,
pool text NOT NULL DEFAULT '', power_state text NOT NULL, service_state text NOT NULL DEFAULT 'unknown',
provider text NOT NULL CHECK (provider IN ('demo','proxmox')), endpoint text NOT NULL DEFAULT '', app text NOT NULL DEFAULT 'Desktop',
width integer NOT NULL DEFAULT 2560, height integer NOT NULL DEFAULT 1440, fps integer NOT NULL DEFAULT 30,
updated_at timestamptz NOT NULL DEFAULT now(), UNIQUE(provider,node,vmid)
);
CREATE TABLE IF NOT EXISTS terminals (
id text PRIMARY KEY, sn text NOT NULL UNIQUE, name text NOT NULL, group_name text NOT NULL DEFAULT '',
status text NOT NULL DEFAULT 'unregistered', agent_version text NOT NULL DEFAULT '', last_seen timestamptz,
session_desktop_id text REFERENCES desktops(id), config_version integer NOT NULL DEFAULT 1,
bootstrap_hash text NOT NULL, token_hash text UNIQUE, fps double precision, rtt double precision
);
CREATE TABLE IF NOT EXISTS users (
id text PRIMARY KEY, username text NOT NULL UNIQUE, display_name text NOT NULL,
enabled boolean NOT NULL DEFAULT true, terminal_id text UNIQUE REFERENCES terminals(id)
);
CREATE TABLE IF NOT EXISTS bindings (
user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE,
desktop_id text NOT NULL REFERENCES desktops(id), PRIMARY KEY(user_id,desktop_id)
);
CREATE TABLE IF NOT EXISTS resources (
id text PRIMARY KEY, name text NOT NULL, status text NOT NULL, cpu double precision NOT NULL,
memory double precision NOT NULL, storage double precision NOT NULL, provider text NOT NULL,
updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS tasks (
id text PRIMARY KEY, kind text NOT NULL, action text NOT NULL, target_id text NOT NULL, target_name text NOT NULL,
actor text NOT NULL, status text NOT NULL, message text NOT NULL DEFAULT '', provider_ref text NOT NULL DEFAULT '',
idempotency_key text NOT NULL, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(),
UNIQUE(actor,idempotency_key)
);
CREATE UNIQUE INDEX IF NOT EXISTS tasks_active_target ON tasks(kind,target_id) WHERE status IN ('queued','running');
CREATE TABLE IF NOT EXISTS audit_logs (
id text PRIMARY KEY, actor text NOT NULL, action text NOT NULL, target text NOT NULL, result text NOT NULL,
request_id text NOT NULL, created_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS connection_tickets (
token_hash text PRIMARY KEY, terminal_id text NOT NULL REFERENCES terminals(id), desktop_id text NOT NULL REFERENCES desktops(id),
expires_at timestamptz NOT NULL, consumed_at timestamptz
);
CREATE INDEX IF NOT EXISTS audit_created ON audit_logs(created_at DESC);
CREATE INDEX IF NOT EXISTS tasks_created ON tasks(created_at DESC);
ALTER TABLE terminals ADD COLUMN IF NOT EXISTS session_id text NOT NULL DEFAULT '';
ALTER TABLE terminals ADD COLUMN IF NOT EXISTS session_state text NOT NULL DEFAULT 'idle';
CREATE TABLE IF NOT EXISTS task_diagnostics (
task_id text PRIMARY KEY REFERENCES tasks(id) ON DELETE CASCADE,
content jsonb NOT NULL, created_at timestamptz NOT NULL DEFAULT now()
);