Skip to content

Firestore

Backend for quiz.runtime=prod. Setup: docs/DEVELOPMENT.md. Schema: docs/FIRESTORE.md.

Collections

folders/{folderId}
  name, description, sortOrder, title
  questions: array<map>   # single_choice | multiple_choice | reorder
  updatedAtEpochMillis?

appConfig/default
  activeFolderId
  sitePublished           # site/reception open flag (default false)
  updatedAtEpochMillis?

staffAppRelease/latest    # staff Desktop latest release (auth required)
  version, versionCode, storagePath, sha256, releaseNotes, publishedAtEpochMillis?

folders/{folderId}/rankings/{entryId}
  nickname, score, completedAtEpochMillis, dateKey

Folder id and quiz-set id are 1:1.

Storage (staff DMG)

releases/staff-desktop/{version}.dmg — authenticated staff read only.

Security (summary)

PathReadWrite
folders / appConfigEveryoneAuthenticated staff
rankingsEveryonecreate (participant scores); delete authenticated staff; no update
staffAppReleaseAuthenticated staffClients denied (CD / Admin SDK)
Storage releases/staff-desktop/**Authenticated staffClients denied (CD / Admin SDK)

App mapping

RepositoryFirestore / Storage
RemoteQuizCatalogRepositoryfolders, appConfig/default (activeFolderId / sitePublished)
RemoteRankingRepositoryfolders/{id}/rankings
RemoteStaffAppReleaseRepositorystaffAppRelease/latest + Storage DMG

Participant load is two reads: getActiveFolderIdgetQuizSet.

CD (rules)

Pushes to master that change firestore.rules / storage.rules deploy via GitHub Actions. Required secret: FIREBASE_SERVICE_ACCOUNT (setup: docs/DEVELOPMENT.md, section on CD for Firebase rules).