fix: verwaiste trail_markers beim Löschen von trail_flags verhindern

trail_markers.flag ist required, hatte aber cascadeDelete: false — beim
Löschen eines Flag-Typs blieben Marker mit toter Referenz zurück. Die
deleteRule von trail_flags verbietet das Löschen jetzt, solange noch
Marker den Typ referenzieren.

1754500000_created_trails.js wurde direkt angepasst, damit ein Neuaufbau
der DB die Regel von Anfang an enthält. Da die Migration lokal bereits
angewendet war, trägt 1754500200_trail_flags_delete_rule.js dieselbe
Änderung für bestehende Instanzen nach. Snapshot in
1754400000_init_schema.js entsprechend aktualisiert.
This commit is contained in:
Daniel Michelberger 2026-08-06 17:08:40 +02:00
parent 9948073b25
commit 55f25fae0c
3 changed files with 30 additions and 5 deletions

View file

@ -130,7 +130,7 @@ migrate((app) => {
"hidden": false,
"id": "file376926767",
"maxSelect": 1,
"maxSize": 0,
"maxSize": 5242880,
"mimeTypes": [
"image/jpeg",
"image/png",
@ -173,7 +173,7 @@ migrate((app) => {
"CREATE UNIQUE INDEX `__pb_users_auth__tokenKey_idx` ON `users` (`tokenKey`)"
],
"created": "2023-10-28 21:35:49.020Z",
"updated": "2026-08-06 12:06:09.028Z",
"updated": "2026-08-06 15:05:38.398Z",
"system": false,
"authRule": "",
"manageRule": null,
@ -1273,7 +1273,7 @@ migrate((app) => {
"viewRule": "team.users.id ?= @request.auth.id",
"createRule": "team.owner.id ?= @request.auth.id || team.admins.id ?= @request.auth.id",
"updateRule": "team.owner.id ?= @request.auth.id || team.admins.id ?= @request.auth.id",
"deleteRule": "team.owner.id ?= @request.auth.id || team.admins.id ?= @request.auth.id",
"deleteRule": "team.owner.id ?= @request.auth.id || team.admins.id ?= @request.auth.id && @collection.trail_markers.flag ?!= id",
"name": "trail_flags",
"type": "base",
"fields": [
@ -1390,7 +1390,7 @@ migrate((app) => {
],
"indexes": [],
"created": "2026-08-06 14:55:19.508Z",
"updated": "2026-08-06 14:55:19.508Z",
"updated": "2026-08-06 15:05:38.402Z",
"system": false
},
{

View file

@ -149,7 +149,9 @@ migrate((app) => {
viewRule: 'team.users.id ?= @request.auth.id',
createRule: adminOnly,
updateRule: adminOnly,
deleteRule: adminOnly,
// Löschen nur, solange kein Marker diesen Typ verwendet — sonst
// bliebe ein Pflichtfeld zurück, das ins Leere zeigt.
deleteRule: adminOnly + ' && @collection.trail_markers.flag ?!= id',
fields: [
teamScoped('team'),
{ name: 'label', type: 'text', required: true, max: 60 },

View file

@ -0,0 +1,23 @@
/// <reference path="../pb_data/types.d.ts" />
// trail_flags.deleteRule ergänzt: Löschen nur, solange kein Marker diesen
// Typ verwendet — sonst bliebe ein Pflichtfeld (trail_markers.flag) zurück,
// das ins Leere zeigt. Separate Migration, weil 1754500000_created_trails.js
// bereits angewendet wurde und PocketBase Migrationsdateien nur einmal
// anhand des Dateinamens ausführt, unabhängig vom Inhalt.
migrate((app) => {
const flags = app.findCollectionByNameOrId('trail_flags')
const adminOnly =
'team.owner.id ?= @request.auth.id' +
' || team.admins.id ?= @request.auth.id'
flags.deleteRule = adminOnly + ' && @collection.trail_markers.flag ?!= id'
app.save(flags)
}, (app) => {
const flags = app.findCollectionByNameOrId('trail_flags')
const adminOnly =
'team.owner.id ?= @request.auth.id' +
' || team.admins.id ?= @request.auth.id'
flags.deleteRule = adminOnly
app.save(flags)
})