File size: 3,433 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
-- Migration 008: Registered Keys Provisioning API (#464)
--
-- Adds three tables:
--   registered_keys      — auto-provisioned API keys with quota metadata
--   provider_key_limits  — per-provider issuance limits
--   account_key_limits   — per-account issuance limits

-- --------------------------------------------------------------------------
-- Table: registered_keys
-- --------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS registered_keys (
  id            TEXT PRIMARY KEY,           -- UUID
  key           TEXT NOT NULL UNIQUE,       -- hashed key material (sha256)
  key_prefix    TEXT NOT NULL,              -- first 8 chars for display (e.g. "ork_abc1")
  name          TEXT NOT NULL,
  provider      TEXT NOT NULL DEFAULT '',   -- associated provider (optional)
  account_id    TEXT NOT NULL DEFAULT '',   -- account/tenant identifier
  is_active     INTEGER NOT NULL DEFAULT 1,
  revoked_at    TEXT,                       -- ISO timestamp, null if active
  expires_at    TEXT,                       -- ISO timestamp, null = no expiry
  idempotency_key TEXT UNIQUE,             -- prevents duplicate issue requests
  daily_budget  INTEGER,                   -- max requests per day (null = unlimited)
  hourly_budget INTEGER,                   -- max requests per hour (null = unlimited)
  daily_used    INTEGER NOT NULL DEFAULT 0,
  hourly_used   INTEGER NOT NULL DEFAULT 0,
  last_reset_day  TEXT NOT NULL DEFAULT '',  -- YYYY-MM-DD for daily reset tracking
  last_reset_hour TEXT NOT NULL DEFAULT '',  -- YYYY-MM-DDTHH for hourly reset tracking
  created_at    TEXT NOT NULL DEFAULT (datetime('now')),
  updated_at    TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_registered_keys_provider  ON registered_keys(provider);
CREATE INDEX IF NOT EXISTS idx_registered_keys_account   ON registered_keys(account_id);
CREATE INDEX IF NOT EXISTS idx_registered_keys_active    ON registered_keys(is_active);
CREATE INDEX IF NOT EXISTS idx_registered_keys_idempotency ON registered_keys(idempotency_key);

-- --------------------------------------------------------------------------
-- Table: provider_key_limits  (per-provider issuance limits)
-- --------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS provider_key_limits (
  provider         TEXT PRIMARY KEY,
  max_active_keys  INTEGER,   -- null = unlimited
  daily_issue_limit  INTEGER, -- max keys per day
  hourly_issue_limit INTEGER, -- max keys per hour
  daily_issued     INTEGER NOT NULL DEFAULT 0,
  hourly_issued    INTEGER NOT NULL DEFAULT 0,
  last_reset_day   TEXT NOT NULL DEFAULT '',
  last_reset_hour  TEXT NOT NULL DEFAULT '',
  updated_at       TEXT NOT NULL DEFAULT (datetime('now'))
);

-- --------------------------------------------------------------------------
-- Table: account_key_limits  (per-account issuance limits)
-- --------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS account_key_limits (
  account_id       TEXT PRIMARY KEY,
  max_active_keys  INTEGER,
  daily_issue_limit  INTEGER,
  hourly_issue_limit INTEGER,
  daily_issued     INTEGER NOT NULL DEFAULT 0,
  hourly_issued    INTEGER NOT NULL DEFAULT 0,
  last_reset_day   TEXT NOT NULL DEFAULT '',
  last_reset_hour  TEXT NOT NULL DEFAULT '',
  updated_at       TEXT NOT NULL DEFAULT (datetime('now'))
);