diff --git a/Docker/directus/bootstrap/bootstrap.mjs b/Docker/directus/bootstrap/bootstrap.mjs index 1379e27..89d3e6d 100644 --- a/Docker/directus/bootstrap/bootstrap.mjs +++ b/Docker/directus/bootstrap/bootstrap.mjs @@ -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: {} }); }