payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
40 lines (39 loc) • 2.62 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */ /**
* Gets read and operation-level permissions for a given field based on cascading field permissions.
* @returns An object with the following properties:
* - `operation`: Whether the user has permission to perform the operation on the field (`create` or `update`).
* - `permissions`: The field-level permissions.
* - `read`: Whether the user has permission to read the field.
*/ export const getFieldPermissions = ({ collectionPermissions, field, operation, parentName, permissions })=>{
// First, calculate permissions using the existing logic
const fieldOperation = permissions === true || permissions?.[operation] === true || permissions?.[parentName] === true || 'name' in field && typeof permissions === 'object' && permissions?.[field.name] && (permissions[field.name] === true || operation in permissions[field.name] && permissions[field.name][operation]);
const fieldPermissions = permissions === undefined || permissions === null || permissions === true ? true : 'name' in field ? permissions[field.name] : permissions;
const fieldRead = permissions === true || permissions?.read === true || permissions?.[parentName] === true || 'name' in field && typeof permissions === 'object' && permissions?.[field.name] && (permissions[field.name] === true || 'read' in permissions[field.name] && permissions[field.name].read);
// Check if field permissions are effectively empty/missing
const hasFieldPermissions = permissions === true || typeof permissions === 'object' && permissions !== null && Object.keys(permissions).length > 0;
// If no field permissions are defined, fallback to collection permissions
if (!hasFieldPermissions && collectionPermissions) {
const collectionRead = Boolean(collectionPermissions.read);
let collectionOperation = false;
// Check operation-specific permission on collection
if (operation === 'create' && 'create' in collectionPermissions) {
collectionOperation = Boolean(collectionPermissions.create);
} else if (operation === 'update') {
collectionOperation = Boolean(collectionPermissions.update);
}
return {
operation: collectionOperation,
permissions: {
read: collectionRead
},
read: collectionRead
};
}
// Return the calculated permissions
return {
operation: Boolean(fieldOperation),
permissions: fieldPermissions,
read: Boolean(fieldRead)
};
};
//# sourceMappingURL=getFieldPermissions.js.map