All checks were successful
Deploy production / deploy (push) Successful in 1m6s
134 lines
5.3 KiB
SQL
134 lines
5.3 KiB
SQL
CREATE TABLE "games"."cs2_share_codes" (
|
|
"code" text PRIMARY KEY,
|
|
"steam_id" text NOT NULL,
|
|
"match_id" bigint NOT NULL,
|
|
"outcome_id" bigint NOT NULL,
|
|
"token" integer NOT NULL,
|
|
"found_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"demo_parsed_at" timestamp with time zone
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "games"."accounts" (
|
|
"id" serial PRIMARY KEY,
|
|
"game" text NOT NULL,
|
|
"source" text NOT NULL,
|
|
"external_id" text NOT NULL,
|
|
"name" text,
|
|
"enabled" boolean DEFAULT true NOT NULL,
|
|
"state" jsonb DEFAULT '{}' NOT NULL,
|
|
"last_polled_at" timestamp with time zone,
|
|
"last_success_at" timestamp with time zone,
|
|
"last_error" text,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "games"."match_players" (
|
|
"id" serial PRIMARY KEY,
|
|
"match_id" integer NOT NULL,
|
|
"player_id" text NOT NULL,
|
|
"name" text,
|
|
"team" text,
|
|
"is_me" boolean DEFAULT false NOT NULL,
|
|
"kills" integer,
|
|
"deaths" integer,
|
|
"assists" integer,
|
|
"damage" integer,
|
|
"headshots" integer,
|
|
"placement" integer,
|
|
"rating" numeric,
|
|
"stats" jsonb NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "games"."matches" (
|
|
"id" serial PRIMARY KEY,
|
|
"game" text NOT NULL,
|
|
"source" text NOT NULL,
|
|
"external_id" text NOT NULL,
|
|
"played_at" timestamp with time zone NOT NULL,
|
|
"duration_s" integer,
|
|
"mode" text,
|
|
"map" text,
|
|
"result" text,
|
|
"score_own" integer,
|
|
"score_opp" integer,
|
|
"placement" integer,
|
|
"team_count" integer,
|
|
"kills" integer,
|
|
"deaths" integer,
|
|
"assists" integer,
|
|
"damage" integer,
|
|
"headshots" integer,
|
|
"rating" numeric,
|
|
"rating_label" text,
|
|
"match_count" integer DEFAULT 1 NOT NULL,
|
|
"share_code" text,
|
|
"extra" jsonb DEFAULT '{}' NOT NULL,
|
|
"raw" jsonb NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "games"."seasons" (
|
|
"id" serial PRIMARY KEY,
|
|
"game" text NOT NULL,
|
|
"source" text NOT NULL,
|
|
"season" text NOT NULL,
|
|
"board" text DEFAULT 'all' NOT NULL,
|
|
"rank" text,
|
|
"max_rank" text,
|
|
"rank_points" integer,
|
|
"max_rank_points" integer,
|
|
"matches" integer,
|
|
"wins" integer,
|
|
"losses" integer,
|
|
"kills" integer,
|
|
"deaths" integer,
|
|
"raw" jsonb NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "games"."snapshots" (
|
|
"id" serial PRIMARY KEY,
|
|
"game" text NOT NULL,
|
|
"source" text NOT NULL,
|
|
"kind" text NOT NULL,
|
|
"taken_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"data" jsonb NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "accounts_game_source_ext_idx" ON "games"."accounts" ("game","source","external_id");--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "match_players_match_player_idx" ON "games"."match_players" ("match_id","player_id");--> statement-breakpoint
|
|
CREATE INDEX "match_players_player_idx" ON "games"."match_players" ("player_id");--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "matches_source_ext_idx" ON "games"."matches" ("game","source","external_id");--> statement-breakpoint
|
|
CREATE INDEX "matches_game_played_idx" ON "games"."matches" ("game","played_at");--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "seasons_key_idx" ON "games"."seasons" ("game","source","season","board");--> statement-breakpoint
|
|
CREATE INDEX "snapshots_game_kind_idx" ON "games"."snapshots" ("game","source","kind","taken_at");--> statement-breakpoint
|
|
ALTER TABLE "games"."match_players" ADD CONSTRAINT "match_players_match_id_matches_id_fkey" FOREIGN KEY ("match_id") REFERENCES "games"."matches"("id") ON DELETE CASCADE;--> statement-breakpoint
|
|
-- Hand-written: grants (same pattern as the other app tables) and the accounts to poll.
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'personal_app') THEN
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON games.accounts, games.matches, games.match_players, games.seasons, games.snapshots, games.cs2_share_codes TO personal_app;
|
|
GRANT USAGE, SELECT ON SEQUENCE games.accounts_id_seq, games.matches_id_seq, games.match_players_id_seq, games.seasons_id_seq, games.snapshots_id_seq TO personal_app;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'personal_ro') THEN
|
|
GRANT SELECT ON games.accounts, games.matches, games.match_players, games.seasons, games.snapshots, games.cs2_share_codes TO personal_ro;
|
|
END IF;
|
|
END $$;
|
|
--> statement-breakpoint
|
|
-- Identifiers only (Steam64 of steamcommunity.com/id/stanrunge, FACEIT VashNerf, PUBG account
|
|
-- linked on FACEIT, Ubisoft name linked on FACEIT); keys and logins live in prod.env.
|
|
INSERT INTO games.accounts (game, source, external_id, name, state) VALUES
|
|
('cs2', 'leetify', '76561198299226338', 'stan', '{}'),
|
|
('cs2', 'faceit', '155cd4e3-e419-46b2-8a67-2e278b667445', 'VashNerf', '{"games":["cs2","csgo"]}'),
|
|
('cs2', 'steam', '76561198299226338', 'stan', '{}'),
|
|
('pubg', 'pubg', 'account.93db433b69c442f79502c0cabfaed8b0', 'Stannie2K', '{}'),
|
|
('pubg', 'faceit', '155cd4e3-e419-46b2-8a67-2e278b667445', 'VashNerf', '{"games":["pubg"]}'),
|
|
('r6', 'ubisoft', 'stan_osu', 'stan_osu', '{}')
|
|
ON CONFLICT (game, source, external_id) DO NOTHING;
|
|
--> statement-breakpoint
|
|
-- PUBG and R6 are tracked on PC accounts.
|
|
UPDATE games.library SET platform = 'PC' WHERE slug IN ('pubg', 'r6') AND platform IS NULL;
|