Errungenschaften: Abzeichen fuer erreichte Meilensteine
CI / pruefen (pull_request) Canceled after 0s
CI / pruefen (pull_request) Canceled after 0s
Zwanzig feste Abzeichen plus dynamische fuer vollstaendig gesehene Filmreihen und abgeschlossene Universen. Sie tauchen auf, wenn etwas erreicht ist, und bleiben — auch wenn die Bedingung spaeter wegfaellt. Eine zurueckgenommene Sichtung soll kein Abzeichen kosten. Alle Regeln arbeiten auf *einem* Datensatz, der einmal geholt wird. Sonst stellte jede Regel ihre eigene Abfrage, und aus zwanzig Abzeichen wuerden zwanzig Abfragen bei jedem Abhaken. Ausgewertet wird nach Sichtungsaktionen und einmal taeglich; der erste Lauf eines Kontos ist stumm, weil eine gewachsene Bibliothek sonst zwei Dutzend Meldungen auf einmal ausloest. Fuer Filmreihen braucht es keine gepflegte Liste: TMDB gruppiert sie selbst, und tmdbCollectionId liegt beim Import schon am Titel. Eigennamen wie "Spider Bro" kommen aus einer kleinen Datendatei obendrauf; fehlt ein Eintrag, greift der generische Name. Die kuratierten Eintraege tragen jeweils ein Stueck des erwarteten TMDB-Namens. Ich habe die Collection-Kennungen aus dem Gedaechtnis geschrieben und kann sie hier nicht gegen TMDB pruefen — passt der Name nicht, wird der Eintrag ignoriert und der generische greift. Eine falsch abgeschriebene Kennung bleibt damit folgenlos statt jemandem das falsche Abzeichen zu geben. Die Uhrzeit-Regel liest die Stunde ueber formatToParts statt ueber die formatierte Zeichenkette: auf Deutsch liefert Intl fuer eine einzelne Stunde "03 Uhr", und daraus wird beim Umwandeln NaN. Ein Test hat das aufgedeckt. Beim ersten Oeffnen der Uebersicht wird einmal ausgewertet — sonst bliebe sie bei einem Bestandskonto leer, bis nachts der Hintergrundlauf kommt. Zehn Tests, Anleitung mit Screenshot. Symbole als eigene SVG auf einem gemeinsamen Raster; erreicht und offen unterscheiden sich nicht nur durch Farbe, sondern auch im Text. Refs #15
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "User" ADD COLUMN "showAchievements" BOOLEAN NOT NULL DEFAULT true;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Achievement" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"label" TEXT,
|
||||
"unlockedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "Achievement_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Achievement_userId_unlockedAt_idx" ON "Achievement"("userId", "unlockedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Achievement_userId_key_key" ON "Achievement"("userId", "key");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Achievement" ADD CONSTRAINT "Achievement_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -42,6 +42,9 @@ model User {
|
||||
publicProfile Boolean @default(false)
|
||||
profileSlug String? @unique
|
||||
|
||||
/// Errungenschaften auf der öffentlichen Profilseite zeigen
|
||||
showAchievements Boolean @default(true)
|
||||
|
||||
// Benachrichtigungswünsche
|
||||
notifyNewEpisode Boolean @default(true)
|
||||
notifyRelease Boolean @default(true)
|
||||
@@ -55,6 +58,7 @@ model User {
|
||||
oidcAccounts OidcAccount[]
|
||||
passkeys Passkey[]
|
||||
mediaServers MediaServerConnection[]
|
||||
achievements Achievement[]
|
||||
entries LibraryEntry[]
|
||||
watches Watch[]
|
||||
tags Tag[]
|
||||
@@ -628,3 +632,27 @@ model MediaServerItem {
|
||||
@@unique([connectionId, externalId])
|
||||
@@index([connectionId])
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Errungenschaften
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// Ein erreichtes Abzeichen. Einmal vergeben, bleibt es — auch wenn die
|
||||
/// Bedingung später nicht mehr erfuellt waere.
|
||||
model Achievement {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
/// Stabiler Schluessel: "serientaeter-1000", "reihe:556", "universum:<id>".
|
||||
key String
|
||||
|
||||
/// Bei dynamisch benannten Abzeichen der Name zum Zeitpunkt des Erreichens.
|
||||
/// Eingefroren: ein umbenanntes Universum soll das Abzeichen nicht aendern.
|
||||
label String?
|
||||
|
||||
unlockedAt DateTime @default(now())
|
||||
|
||||
@@unique([userId, key])
|
||||
@@index([userId, unlockedAt])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user