4.7 KiB
Datenmodell
Überblick
Die Anwendung speichert fachliche Daten in Firestore und Song-Anhänge in Firebase Storage. Firestore-Dokumente werden über AngularFire als Live-Observables gelesen; Dokument-IDs werden in den Services als id in die Objekte übernommen.
Zentrale Collections:
userssongsshowsguestglobal
Subcollections:
songs/{songId}/filesshows/{showId}/songs
users/{uid}
Benutzerprofile ergänzen Firebase Auth um Anwendungsdaten:
id: Firestore-Dokument-ID, entspricht der Firebase-Auth-UID.name: Anzeigename.role: Semikolon-getrennte Rollenliste.chordMode: bevorzugte Akkorddarstellung.songUsage: Map vonsongIdauf Nutzungszähler.
songUsage wird beim Hinzufügen oder Entfernen von Show-Songs inkrementell aktualisiert. Die Admin-Migration rebuildSongUsage kann die Werte aus Shows neu berechnen.
songs/{songId}
Ein Song enthält Stammdaten, musikalische Angaben, rechtliche Angaben und Bearbeitungshistorie:
number,title,type,statuskey,tempo,text,flags,final,commentlegalType,legalOwner,legalOwnerIdartist,label,termsOfUse,originedits: Liste aus Bearbeitername und Timestamp
Typen:
type:Praise,WorshipoderMisc.status:draft,setoderfinal.legalOwner:CCLIoderother.legalType:openoderallowed.
Beim Aktualisieren eines Songs ergänzt SongService einen Eintrag in edits.
songs/{songId}/files/{fileId}
Die Subcollection enthält Metadaten zu Dateien in Firebase Storage:
name: Dateiname.path: Storage-Verzeichnis des Songs.createdAt: Erstellzeitpunkt.
UploadService lädt Dateien nach Firebase Storage hoch und schreibt anschließend das Metadaten-Dokument. FileService erzeugt Download-URLs und entfernt Dateien aus Storage und Firestore.
shows/{showId}
Shows beschreiben Veranstaltungen und den Präsentationszustand:
showType: Veranstaltungstyp.date: Firestore-Timestamp.owner: Benutzer-ID des Besitzers.songIds: denormalisierter Index der enthaltenen Ursprungssongs.public: Kennzeichen für öffentliche Show-Typen.reportedType:null,pending,reportedodernot-required.published: Veröffentlichung in Listen.archived: Archivstatus.order: Reihenfolge der Show-Song-Dokument-IDs.shareId: Verweis auf ein Gastfreigabe-Dokument.
Präsentationsfelder:
presentationSongIdpresentationDynamicCaptionpresentationDynamicTextpresentationSectionpresentationZoompresentationBackground
presentationBackground erlaubt none, blue, green, leder, praise und bible.
ShowService unterscheidet öffentliche und private Show-Typen. Beim Anlegen werden owner, leere order, leere songIds und public aus dem Show-Typ berechnet.
shows/{showId}/songs/{showSongId}
Show-Songs sind Snapshots von Songs innerhalb einer Show. Sie erweitern das Song-Modell um showbezogene Felder:
songId: ID des Ursprungssongs.key: aktuelle Tonart in der Show.keyOriginal: ursprüngliche Tonart.chordMode: Akkorddarstellung des Benutzers zum Zeitpunkt des Hinzufügens.addedLive: Kennzeichen für live hinzugefügte Songs.
Beim Hinzufügen kopiert ShowSongService die aktuellen Songdaten in die Subcollection, aktualisiert users/{uid}.songUsage und fügt die Ursprungssong-ID zu shows/{showId}.songIds hinzu. Beim Entfernen wird die Reihenfolge angepasst, der Nutzungszähler reduziert und songIds entfernt, wenn kein weiterer Show-Song denselben Ursprungssong nutzt.
guest/{guestId}
Gastfreigaben sind öffentlich lesbare Snapshots einer Show:
showTypedateupdatedAtsongs: Liste der freigegebenen Songs
GuestShowService erstellt oder aktualisiert das Gastdokument und schreibt die erzeugte shareId zurück an die Show. Die öffentliche URL hat das Format /guest/{shareId}.
global/config
Globale Konfiguration:
ccliLicenseId: CCLI-Lizenznummer.
ConfigService liest das Dokument gecacht.
global/static
Laufzeitstatus der Anwendung:
currentShow: ID der aktuell ausgewählten Show für die Präsentation.
GlobalSettingsService liest und schreibt dieses Dokument. Die Präsentationsauswahl setzt currentShow; Remote- und Monitoransicht verwenden den Wert zur Synchronisierung.
Denormalisierung und Migrationen
Zwei Felder sind bewusst denormalisiert:
users/{uid}.songUsagefür Nutzungszähler pro Benutzer.shows/{showId}.songIdsfür schnelle Abfragen und Anzeigeinformationen zu verwendeten Songs.
Für beide Datenbestände existieren Admin-Migrationen im README. Sie sollten nach strukturellen Korrekturen oder historischen Datenproblemen manuell ausgeführt werden.