CREATE TABLE api_key ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenant (id) ON DELETE CASCADE, name TEXT NOT NULL, role TEXT NOT NULL, token_prefix TEXT NOT NULL, token_hash BYTEA NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), expires_at TIMESTAMPTZ, revoked_at TIMESTAMPTZ, last_used_at TIMESTAMPTZ, CONSTRAINT api_key_role_chk CHECK (role IN ('viewer', 'editor', 'operator', 'node')), CONSTRAINT api_key_name_chk CHECK (length(trim(name)) > 0), CONSTRAINT api_key_token_hash_len_chk CHECK (octet_length(token_hash) = 32) ); CREATE UNIQUE INDEX idx_api_key_token_hash ON api_key (token_hash); CREATE INDEX idx_api_key_tenant_active ON api_key (tenant_id) WHERE revoked_at IS NULL;