005_schema_parity.sql 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. -- Align SQL migrations with current GORM persistence models.
  2. -- This file is designed to be safe on both fresh installs and existing databases.
  3. -- users: add fields added after initial migration
  4. ALTER TABLE users ADD COLUMN IF NOT EXISTS username VARCHAR(100) NOT NULL DEFAULT '';
  5. ALTER TABLE users ADD COLUMN IF NOT EXISTS wechat VARCHAR(100) NOT NULL DEFAULT '';
  6. ALTER TABLE users ADD COLUMN IF NOT EXISTS notes TEXT NOT NULL DEFAULT '';
  7. -- api_keys: allow longer keys (GORM model uses size:128)
  8. ALTER TABLE api_keys ALTER COLUMN key TYPE VARCHAR(128);
  9. -- accounts: scheduling and rate-limit fields used by repository queries
  10. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS schedulable BOOLEAN NOT NULL DEFAULT TRUE;
  11. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS rate_limited_at TIMESTAMPTZ;
  12. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS rate_limit_reset_at TIMESTAMPTZ;
  13. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS overload_until TIMESTAMPTZ;
  14. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS session_window_start TIMESTAMPTZ;
  15. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS session_window_end TIMESTAMPTZ;
  16. ALTER TABLE accounts ADD COLUMN IF NOT EXISTS session_window_status VARCHAR(20);
  17. CREATE INDEX IF NOT EXISTS idx_accounts_schedulable ON accounts(schedulable);
  18. CREATE INDEX IF NOT EXISTS idx_accounts_rate_limited_at ON accounts(rate_limited_at);
  19. CREATE INDEX IF NOT EXISTS idx_accounts_rate_limit_reset_at ON accounts(rate_limit_reset_at);
  20. CREATE INDEX IF NOT EXISTS idx_accounts_overload_until ON accounts(overload_until);
  21. -- redeem_codes: subscription redeem fields
  22. ALTER TABLE redeem_codes ADD COLUMN IF NOT EXISTS group_id BIGINT REFERENCES groups(id) ON DELETE SET NULL;
  23. ALTER TABLE redeem_codes ADD COLUMN IF NOT EXISTS validity_days INT NOT NULL DEFAULT 30;
  24. CREATE INDEX IF NOT EXISTS idx_redeem_codes_group_id ON redeem_codes(group_id);
  25. -- usage_logs: billing type used by filters and stats
  26. ALTER TABLE usage_logs ADD COLUMN IF NOT EXISTS billing_type SMALLINT NOT NULL DEFAULT 0;
  27. CREATE INDEX IF NOT EXISTS idx_usage_logs_billing_type ON usage_logs(billing_type);
  28. -- settings: key-value store
  29. CREATE TABLE IF NOT EXISTS settings (
  30. id BIGSERIAL PRIMARY KEY,
  31. key VARCHAR(100) NOT NULL UNIQUE,
  32. value TEXT NOT NULL,
  33. updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
  34. );