Bootstrap: bestehende Berechtigungen angleichen statt überspringen

ensurePermission brach ab, sobald für eine Collection bereits ein
Berechtigungseintrag existierte. Dadurch blieben einmal angelegte, zu enge
Feldlisten dauerhaft bestehen und spätere Erweiterungen kamen nie an --
der Produktions-Agent lief deshalb in 403-Fehler beim Zurückschreiben von
jobs.status und orders.production_status.

Vorhandene Einträge werden jetzt per PATCH auf die im Bootstrap definierten
Felder und Filter nachgezogen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Lucas Orth
2026-07-23 14:44:58 +02:00
parent f44bce8811
commit 445ebdec5a

View File

@@ -743,10 +743,28 @@ async function ensureAccess(roleId, policyId) {
await api('POST', '/access', { role: roleId, policy: policyId });
log('access +', `${roleId || 'public'} ↔ policy`);
}
/**
* Legt eine Berechtigung an ODER gleicht eine bestehende an.
*
* Wichtig: Früher wurde ein vorhandener Eintrag unangetastet gelassen. Dadurch
* blieben einmal angelegte, zu enge Feldlisten für immer bestehen – spätere
* Erweiterungen (z. B. production_status für den Produktions-Agent) kamen nie
* an und führten zu 403-Fehlern. Der Bootstrap ist die Quelle der Wahrheit,
* deshalb werden Felder und Filter jetzt aktiv nachgezogen.
*/
async function ensurePermission(policyId, collection, action, fields = ['*'], permissions = {}) {
const existing = await api('GET',
`/permissions?filter[policy][_eq]=${policyId}&filter[collection][_eq]=${collection}&filter[action][_eq]=${action}&limit=1`);
if (existing && existing.length) return;
`/permissions?filter[policy][_eq]=${policyId}&filter[collection][_eq]=${collection}&filter[action][_eq]=${action}&limit=1&fields=id,fields,permissions`);
if (existing && existing.length) {
const cur = existing[0];
const gleich = JSON.stringify(cur.fields ?? null) === JSON.stringify(fields)
&& JSON.stringify(cur.permissions ?? {}) === JSON.stringify(permissions);
if (!gleich) {
await api('PATCH', `/permissions/${cur.id}`, { fields, permissions });
log('perm ~', `${collection}.${action}`);
}
return;
}
await api('POST', '/permissions', { policy: policyId, collection, action, fields, permissions, validation: {} });
}