fix: Präzedenzfehler in trail_flags.deleteRule beheben
&& 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.
This commit is contained in:
parent
55f25fae0c
commit
f576550429
4 changed files with 33 additions and 4 deletions
|
|
@ -1273,7 +1273,7 @@ migrate((app) => {
|
||||||
"viewRule": "team.users.id ?= @request.auth.id",
|
"viewRule": "team.users.id ?= @request.auth.id",
|
||||||
"createRule": "team.owner.id ?= @request.auth.id || team.admins.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",
|
"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",
|
"name": "trail_flags",
|
||||||
"type": "base",
|
"type": "base",
|
||||||
"fields": [
|
"fields": [
|
||||||
|
|
@ -1390,7 +1390,7 @@ migrate((app) => {
|
||||||
],
|
],
|
||||||
"indexes": [],
|
"indexes": [],
|
||||||
"created": "2026-08-06 14:55:19.508Z",
|
"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
|
"system": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,9 @@ migrate((app) => {
|
||||||
updateRule: adminOnly,
|
updateRule: adminOnly,
|
||||||
// Löschen nur, solange kein Marker diesen Typ verwendet — sonst
|
// Löschen nur, solange kein Marker diesen Typ verwendet — sonst
|
||||||
// bliebe ein Pflichtfeld zurück, das ins Leere zeigt.
|
// 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: [
|
fields: [
|
||||||
teamScoped('team'),
|
teamScoped('team'),
|
||||||
{ name: 'label', type: 'text', required: true, max: 60 },
|
{ name: 'label', type: 'text', required: true, max: 60 },
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,16 @@
|
||||||
// das ins Leere zeigt. Separate Migration, weil 1754500000_created_trails.js
|
// das ins Leere zeigt. Separate Migration, weil 1754500000_created_trails.js
|
||||||
// bereits angewendet wurde und PocketBase Migrationsdateien nur einmal
|
// bereits angewendet wurde und PocketBase Migrationsdateien nur einmal
|
||||||
// anhand des Dateinamens ausführt, unabhängig vom Inhalt.
|
// 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) => {
|
migrate((app) => {
|
||||||
const flags = app.findCollectionByNameOrId('trail_flags')
|
const flags = app.findCollectionByNameOrId('trail_flags')
|
||||||
const adminOnly =
|
const adminOnly =
|
||||||
'team.owner.id ?= @request.auth.id' +
|
'team.owner.id ?= @request.auth.id' +
|
||||||
' || team.admins.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.save(flags)
|
||||||
}, (app) => {
|
}, (app) => {
|
||||||
const flags = app.findCollectionByNameOrId('trail_flags')
|
const flags = app.findCollectionByNameOrId('trail_flags')
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
/// <reference path="../pb_data/types.d.ts" />
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
})
|
||||||
Loading…
Reference in a new issue