Add age ratings (#451)

* Base age rating system

* Cleanup enum leftovers

* Missed files

* GB importer

* Linter settings

* Translations

* Prettier and linting

---------

Co-authored-by: Robert Clabough <robert@clabough.tech>
This commit is contained in:
AgentScrubbles
2026-07-26 11:42:16 +10:00
committed by GitHub
co-authored by Robert Clabough
parent 8e75a0bf56
commit 97c6f2c8a6
22 changed files with 704 additions and 5 deletions
@@ -8,8 +8,28 @@ DROP INDEX "GameTag_name_idx";
ALTER TABLE "Game" ALTER COLUMN "mImageCarouselObjectIds" SET DEFAULT ARRAY[]::TEXT[];
UPDATE "Game" SET "mImageCarouselObjectIds" = '{}' WHERE "mImageCarouselObjectIds" IS NULL;
-- CreateEnum
CREATE TYPE "AgeRatingOrganization" AS ENUM ('ESRB', 'PEGI', 'CERO', 'USK', 'GRAC', 'ClassInd', 'ACB');
-- CreateTable
CREATE TABLE "GameAgeRating" (
"id" TEXT NOT NULL,
"organization" "AgeRatingOrganization" NOT NULL,
"rating" TEXT NOT NULL,
"ratingCoverUrl" TEXT,
"gameId" TEXT NOT NULL,
CONSTRAINT "GameAgeRating_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "GameAgeRating_gameId_organization_key" ON "GameAgeRating"("gameId", "organization");
-- CreateIndex
CREATE INDEX "Game_mName_idx" ON "Game" USING GIST ("mName" gist_trgm_ops(siglen=32));
-- CreateIndex
CREATE INDEX "GameTag_name_idx" ON "GameTag" USING GIST ("name" gist_trgm_ops(siglen=32));
-- AddForeignKey
ALTER TABLE "GameAgeRating" ADD CONSTRAINT "GameAgeRating_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+25 -1
View File
@@ -31,7 +31,8 @@ model Game {
mDescription String // Supports markdown
mReleased DateTime // When the game was released
ratings GameRating[]
ratings GameRating[]
ageRatings GameAgeRating[]
featured Boolean @default(false)
@@ -73,6 +74,29 @@ model GameTag {
@@index([name(ops: raw("gist_trgm_ops(siglen=32)"))], type: Gist)
}
enum AgeRatingOrganization {
ESRB
PEGI
CERO
USK
GRAC
ClassInd
ACB
}
model GameAgeRating {
id String @id @default(uuid())
organization AgeRatingOrganization
rating String // e.g. "E", "T", "M", "18", "CERO_B", comes from server enums
ratingCoverUrl String? // Badge image URL from IGDB, optional
game Game @relation(fields: [gameId], references: [id], onDelete: Cascade)
gameId String
@@unique([gameId, organization], name: "gameOrganizationKey")
}
model GameRating {
id String @id @default(uuid())