From f5765504297a3982b169110b38e6dc1989969034 Mon Sep 17 00:00:00 2001 From: Daniel Michelberger Date: Thu, 6 Aug 2026 17:13:35 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Pr=C3=A4zedenzfehler=20in=20trail=5Fflag?= =?UTF-8?q?s.deleteRule=20beheben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit && bindet stärker als || — ohne Klammern galt die Marker-Referenzprüfung nur für den admins-Zweig. Ein Team-Owner konnte dadurch einen noch von Markern referenzierten Flag-Typ löschen und verwaiste Marker hinterlassen. Klammerung in 1754500000_created_trails.js korrigiert, damit ein Neuaufbau der Datenbank die richtige Regel von Anfang an bekommt. 1754500200_trail_flags_delete_rule.js (bereits mit der fehlerhaften Regel angewendet) inhaltlich ebenfalls korrigiert, und eine neue Migration 1754500300_trail_flags_delete_rule_precedence.js trägt die Korrektur für bestehende Instanzen nach. Snapshot aktualisiert. --- .../pb_migrations/1754400000_init_schema.js | 4 ++-- .../1754500000_created_trails.js | 4 +++- .../1754500200_trail_flags_delete_rule.js | 5 +++- ...0300_trail_flags_delete_rule_precedence.js | 24 +++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 backend/pb_migrations/1754500300_trail_flags_delete_rule_precedence.js diff --git a/backend/pb_migrations/1754400000_init_schema.js b/backend/pb_migrations/1754400000_init_schema.js index 9e2b5ab..1b1ec74 100644 --- a/backend/pb_migrations/1754400000_init_schema.js +++ b/backend/pb_migrations/1754400000_init_schema.js @@ -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 && @collection.trail_markers.flag ?!= 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 15:05:38.402Z", + "updated": "2026-08-06 15:11:28.425Z", "system": false }, { diff --git a/backend/pb_migrations/1754500000_created_trails.js b/backend/pb_migrations/1754500000_created_trails.js index 085f800..7fe3dc7 100644 --- a/backend/pb_migrations/1754500000_created_trails.js +++ b/backend/pb_migrations/1754500000_created_trails.js @@ -151,7 +151,9 @@ migrate((app) => { updateRule: 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', + // Klammern nötig: && bindet stärker als || — ohne sie gälte die + // Marker-Prüfung nur für den admins-Zweig, nicht für owner. + deleteRule: '(' + adminOnly + ') && @collection.trail_markers.flag ?!= id', fields: [ teamScoped('team'), { name: 'label', type: 'text', required: true, max: 60 }, diff --git a/backend/pb_migrations/1754500200_trail_flags_delete_rule.js b/backend/pb_migrations/1754500200_trail_flags_delete_rule.js index bee4927..3eae88d 100644 --- a/backend/pb_migrations/1754500200_trail_flags_delete_rule.js +++ b/backend/pb_migrations/1754500200_trail_flags_delete_rule.js @@ -5,13 +5,16 @@ // 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. +// +// Klammern nötig: && bindet stärker als || — ohne sie gälte die +// Marker-Prüfung nur für den admins-Zweig, nicht für owner. 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' + flags.deleteRule = '(' + adminOnly + ') && @collection.trail_markers.flag ?!= id' app.save(flags) }, (app) => { const flags = app.findCollectionByNameOrId('trail_flags') diff --git a/backend/pb_migrations/1754500300_trail_flags_delete_rule_precedence.js b/backend/pb_migrations/1754500300_trail_flags_delete_rule_precedence.js new file mode 100644 index 0000000..1ab1531 --- /dev/null +++ b/backend/pb_migrations/1754500300_trail_flags_delete_rule_precedence.js @@ -0,0 +1,24 @@ +/// + +// Präzedenzfehler in trail_flags.deleteRule behoben: && bindet stärker als +// ||, ohne Klammern galt die Marker-Prüfung nur für den admins-Zweig. +// Ein Team-Owner konnte damit einen noch referenzierten Flag-Typ löschen +// und verwaiste Marker hinterlassen. Separate Migration, weil +// 1754500200_trail_flags_delete_rule.js bereits mit der fehlerhaften Regel +// angewendet wurde. + +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 + ' && @collection.trail_markers.flag ?!= id' + app.save(flags) +})