@opprs/db-prisma 2.2.0 → 2.2.1-canary.090cc41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +12 -18
- package/dist/index.cjs +1233 -158
- package/dist/index.d.cts +1028 -106
- package/dist/index.d.ts +1028 -106
- package/dist/index.js +1117 -141
- package/package.json +5 -4
- package/prisma/migrations/20260104000000_add_player_number/migration.sql +23 -0
- package/prisma/migrations/20260104092800_add_location_model_and_tournament_fields/migration.sql +45 -0
- package/prisma/migrations/20260104210034_add_policy_acceptance_fields/migration.sql +19 -0
- package/prisma/migrations/20260104231435_split_entries_standings/migration.sql +137 -0
- package/prisma/migrations/20260105000000_add_oppr_ranking_models/migration.sql +108 -0
- package/prisma/migrations/20260105010000_add_qualifying_format/migration.sql +5 -0
- package/prisma/migrations/20260105010000_add_tournament_external_url/migration.sql +2 -0
- package/prisma/migrations/20260105020000_add_blog_post_model/migration.sql +81 -0
- package/prisma/schema.prisma +309 -37
- package/prisma/seed.ts +157 -48
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opprs/db-prisma",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.1-canary.090cc41",
|
|
4
4
|
"description": "Database backend for OPPR (Open Pinball Player Ranking System) using Prisma and PostgreSQL",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"oppr",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"tournament"
|
|
13
13
|
],
|
|
14
14
|
"author": "Mitch McAffee",
|
|
15
|
-
"license": "
|
|
15
|
+
"license": "AGPL-3.0-or-later",
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
18
18
|
"url": "https://github.com/themcaffee/OPPR",
|
|
@@ -56,16 +56,17 @@
|
|
|
56
56
|
"vitest": "^4.0.16"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@opprs/core": "^
|
|
59
|
+
"@opprs/core": "^2.2.1-canary.090cc41"
|
|
60
60
|
},
|
|
61
61
|
"engines": {
|
|
62
|
-
"node": ">=
|
|
62
|
+
"node": ">=20.9.0"
|
|
63
63
|
},
|
|
64
64
|
"prisma": {
|
|
65
65
|
"seed": "tsx prisma/seed.ts"
|
|
66
66
|
},
|
|
67
67
|
"scripts": {
|
|
68
68
|
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
69
|
+
"postbuild": "cp ../../LICENSE .",
|
|
69
70
|
"dev": "tsup src/index.ts --format cjs,esm --dts --watch",
|
|
70
71
|
"typecheck": "tsc --noEmit",
|
|
71
72
|
"lint": "eslint src --ext .ts",
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- AlterTable
|
|
2
|
+
-- First add playerNumber as nullable, populate it, then make it required
|
|
3
|
+
ALTER TABLE "Player" ADD COLUMN "playerNumber" INTEGER;
|
|
4
|
+
|
|
5
|
+
-- Populate existing players with unique 5-digit player numbers
|
|
6
|
+
-- Use a sequence starting from 10000, incrementing for each existing row
|
|
7
|
+
WITH numbered_players AS (
|
|
8
|
+
SELECT id, ROW_NUMBER() OVER (ORDER BY "createdAt") + 9999 AS num
|
|
9
|
+
FROM "Player"
|
|
10
|
+
)
|
|
11
|
+
UPDATE "Player"
|
|
12
|
+
SET "playerNumber" = numbered_players.num::INTEGER
|
|
13
|
+
FROM numbered_players
|
|
14
|
+
WHERE "Player".id = numbered_players.id;
|
|
15
|
+
|
|
16
|
+
-- Make the column required and add unique constraint
|
|
17
|
+
ALTER TABLE "Player" ALTER COLUMN "playerNumber" SET NOT NULL;
|
|
18
|
+
|
|
19
|
+
-- CreateIndex
|
|
20
|
+
CREATE UNIQUE INDEX "Player_playerNumber_key" ON "Player"("playerNumber");
|
|
21
|
+
|
|
22
|
+
-- CreateIndex
|
|
23
|
+
CREATE INDEX "Player_playerNumber_idx" ON "Player"("playerNumber");
|
package/prisma/migrations/20260104092800_add_location_model_and_tournament_fields/migration.sql
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "Location" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
5
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
6
|
+
"externalId" TEXT,
|
|
7
|
+
"name" TEXT NOT NULL,
|
|
8
|
+
"address" TEXT,
|
|
9
|
+
"city" TEXT,
|
|
10
|
+
"state" TEXT,
|
|
11
|
+
"country" TEXT,
|
|
12
|
+
|
|
13
|
+
CONSTRAINT "Location_pkey" PRIMARY KEY ("id")
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
-- CreateIndex
|
|
17
|
+
CREATE UNIQUE INDEX "Location_externalId_key" ON "Location"("externalId");
|
|
18
|
+
|
|
19
|
+
-- CreateIndex
|
|
20
|
+
CREATE INDEX "Location_externalId_idx" ON "Location"("externalId");
|
|
21
|
+
|
|
22
|
+
-- CreateIndex
|
|
23
|
+
CREATE INDEX "Location_name_idx" ON "Location"("name");
|
|
24
|
+
|
|
25
|
+
-- CreateIndex
|
|
26
|
+
CREATE INDEX "Location_city_idx" ON "Location"("city");
|
|
27
|
+
|
|
28
|
+
-- AlterTable: Add new columns to Tournament
|
|
29
|
+
ALTER TABLE "Tournament" ADD COLUMN "description" VARCHAR(2000);
|
|
30
|
+
ALTER TABLE "Tournament" ADD COLUMN "locationId" TEXT;
|
|
31
|
+
ALTER TABLE "Tournament" ADD COLUMN "organizerId" TEXT;
|
|
32
|
+
|
|
33
|
+
-- DropColumn: Remove old location string column (replaced by Location relation)
|
|
34
|
+
ALTER TABLE "Tournament" DROP COLUMN IF EXISTS "location";
|
|
35
|
+
|
|
36
|
+
-- CreateIndex for new Tournament columns
|
|
37
|
+
CREATE INDEX "Tournament_locationId_idx" ON "Tournament"("locationId");
|
|
38
|
+
|
|
39
|
+
CREATE INDEX "Tournament_organizerId_idx" ON "Tournament"("organizerId");
|
|
40
|
+
|
|
41
|
+
-- AddForeignKey: Tournament -> Location
|
|
42
|
+
ALTER TABLE "Tournament" ADD CONSTRAINT "Tournament_locationId_fkey" FOREIGN KEY ("locationId") REFERENCES "Location"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
43
|
+
|
|
44
|
+
-- AddForeignKey: Tournament -> Player (organizer)
|
|
45
|
+
ALTER TABLE "Tournament" ADD CONSTRAINT "Tournament_organizerId_fkey" FOREIGN KEY ("organizerId") REFERENCES "Player"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- You are about to drop the column `email` on the `Player` table. All the data in the column will be lost.
|
|
5
|
+
|
|
6
|
+
*/
|
|
7
|
+
-- DropIndex
|
|
8
|
+
DROP INDEX "Player_email_idx";
|
|
9
|
+
|
|
10
|
+
-- DropIndex
|
|
11
|
+
DROP INDEX "Player_email_key";
|
|
12
|
+
|
|
13
|
+
-- AlterTable
|
|
14
|
+
ALTER TABLE "Player" DROP COLUMN "email";
|
|
15
|
+
|
|
16
|
+
-- AlterTable
|
|
17
|
+
ALTER TABLE "User" ADD COLUMN "codeOfConductAcceptedAt" TIMESTAMP(3),
|
|
18
|
+
ADD COLUMN "privacyPolicyAcceptedAt" TIMESTAMP(3),
|
|
19
|
+
ADD COLUMN "tosAcceptedAt" TIMESTAMP(3);
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- You are about to drop the `TournamentResult` table. If the table is not empty, all the data it contains will be lost.
|
|
5
|
+
|
|
6
|
+
*/
|
|
7
|
+
-- CreateEnum
|
|
8
|
+
CREATE TYPE "MatchResult" AS ENUM ('WIN', 'LOSS', 'TIE');
|
|
9
|
+
|
|
10
|
+
-- DropForeignKey
|
|
11
|
+
ALTER TABLE "TournamentResult" DROP CONSTRAINT "TournamentResult_playerId_fkey";
|
|
12
|
+
|
|
13
|
+
-- DropForeignKey
|
|
14
|
+
ALTER TABLE "TournamentResult" DROP CONSTRAINT "TournamentResult_tournamentId_fkey";
|
|
15
|
+
|
|
16
|
+
-- DropTable
|
|
17
|
+
DROP TABLE "TournamentResult";
|
|
18
|
+
|
|
19
|
+
-- CreateTable
|
|
20
|
+
CREATE TABLE "Round" (
|
|
21
|
+
"id" TEXT NOT NULL,
|
|
22
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
23
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
24
|
+
"tournamentId" TEXT NOT NULL,
|
|
25
|
+
"number" INTEGER NOT NULL,
|
|
26
|
+
"name" TEXT,
|
|
27
|
+
"isFinals" BOOLEAN NOT NULL DEFAULT false,
|
|
28
|
+
|
|
29
|
+
CONSTRAINT "Round_pkey" PRIMARY KEY ("id")
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
-- CreateTable
|
|
33
|
+
CREATE TABLE "Match" (
|
|
34
|
+
"id" TEXT NOT NULL,
|
|
35
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
36
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
37
|
+
"tournamentId" TEXT NOT NULL,
|
|
38
|
+
"roundId" TEXT,
|
|
39
|
+
"number" INTEGER,
|
|
40
|
+
"machineName" TEXT,
|
|
41
|
+
|
|
42
|
+
CONSTRAINT "Match_pkey" PRIMARY KEY ("id")
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
-- CreateTable
|
|
46
|
+
CREATE TABLE "Entry" (
|
|
47
|
+
"id" TEXT NOT NULL,
|
|
48
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
49
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
50
|
+
"matchId" TEXT NOT NULL,
|
|
51
|
+
"playerId" TEXT NOT NULL,
|
|
52
|
+
"result" "MatchResult" NOT NULL,
|
|
53
|
+
"position" INTEGER,
|
|
54
|
+
|
|
55
|
+
CONSTRAINT "Entry_pkey" PRIMARY KEY ("id")
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
-- CreateTable
|
|
59
|
+
CREATE TABLE "Standing" (
|
|
60
|
+
"id" TEXT NOT NULL,
|
|
61
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
62
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
63
|
+
"tournamentId" TEXT NOT NULL,
|
|
64
|
+
"playerId" TEXT NOT NULL,
|
|
65
|
+
"position" INTEGER NOT NULL,
|
|
66
|
+
"isFinals" BOOLEAN NOT NULL DEFAULT false,
|
|
67
|
+
"optedOut" BOOLEAN NOT NULL DEFAULT false,
|
|
68
|
+
"linearPoints" DOUBLE PRECISION DEFAULT 0,
|
|
69
|
+
"dynamicPoints" DOUBLE PRECISION DEFAULT 0,
|
|
70
|
+
"totalPoints" DOUBLE PRECISION,
|
|
71
|
+
"ageInDays" INTEGER DEFAULT 0,
|
|
72
|
+
"decayMultiplier" DOUBLE PRECISION DEFAULT 1.0,
|
|
73
|
+
"decayedPoints" DOUBLE PRECISION,
|
|
74
|
+
"efficiency" DOUBLE PRECISION,
|
|
75
|
+
|
|
76
|
+
CONSTRAINT "Standing_pkey" PRIMARY KEY ("id")
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
-- CreateIndex
|
|
80
|
+
CREATE INDEX "Round_tournamentId_idx" ON "Round"("tournamentId");
|
|
81
|
+
|
|
82
|
+
-- CreateIndex
|
|
83
|
+
CREATE INDEX "Round_tournamentId_isFinals_idx" ON "Round"("tournamentId", "isFinals");
|
|
84
|
+
|
|
85
|
+
-- CreateIndex
|
|
86
|
+
CREATE UNIQUE INDEX "Round_tournamentId_number_isFinals_key" ON "Round"("tournamentId", "number", "isFinals");
|
|
87
|
+
|
|
88
|
+
-- CreateIndex
|
|
89
|
+
CREATE INDEX "Match_tournamentId_idx" ON "Match"("tournamentId");
|
|
90
|
+
|
|
91
|
+
-- CreateIndex
|
|
92
|
+
CREATE INDEX "Match_roundId_idx" ON "Match"("roundId");
|
|
93
|
+
|
|
94
|
+
-- CreateIndex
|
|
95
|
+
CREATE INDEX "Entry_matchId_idx" ON "Entry"("matchId");
|
|
96
|
+
|
|
97
|
+
-- CreateIndex
|
|
98
|
+
CREATE INDEX "Entry_playerId_idx" ON "Entry"("playerId");
|
|
99
|
+
|
|
100
|
+
-- CreateIndex
|
|
101
|
+
CREATE UNIQUE INDEX "Entry_matchId_playerId_key" ON "Entry"("matchId", "playerId");
|
|
102
|
+
|
|
103
|
+
-- CreateIndex
|
|
104
|
+
CREATE INDEX "Standing_playerId_idx" ON "Standing"("playerId");
|
|
105
|
+
|
|
106
|
+
-- CreateIndex
|
|
107
|
+
CREATE INDEX "Standing_tournamentId_idx" ON "Standing"("tournamentId");
|
|
108
|
+
|
|
109
|
+
-- CreateIndex
|
|
110
|
+
CREATE INDEX "Standing_tournamentId_isFinals_idx" ON "Standing"("tournamentId", "isFinals");
|
|
111
|
+
|
|
112
|
+
-- CreateIndex
|
|
113
|
+
CREATE INDEX "Standing_position_idx" ON "Standing"("position");
|
|
114
|
+
|
|
115
|
+
-- CreateIndex
|
|
116
|
+
CREATE UNIQUE INDEX "Standing_playerId_tournamentId_isFinals_key" ON "Standing"("playerId", "tournamentId", "isFinals");
|
|
117
|
+
|
|
118
|
+
-- AddForeignKey
|
|
119
|
+
ALTER TABLE "Round" ADD CONSTRAINT "Round_tournamentId_fkey" FOREIGN KEY ("tournamentId") REFERENCES "Tournament"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
120
|
+
|
|
121
|
+
-- AddForeignKey
|
|
122
|
+
ALTER TABLE "Match" ADD CONSTRAINT "Match_tournamentId_fkey" FOREIGN KEY ("tournamentId") REFERENCES "Tournament"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
123
|
+
|
|
124
|
+
-- AddForeignKey
|
|
125
|
+
ALTER TABLE "Match" ADD CONSTRAINT "Match_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
126
|
+
|
|
127
|
+
-- AddForeignKey
|
|
128
|
+
ALTER TABLE "Entry" ADD CONSTRAINT "Entry_matchId_fkey" FOREIGN KEY ("matchId") REFERENCES "Match"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
129
|
+
|
|
130
|
+
-- AddForeignKey
|
|
131
|
+
ALTER TABLE "Entry" ADD CONSTRAINT "Entry_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
132
|
+
|
|
133
|
+
-- AddForeignKey
|
|
134
|
+
ALTER TABLE "Standing" ADD CONSTRAINT "Standing_tournamentId_fkey" FOREIGN KEY ("tournamentId") REFERENCES "Tournament"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
135
|
+
|
|
136
|
+
-- AddForeignKey
|
|
137
|
+
ALTER TABLE "Standing" ADD CONSTRAINT "Standing_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
-- CreateEnum
|
|
2
|
+
CREATE TYPE "OpprRankingChangeType" AS ENUM ('INITIAL', 'TOURNAMENT_RESULT', 'RANKING_REFRESH', 'RD_DECAY', 'MANUAL_ADJUSTMENT');
|
|
3
|
+
|
|
4
|
+
-- CreateTable
|
|
5
|
+
CREATE TABLE "OpprPlayerRanking" (
|
|
6
|
+
"id" TEXT NOT NULL,
|
|
7
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
8
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
9
|
+
"playerId" TEXT NOT NULL,
|
|
10
|
+
"rating" DOUBLE PRECISION NOT NULL DEFAULT 1500,
|
|
11
|
+
"ratingDeviation" DOUBLE PRECISION NOT NULL DEFAULT 200,
|
|
12
|
+
"lastRatingUpdate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
"ranking" INTEGER,
|
|
14
|
+
"isRated" BOOLEAN NOT NULL DEFAULT false,
|
|
15
|
+
|
|
16
|
+
CONSTRAINT "OpprPlayerRanking_pkey" PRIMARY KEY ("id")
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
-- CreateTable
|
|
20
|
+
CREATE TABLE "OpprRankingHistory" (
|
|
21
|
+
"id" TEXT NOT NULL,
|
|
22
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
23
|
+
"opprPlayerRankingId" TEXT NOT NULL,
|
|
24
|
+
"rating" DOUBLE PRECISION NOT NULL,
|
|
25
|
+
"ratingDeviation" DOUBLE PRECISION NOT NULL,
|
|
26
|
+
"ranking" INTEGER,
|
|
27
|
+
"isRated" BOOLEAN NOT NULL,
|
|
28
|
+
"changeType" "OpprRankingChangeType" NOT NULL,
|
|
29
|
+
"tournamentId" TEXT,
|
|
30
|
+
"notes" VARCHAR(500),
|
|
31
|
+
|
|
32
|
+
CONSTRAINT "OpprRankingHistory_pkey" PRIMARY KEY ("id")
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
-- CreateIndex
|
|
36
|
+
CREATE UNIQUE INDEX "OpprPlayerRanking_playerId_key" ON "OpprPlayerRanking"("playerId");
|
|
37
|
+
|
|
38
|
+
-- CreateIndex
|
|
39
|
+
CREATE INDEX "OpprPlayerRanking_playerId_idx" ON "OpprPlayerRanking"("playerId");
|
|
40
|
+
|
|
41
|
+
-- CreateIndex
|
|
42
|
+
CREATE INDEX "OpprPlayerRanking_rating_idx" ON "OpprPlayerRanking"("rating");
|
|
43
|
+
|
|
44
|
+
-- CreateIndex
|
|
45
|
+
CREATE INDEX "OpprPlayerRanking_ranking_idx" ON "OpprPlayerRanking"("ranking");
|
|
46
|
+
|
|
47
|
+
-- CreateIndex
|
|
48
|
+
CREATE INDEX "OpprPlayerRanking_isRated_idx" ON "OpprPlayerRanking"("isRated");
|
|
49
|
+
|
|
50
|
+
-- CreateIndex
|
|
51
|
+
CREATE INDEX "OpprRankingHistory_opprPlayerRankingId_idx" ON "OpprRankingHistory"("opprPlayerRankingId");
|
|
52
|
+
|
|
53
|
+
-- CreateIndex
|
|
54
|
+
CREATE INDEX "OpprRankingHistory_createdAt_idx" ON "OpprRankingHistory"("createdAt");
|
|
55
|
+
|
|
56
|
+
-- CreateIndex
|
|
57
|
+
CREATE INDEX "OpprRankingHistory_tournamentId_idx" ON "OpprRankingHistory"("tournamentId");
|
|
58
|
+
|
|
59
|
+
-- CreateIndex
|
|
60
|
+
CREATE INDEX "OpprRankingHistory_opprPlayerRankingId_createdAt_idx" ON "OpprRankingHistory"("opprPlayerRankingId", "createdAt");
|
|
61
|
+
|
|
62
|
+
-- AddForeignKey
|
|
63
|
+
ALTER TABLE "OpprPlayerRanking" ADD CONSTRAINT "OpprPlayerRanking_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
64
|
+
|
|
65
|
+
-- AddForeignKey
|
|
66
|
+
ALTER TABLE "OpprRankingHistory" ADD CONSTRAINT "OpprRankingHistory_opprPlayerRankingId_fkey" FOREIGN KEY ("opprPlayerRankingId") REFERENCES "OpprPlayerRanking"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
67
|
+
|
|
68
|
+
-- AddForeignKey
|
|
69
|
+
ALTER TABLE "OpprRankingHistory" ADD CONSTRAINT "OpprRankingHistory_tournamentId_fkey" FOREIGN KEY ("tournamentId") REFERENCES "Tournament"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
70
|
+
|
|
71
|
+
-- Migrate existing Player rating data to OpprPlayerRanking
|
|
72
|
+
INSERT INTO "OpprPlayerRanking" ("id", "createdAt", "updatedAt", "playerId", "rating", "ratingDeviation", "lastRatingUpdate", "ranking", "isRated")
|
|
73
|
+
SELECT
|
|
74
|
+
gen_random_uuid()::text,
|
|
75
|
+
NOW(),
|
|
76
|
+
NOW(),
|
|
77
|
+
"id",
|
|
78
|
+
"rating",
|
|
79
|
+
"ratingDeviation",
|
|
80
|
+
"lastRatingUpdate",
|
|
81
|
+
"ranking",
|
|
82
|
+
"isRated"
|
|
83
|
+
FROM "Player";
|
|
84
|
+
|
|
85
|
+
-- Create initial history records for all migrated rankings
|
|
86
|
+
INSERT INTO "OpprRankingHistory" ("id", "createdAt", "opprPlayerRankingId", "rating", "ratingDeviation", "ranking", "isRated", "changeType", "notes")
|
|
87
|
+
SELECT
|
|
88
|
+
gen_random_uuid()::text,
|
|
89
|
+
NOW(),
|
|
90
|
+
opr."id",
|
|
91
|
+
opr."rating",
|
|
92
|
+
opr."ratingDeviation",
|
|
93
|
+
opr."ranking",
|
|
94
|
+
opr."isRated",
|
|
95
|
+
'INITIAL',
|
|
96
|
+
'Migrated from Player model'
|
|
97
|
+
FROM "OpprPlayerRanking" opr;
|
|
98
|
+
|
|
99
|
+
-- Drop old indexes from Player table
|
|
100
|
+
DROP INDEX IF EXISTS "Player_rating_idx";
|
|
101
|
+
DROP INDEX IF EXISTS "Player_ranking_idx";
|
|
102
|
+
|
|
103
|
+
-- Remove old columns from Player table
|
|
104
|
+
ALTER TABLE "Player" DROP COLUMN "rating";
|
|
105
|
+
ALTER TABLE "Player" DROP COLUMN "ratingDeviation";
|
|
106
|
+
ALTER TABLE "Player" DROP COLUMN "ranking";
|
|
107
|
+
ALTER TABLE "Player" DROP COLUMN "isRated";
|
|
108
|
+
ALTER TABLE "Player" DROP COLUMN "lastRatingUpdate";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- CreateEnum
|
|
2
|
+
CREATE TYPE "TournamentFormatType" AS ENUM ('SINGLE_ELIMINATION', 'DOUBLE_ELIMINATION', 'MATCH_PLAY', 'BEST_GAME', 'CARD_QUALIFYING', 'PIN_GOLF', 'FLIP_FRENZY', 'STRIKE_FORMAT', 'TARGET_MATCH_PLAY', 'HYBRID', 'NONE');
|
|
3
|
+
|
|
4
|
+
-- AlterTable
|
|
5
|
+
ALTER TABLE "Tournament" ADD COLUMN "qualifyingFormat" "TournamentFormatType" NOT NULL DEFAULT 'NONE';
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
-- CreateEnum
|
|
2
|
+
CREATE TYPE "PostStatus" AS ENUM ('DRAFT', 'PUBLISHED');
|
|
3
|
+
|
|
4
|
+
-- CreateTable
|
|
5
|
+
CREATE TABLE "BlogPost" (
|
|
6
|
+
"id" TEXT NOT NULL,
|
|
7
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
8
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
9
|
+
"title" TEXT NOT NULL,
|
|
10
|
+
"slug" TEXT NOT NULL,
|
|
11
|
+
"content" TEXT NOT NULL,
|
|
12
|
+
"excerpt" VARCHAR(500),
|
|
13
|
+
"status" "PostStatus" NOT NULL DEFAULT 'DRAFT',
|
|
14
|
+
"publishedAt" TIMESTAMP(3),
|
|
15
|
+
"featuredImageUrl" TEXT,
|
|
16
|
+
"featuredImageAlt" TEXT,
|
|
17
|
+
"metaTitle" VARCHAR(60),
|
|
18
|
+
"metaDescription" VARCHAR(160),
|
|
19
|
+
"ogTitle" TEXT,
|
|
20
|
+
"ogDescription" TEXT,
|
|
21
|
+
"ogImageUrl" TEXT,
|
|
22
|
+
"authorId" TEXT NOT NULL,
|
|
23
|
+
|
|
24
|
+
CONSTRAINT "BlogPost_pkey" PRIMARY KEY ("id")
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
-- CreateTable
|
|
28
|
+
CREATE TABLE "BlogTag" (
|
|
29
|
+
"id" TEXT NOT NULL,
|
|
30
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
31
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
32
|
+
"name" TEXT NOT NULL,
|
|
33
|
+
"slug" TEXT NOT NULL,
|
|
34
|
+
"description" TEXT,
|
|
35
|
+
|
|
36
|
+
CONSTRAINT "BlogTag_pkey" PRIMARY KEY ("id")
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
-- CreateTable (implicit many-to-many join table)
|
|
40
|
+
CREATE TABLE "_BlogPostToTag" (
|
|
41
|
+
"A" TEXT NOT NULL,
|
|
42
|
+
"B" TEXT NOT NULL,
|
|
43
|
+
|
|
44
|
+
CONSTRAINT "_BlogPostToTag_AB_pkey" PRIMARY KEY ("A","B")
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
-- CreateIndex
|
|
48
|
+
CREATE UNIQUE INDEX "BlogPost_slug_key" ON "BlogPost"("slug");
|
|
49
|
+
|
|
50
|
+
-- CreateIndex
|
|
51
|
+
CREATE INDEX "BlogPost_slug_idx" ON "BlogPost"("slug");
|
|
52
|
+
|
|
53
|
+
-- CreateIndex
|
|
54
|
+
CREATE INDEX "BlogPost_status_idx" ON "BlogPost"("status");
|
|
55
|
+
|
|
56
|
+
-- CreateIndex
|
|
57
|
+
CREATE INDEX "BlogPost_publishedAt_idx" ON "BlogPost"("publishedAt");
|
|
58
|
+
|
|
59
|
+
-- CreateIndex
|
|
60
|
+
CREATE INDEX "BlogPost_authorId_idx" ON "BlogPost"("authorId");
|
|
61
|
+
|
|
62
|
+
-- CreateIndex
|
|
63
|
+
CREATE UNIQUE INDEX "BlogTag_name_key" ON "BlogTag"("name");
|
|
64
|
+
|
|
65
|
+
-- CreateIndex
|
|
66
|
+
CREATE UNIQUE INDEX "BlogTag_slug_key" ON "BlogTag"("slug");
|
|
67
|
+
|
|
68
|
+
-- CreateIndex
|
|
69
|
+
CREATE INDEX "BlogTag_slug_idx" ON "BlogTag"("slug");
|
|
70
|
+
|
|
71
|
+
-- CreateIndex
|
|
72
|
+
CREATE INDEX "_BlogPostToTag_B_index" ON "_BlogPostToTag"("B");
|
|
73
|
+
|
|
74
|
+
-- AddForeignKey
|
|
75
|
+
ALTER TABLE "BlogPost" ADD CONSTRAINT "BlogPost_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
76
|
+
|
|
77
|
+
-- AddForeignKey
|
|
78
|
+
ALTER TABLE "_BlogPostToTag" ADD CONSTRAINT "_BlogPostToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "BlogPost"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
79
|
+
|
|
80
|
+
-- AddForeignKey
|
|
81
|
+
ALTER TABLE "_BlogPostToTag" ADD CONSTRAINT "_BlogPostToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "BlogTag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|