import { UserToken } from '@axinom/mosaic-core'; type RequiredPermissionsArgs = | [string[], string[]] | [UserToken['permissions'], UserToken['permissions']]; /** * Checks whether the `requiredPermissions` are satisfied by the `grantedPermissions` or not. * Having at least one of the required permissions granted satisfies this permission requirement. * @param requiredPermissions The required permissions. * @param grantedPermissions The current permissions of the user. */ export function requiredPermissionsExists( requiredPermissions: string[], grantedPermissions: string[], ): boolean; /** * Checks whether the `requiredPermissions` are satisfied by the `grantedPermissions` per each service. * Having at least one of the required permissions granted per each service satisfies this permission requirement. * @param requiredPermissions The required permissions. Should be an object of shape { [serviceId: string]: string[] }. * @param grantedPermissions The current permissions of the user. Should be an object of shape { [serviceId: string]: string[] }. */ export function requiredPermissionsExists( requiredPermissions: UserToken['permissions'], grantedPermissions: UserToken['permissions'], ): boolean; export function requiredPermissionsExists( ...args: RequiredPermissionsArgs ): boolean { const [requiredPermissions, grantedPermissions] = args; if (Array.isArray(requiredPermissions) && Array.isArray(grantedPermissions)) { return requiredPermissions.some((permission) => grantedPermissions.includes(permission), ); } if ( !Array.isArray(requiredPermissions) && !Array.isArray(grantedPermissions) ) { const services = Object.keys(requiredPermissions); if (services.length === 0) { return true; } for (const service in services) { const serviceName = services[service]; if (grantedPermissions[serviceName]) { return requiredPermissionsExists( requiredPermissions[serviceName], grantedPermissions[serviceName], ); } } return false; } // Unreachable: the overloads guarantee both args are always the same type. return false; }