Skip to content

fix(medien): geleerte Felder speichern, Dateien und Filter aufräumen - #296

Merged
nichtLehdev merged 1 commit into
mainfrom
fix/media-metadata-and-cleanup
Sep 11, 2026
Merged

fix(medien): geleerte Felder speichern, Dateien und Filter aufräumen#296
nichtLehdev merged 1 commit into
mainfrom
fix/media-metadata-and-cleanup

Conversation

@nichtLehdev

Copy link
Copy Markdown
Owner

Erster von drei Teilen zur Medienverwaltung. Dieser hier ist reine Fehlerbehebung und für sich genommen einsatzfähig.

Der gemeldete Fehler

Das Bearbeiten-Formular meldete grün „Änderungen gespeichert“, ohne ein geleertes Feld zu leeren. Nachgestellt an AG5Y9644.JPG: Fotograf:in geleert, gespeichert, Dialog neu geöffnet — „Ralf Stallbaum“ stand wieder da.

Ursache waren zwei Stellen zusammen. Der Dialog schickte leere Eingaben als undefined, und die Eingabe im Router war .optional() ohne .nullable(). Für Prisma heißt undefined aber „diese Spalte nicht anfassen“ — ein geleertes und ein unberührtes Feld waren nicht unterscheidbar.

Die sechs Metadatenfelder sind jetzt .optional().nullable() (dasselbe Muster wie in bezirke.ts und courses.ts), das Formular schickt null. Geprüft: Feld bleibt leer, und der unberührte Alt-Text daneben bleibt unverändert — undefined heißt also weiterhin korrekt „nicht anfassen“.

Was hier sonst noch drin steckt

Fehler Wirkung
Name dauerhaft schreibgeschützt, fehlte in update Tippfehler beim Hochladen war endgültig
Statusfilter lief im Browser über die geladene Seite „Ausstehend“ blieb leer, obwohl auf Seite 3 welche lagen; die Seitenzahl zählte trotzdem alle
delete entfernte nur den Datensatz, nicht die Datei Verwaiste Uploads sammelten sich unbegrenzt an (replaceFile räumt längst auf)
getStatistics zählte Profilbilder mit, die die Übersicht ausblendet „Gesamt“ nannte eine Zahl, die sich durch Blättern nie erreichen ließ
tags ist Json?, wurde aber als z.string() geschrieben Importierte Arrays erschienen leer und wurden beim Speichern überschrieben

Sortierung, Ordner- und die neuen „fehlt noch“-Filter laufen ebenfalls serverseitig. Geprüft: „Ohne Urheberangabe“ liefert 53 von 57 über den ganzen Bestand, nicht über eine Seite.

Die Bedingungen in getAll liegen jetzt einzeln im AND-Array. Sichtbarkeitsregel, Suche und Filter brauchen jede ein eigenes OR; auf einem gemeinsamen where-Objekt überschrieb der letzte Schreibzugriff die vorherigen.

Neu: media.getUsage

Listet auf, wo ein Medium verwendet wird, und markiert die beiden Beziehungen mit onDelete: Cascade — bei Bläserheft und Startseiten-Karussell verschwindet der ganze Eintrag mit dem Bild. Der Löschdialog wertet das im dritten Teil aus.

Prüfung

tsc und eslint sauber, 600 Tests grün, im Browser gegen die laufende Instanz nachgestellt. Der Testwert in der Entwicklungsdatenbank wurde wiederhergestellt.

Reihenfolge

  1. dieser PR
  2. feat/media-download — baut hierauf auf
  3. feat/media-overview-rework — baut auf 2 auf und ersetzt die Oberflächenänderungen hier

Das Bearbeiten-Formular meldete "Änderungen gespeichert", ohne ein geleertes
Feld zu leeren. Der Dialog schickte leere Eingaben als `undefined`, und das
heißt für Prisma "Spalte nicht anfassen" — der alte Wert blieb stehen. Die
Metadatenfelder sind jetzt `.nullable()`, das Formular schickt `null`, und nur
ein weggelassenes Feld bleibt `undefined`.

Dazu mehrere Fehler, die an derselben Stelle lagen:

- Der Name war dauerhaft schreibgeschützt und fehlte in `update`. Ein Tippfehler
  beim Hochladen ließ sich nicht mehr korrigieren.
- Der Statusfilter lief im Browser über die geladene Seite. "Ausstehend" konnte
  leer bleiben, obwohl auf Seite 3 welche lagen. Er ist jetzt Abfrageparameter,
  ebenso Sortierung, Ordner und die neuen "fehlt noch"-Filter.
- `delete` entfernte nur den Datensatz, nicht die Datei. Verwaiste Uploads
  sammelten sich unbegrenzt an; `replaceFile` räumte längst auf.
- `getStatistics` zählte Profilbilder mit, die die Übersicht ausblendet. "Gesamt"
  nannte damit eine Zahl, die sich durch Blättern nie erreichen ließ.
- `tags` ist eine JSON-Spalte, wurde aber als `z.string()` geschrieben und nur
  gelesen, wenn zufällig ein String darin stand. Importierte Arrays erschienen
  leer und wurden beim Speichern überschrieben. Jetzt durchgängig ein Array.

Neu ist `media.getUsage`: es listet auf, wo ein Medium verwendet wird, und
markiert die beiden Beziehungen mit `onDelete: Cascade` — Bläserheft und
Startseiten-Karussell verschwinden mit dem Bild. Der Löschdialog nutzt das im
folgenden Schritt.

Die Bedingungen in `getAll` liegen jetzt einzeln im `AND`-Array. Sichtbarkeit,
Suche und Filter brauchen jedes ein eigenes `OR`; auf einem gemeinsamen Objekt
überschrieb der letzte Schreibzugriff die vorherigen.
@nichtLehdev
nichtLehdev merged commit 3e1244c into main Sep 11, 2026
8 checks passed
@nichtLehdev
nichtLehdev deleted the fix/media-metadata-and-cleanup branch September 11, 2026 14:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant