0002_launch.sql 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. BEGIN;
  2. CREATE TABLE events (
  3. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  4. tenant_id UUID REFERENCES tenants(id) ON DELETE SET NULL,
  5. event_public_id TEXT NOT NULL UNIQUE,
  6. slug TEXT NOT NULL UNIQUE,
  7. display_name TEXT NOT NULL,
  8. summary TEXT,
  9. status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'active', 'disabled', 'archived')),
  10. current_release_id UUID,
  11. created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  12. updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
  13. );
  14. CREATE INDEX events_tenant_id_idx ON events(tenant_id);
  15. CREATE INDEX events_status_idx ON events(status);
  16. CREATE TRIGGER events_set_updated_at
  17. BEFORE UPDATE ON events
  18. FOR EACH ROW EXECUTE FUNCTION set_updated_at();
  19. CREATE TABLE event_releases (
  20. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  21. release_public_id TEXT NOT NULL UNIQUE,
  22. event_id UUID NOT NULL REFERENCES events(id) ON DELETE CASCADE,
  23. release_no INTEGER NOT NULL,
  24. config_label TEXT NOT NULL,
  25. manifest_url TEXT NOT NULL,
  26. manifest_checksum_sha256 TEXT,
  27. route_code TEXT,
  28. status TEXT NOT NULL DEFAULT 'published' CHECK (status IN ('draft', 'published', 'retired', 'failed')),
  29. payload_jsonb JSONB NOT NULL DEFAULT '{}'::jsonb,
  30. published_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  31. UNIQUE (event_id, release_no)
  32. );
  33. CREATE INDEX event_releases_event_id_idx ON event_releases(event_id);
  34. CREATE INDEX event_releases_status_idx ON event_releases(status);
  35. ALTER TABLE events
  36. ADD CONSTRAINT events_current_release_fk
  37. FOREIGN KEY (current_release_id) REFERENCES event_releases(id) ON DELETE SET NULL;
  38. CREATE TABLE game_sessions (
  39. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  40. session_public_id TEXT NOT NULL UNIQUE,
  41. user_id UUID NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
  42. event_id UUID NOT NULL REFERENCES events(id) ON DELETE RESTRICT,
  43. event_release_id UUID NOT NULL REFERENCES event_releases(id) ON DELETE RESTRICT,
  44. device_key TEXT NOT NULL,
  45. client_type TEXT NOT NULL CHECK (client_type IN ('app', 'wechat')),
  46. route_code TEXT,
  47. status TEXT NOT NULL DEFAULT 'launched' CHECK (status IN ('launched', 'running', 'finished', 'failed', 'cancelled')),
  48. session_token_hash TEXT NOT NULL UNIQUE,
  49. session_token_expires_at TIMESTAMPTZ NOT NULL,
  50. launched_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  51. started_at TIMESTAMPTZ,
  52. ended_at TIMESTAMPTZ,
  53. created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  54. updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
  55. );
  56. CREATE INDEX game_sessions_user_id_idx ON game_sessions(user_id);
  57. CREATE INDEX game_sessions_event_id_idx ON game_sessions(event_id);
  58. CREATE INDEX game_sessions_status_idx ON game_sessions(status);
  59. CREATE TRIGGER game_sessions_set_updated_at
  60. BEFORE UPDATE ON game_sessions
  61. FOR EACH ROW EXECUTE FUNCTION set_updated_at();
  62. COMMIT;