Drei Migrationen, dazu der Snapshot in 1754400000_init_schema.js, aus dem die TypeScript-Typen erzeugt werden - beide muessen zusammenpassen, sonst laufen Schema und Typen auseinander. riders.user verknuepft einen Fahrer mit einem Login, ohne cascadeDelete: Ein geloeschtes Konto darf keine Zeiten mitreissen. Anlegen, Aendern und Loeschen von Fahrern wird zur Sache der Teamleitung; bisher durfte das jedes Teammitglied. users.viewRule von "nur ich selbst" auf "eingeloggt" - ohne das laesst sich zu einer bekannten ID kein Name anzeigen, was Mitgliederliste, Fahrerkonten und den Melder eines Trail-Markers betrifft. Die listRule bleibt eng, E-Mails bleiben ueber emailVisibility verborgen. users.createRule erlaubt eingeloggten Nutzern das Anlegen von Konten, nicht der ganzen Welt. events verliert status und bekommt starts/ends. Der Status war Handarbeit: Wer vergass, ein Event abzuschliessen, hatte eine falsche Uebersicht. Ein Datum weiss von selbst, was ansteht, laeuft und vorbei ist. ACHTUNG: Die Migration entfernt das Feld samt seiner Werte. trails bekommt status_changed und status_by. Einer Sperrung soll man ansehen, ob sie von heute Morgen oder vom letzten Herbst ist. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014dh9W1i7aLSdPYJzQPid5o
52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
/// <reference path="../pb_data/types.d.ts" />
|
|
|
|
// Events werden datiert statt bewertet.
|
|
//
|
|
// Der Status (draft/active/finished) war Handarbeit: Jemand musste ein Event
|
|
// aktiv schalten und hinterher wieder abschließen, sonst stand die Übersicht
|
|
// falsch da. Ein Datum weiß von selbst, was ansteht, was läuft und was vorbei
|
|
// ist.
|
|
//
|
|
// starts trägt den Tag; ends bleibt leer, wenn das Event nur einen Tag dauert,
|
|
// und trägt sonst den letzten Tag. Beide sind optional, damit bestehende
|
|
// Events ohne Datum weiterleben, bis jemand eines nachträgt.
|
|
|
|
migrate((app) => {
|
|
const events = app.findCollectionByNameOrId('events')
|
|
|
|
// Auf einer frischen Datenbank hat der Snapshot die Felder bereits.
|
|
if (!events.fields.getByName('starts')) {
|
|
events.fields.add(new Field({
|
|
id: 'date_event_starts',
|
|
name: 'starts',
|
|
type: 'date',
|
|
}))
|
|
}
|
|
if (!events.fields.getByName('ends')) {
|
|
events.fields.add(new Field({
|
|
id: 'date_event_ends',
|
|
name: 'ends',
|
|
type: 'date',
|
|
}))
|
|
}
|
|
|
|
if (events.fields.getByName('status')) {
|
|
events.fields.removeByName('status')
|
|
}
|
|
|
|
app.save(events)
|
|
}, (app) => {
|
|
const events = app.findCollectionByNameOrId('events')
|
|
|
|
events.fields.removeByName('starts')
|
|
events.fields.removeByName('ends')
|
|
events.fields.add(new Field({
|
|
id: 'select_event_status',
|
|
name: 'status',
|
|
type: 'select',
|
|
maxSelect: 1,
|
|
values: ['draft', 'active', 'finished'],
|
|
}))
|
|
|
|
app.save(events)
|
|
})
|