admin-role-policy.js 1.6 KB

12345678910111213141516171819202122
  1. // One policy for the administrative and operational gateways. Legacy admin means
  2. // company operations manager, never cross-company super administrator.
  3. function adminRoleSnapshot(current) {
  4. const read = key => typeof current.get === 'function' ? current.get(key) : current[key];
  5. const roles = Array.isArray(read('roles')) ? read('roles').map(String) : [];
  6. const key = String(read('adminRoleKey') || '');
  7. const valid = ['super-admin','ops-manager','ops-staff','ops-auditor'];
  8. let role = valid.includes(key) ? key : valid.find(value => roles.includes(value)) || '';
  9. const legacy = read('isAdmin') === true || read('role') === 'admin' || roles.includes('admin');
  10. if (!role && !key && !roles.some(value => value.startsWith('ops-')) && legacy) role = 'ops-manager';
  11. return {roles:role ? [...new Set([...roles.filter(value=>!valid.includes(value)),role])] : roles,isSuperAdmin:role==='super-admin',operationsRole:role==='super-admin'?'ops-manager':role||'denied',roleKey:role,legacyRole:role==='ops-manager'&&!key&&!roles.some(value=>valid.includes(value)),isAdmin:Boolean(role)||legacy};
  12. }
  13. // A store is an independent principal, never a company administrator.
  14. function storeAccountSnapshot(current) {
  15. const read = key => typeof current.get === 'function' ? current.get(key) : current[key];
  16. const legacy = read('legacyUserData') || {};
  17. const identity = String(read('identityType') || '');
  18. const storeId = Number(read('legacyUserId') || legacy.UserID);
  19. const store = identity === 'store' || (!identity && Number(read('legacyGroupId') || legacy.GroupID) === 2);
  20. return store && Number.isSafeInteger(storeId) && storeId > 0 ? storeId : 0;
  21. }