fix: Fahrer fuer Teammitglieder, die keinen mehr haben
Bis zuletzt loeschte die Anwendung einen Fahrer, ohne sein Konto aus teams.users zu nehmen. Zurueck blieb ein Konto ohne Fahrer — im Kader eine Zeile, aus der kein Weg zurueckfuehrte: Ein bestehendes Konto nachtraeglich an einen Fahrer zu haengen gibt es bewusst nicht, weil dieselbe Person sonst zweimal in der Liste stehen koennte. riders.remove nimmt die Mitgliedschaft inzwischen mit; diese Migration raeumt auf, was vorher liegengeblieben ist, und stellt die Regel her, auf die sich die Oberflaeche verlassen darf: Wer im Team ist, steht im Kader. Kein Rueckweg: Die hier angelegten Fahrer sind hinterher nicht mehr von denen zu unterscheiden, die die Teamleitung selbst angelegt hat. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01P32KoesVtABd6xWsqMKzhr
This commit is contained in:
parent
041bed923b
commit
3120bbfdbf
1 changed files with 81 additions and 0 deletions
|
|
@ -0,0 +1,81 @@
|
|||
/// <reference path="../pb_data/types.d.ts" />
|
||||
|
||||
// Jedes Teammitglied bekommt einen Fahrer.
|
||||
//
|
||||
// Bis 1754501800 löschte die Anwendung einen Fahrer, ohne sein Konto aus
|
||||
// `teams.users` zu nehmen. Zurück blieb ein Konto ohne Fahrer — im Kader eine
|
||||
// Zeile ohne Namen, aus der kein Weg zurückführte: Ein bestehendes Konto
|
||||
// nachträglich an einen Fahrer zu hängen gibt es bewusst nicht, weil dieselbe
|
||||
// Person sonst zweimal in der Liste stehen könnte. Der Eintrag war damit
|
||||
// unreparierbar.
|
||||
//
|
||||
// Das Leck ist zu (riders.remove nimmt die Mitgliedschaft mit). Diese
|
||||
// Migration räumt auf, was es hinterlassen hat, und stellt damit die Regel
|
||||
// her, auf die sich die Oberfläche künftig verlassen darf:
|
||||
//
|
||||
// Wer im Team ist, steht im Kader.
|
||||
//
|
||||
// Der Name kommt vom Konto: erst der Kontoname, sonst der Teil der
|
||||
// E-Mail-Adresse vor dem @. Beides kann später von der Teamleitung geändert
|
||||
// werden — der Fahrername ist ab dann die einzige Wahrheit, der Kontoname
|
||||
// taucht in der Oberfläche nirgends mehr auf.
|
||||
|
||||
migrate((app) => {
|
||||
const teams = app.findRecordsByFilter('teams', 'id != ""', '', 0, 0)
|
||||
let created = 0
|
||||
|
||||
for (const team of teams) {
|
||||
// getStringSlice statt get: `get` gäbe bei einer Mehrfach-Relation ein
|
||||
// Go-Slice zurück, auf dem sich weder includes noch map verlässlich
|
||||
// verhalten.
|
||||
const memberIds = team.getStringSlice('users') || []
|
||||
if (memberIds.length === 0) continue
|
||||
|
||||
const taken = new Set()
|
||||
for (const rider of app.findRecordsByFilter(
|
||||
'riders',
|
||||
'team = {:team} && user != ""',
|
||||
'',
|
||||
0,
|
||||
0,
|
||||
{ team: team.id },
|
||||
)) {
|
||||
taken.add(rider.getString('user'))
|
||||
}
|
||||
|
||||
for (const userId of memberIds) {
|
||||
if (taken.has(userId)) continue
|
||||
|
||||
let user
|
||||
try {
|
||||
user = app.findRecordById('users', userId)
|
||||
} catch (err) {
|
||||
// Konto gelöscht, die Relation zeigt ins Leere. Ein Fahrer für
|
||||
// ein Konto, das es nicht gibt, wäre kein Gewinn.
|
||||
continue
|
||||
}
|
||||
|
||||
const email = user.getString('email')
|
||||
const name =
|
||||
user.getString('name').trim() ||
|
||||
(email.indexOf('@') > 0 ? email.slice(0, email.indexOf('@')) : '') ||
|
||||
'Ohne Namen'
|
||||
|
||||
const rider = new Record(app.findCollectionByNameOrId('riders'))
|
||||
rider.set('team', team.id)
|
||||
rider.set('user', userId)
|
||||
rider.set('name', name)
|
||||
app.save(rider)
|
||||
|
||||
taken.add(userId)
|
||||
created++
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`riders_for_orphan_members: ${created} Fahrer angelegt`)
|
||||
}, (app) => {
|
||||
// Kein Rückweg. Die hier angelegten Fahrer sind hinterher nicht mehr von
|
||||
// denen zu unterscheiden, die die Teamleitung danach selbst angelegt hat —
|
||||
// sie zu löschen träfe mit einiger Wahrscheinlichkeit die falschen, samt
|
||||
// ihrer Teilnahmen und Zeiten. Ein Fahrer zu viel ist der kleinere Schaden.
|
||||
})
|
||||
Loading…
Reference in a new issue