-- Migration 032: API Key lifecycle hardening -- -- Phase 3 of the unified-authz plan. Adds explicit lifecycle and policy -- columns to api_keys without touching the existing `key` column. Existing -- plain-text keys remain valid; key hashing is a separate follow-up step -- once revocation/expiry are wired through the validator and policy layer. -- -- New columns: -- revoked_at ISO timestamp, NULL when not revoked. -- expires_at ISO timestamp, NULL = no expiry. -- last_used_at ISO timestamp updated by validateApiKey on success. -- key_prefix first ~12 visible chars of the key, for safe display. -- ip_allowlist JSON array of CIDRs/IPs; NULL or [] = allow any. -- scopes JSON array of scope strings; NULL or [] = default scopes. ALTER TABLE api_keys ADD COLUMN revoked_at TEXT; ALTER TABLE api_keys ADD COLUMN expires_at TEXT; ALTER TABLE api_keys ADD COLUMN last_used_at TEXT; ALTER TABLE api_keys ADD COLUMN key_prefix TEXT; ALTER TABLE api_keys ADD COLUMN ip_allowlist TEXT; ALTER TABLE api_keys ADD COLUMN scopes TEXT; CREATE INDEX IF NOT EXISTS idx_api_keys_revoked_at ON api_keys(revoked_at); CREATE INDEX IF NOT EXISTS idx_api_keys_expires_at ON api_keys(expires_at);