src/generator/authorize/getRoles.js
// @flow
import { CODE_MODES, USER_ROLE, DOC_ROLE } from '../../constants';
import { extractRoles } from './extractRoles';
/**
* get userRoles and docRoles
* @private
* @param {boolean} authorize - flag for authorization logic
* @param {object} inputSchema - type's schema
* @return {Object}
* @property {object} userRoles - userRoles object with modes
* @property {object} docRoles - docRoles object with modes
* @property {string} roleFieldName - field containing the roles
* }
*/
export function getRoles(authorize: boolean, inputSchema: any) {
// create empty userRoles and docRoles objects
// as default values, which are used
// if there is no @authorize directive
const userRoles = {};
const docRoles = {};
const roleFieldNamesFound = [];
// initialize
CODE_MODES.forEach(mode => (userRoles[mode] = []));
CODE_MODES.forEach(mode => (docRoles[mode] = []));
// check if there is an @authorize directive
if (authorize) {
// then re-determine the userRoles and docRoles
// from the @authorize tag of the type definition
const allRolesArguments =
inputSchema.definitions[0].directives[0].arguments || {};
const allRoles = extractRoles(allRolesArguments, inputSchema);
allRoles.forEach(role => {
switch (role.type) {
case USER_ROLE:
// check, if there is already another userRole field
if (
roleFieldNamesFound.length > 0 &&
role.roleFieldName !== '' &&
roleFieldNamesFound.indexOf(role.roleFieldName) < 0
) {
// We allow only one field, which stores all userRoles
throw new Error(`Please adjust type definition, that there is
only ONE field, which keeps all user roles. You've tried to
add a second userRole field: '${role.roleFieldName}',
but there is already another userRole field:
'${roleFieldNamesFound[0]}' defined.
Please try instead: '${roleFieldNamesFound[0]}:
String @authRole(for: ["otherRole", "${role.roleName}"])'`);
}
if (role.roleFieldName !== '') {
roleFieldNamesFound.push(role.roleFieldName);
}
Object.keys(role.modes).forEach(mode => {
if (role.modes[mode]) {
userRoles[mode].push(role.roleName);
}
});
break;
case DOC_ROLE:
Object.keys(role.modes).forEach(mode => {
if (role.modes[mode]) {
docRoles[mode].push(role.roleName);
}
});
break;
}
});
}
return {
userRoles,
docRoles,
roleFieldName: roleFieldNamesFound.length > 0 ? roleFieldNamesFound[0] : ''
};
}