Source: roles-permissions-dal.js


const { Role, Permission } = require('../sequelize-model');

const RolePermission = require('../sequelize-model').RolePermission,
    rolesDal = require('./roles-dal'),
    config = require('../../common/config/config'),
    rbac = config.rbac,
    tryCatch = require('../../common/util/functions-utils');
/**
 * @module
 */
module.exports = {

    /**
     * Creates an association between a role with RoleId and a permission with id
     * @returns {Promise<void>}
     * @param {int} RoleId
     * @param {int} permissionId
     */
    create: (RoleId, permissionId) =>
        tryCatch(async () => {
            const {action, id, resource} = await require('./permissions-dal').getSpecificById(permissionId);
            rbac.grant(await rbac.getRole((await rolesDal.getSpecificById(RoleId)).role), await rbac.getPermission(action, resource));
            return (await RolePermission.findOrCreate({where: {RoleId, PermissionId: id}}))[0];
        }),

    /**
     * Delete the association between a role and a permission
     * @returns {Promise<void>}
     * @param {int} roleId
     * @param {int} permissionId
     */
    delete: async (roleId, permissionId) =>Promise.resolve({
        deletedRows: await  tryCatch(async () => {
            const {action, resource} = await require('./permissions-dal').getSpecificById(permissionId);
            const role = await rolesDal.getSpecificById(roleId);
            await rbac.revokeByName(role.role, `${action}_${resource}`);
            return RolePermission.destroy({where: {RoleId: roleId, PermissionId: permissionId}});
        })}),
    /**
     * Returns all association between roles and permissions
     * @returns {Promise<Object|Error>}
     */
    get: () =>
        tryCatch(() => RolePermission.findAll({include: [Role, Permission], raw: true})
            .then(rolePermissions=>
                rolePermissions.map(rolePermission => {
                    const {'Permission.action': action, 'Permission.resource': resource, 'Role.role': role, 'Role.parent_role': parentRole,
                        'Permission.id': unused0, 'Role.id': unused1, ...rest} = rolePermission;
                return {action, resource, role,parentRole, ...rest};
            }))),

    /**
     * Returns all the permissions associated to a specific role
     * @param {int} roleId
     * @returns {Promise<Object|Error>}
     */
    getByRole: roleId => tryCatch(() => RolePermission.findAll({ where: { RoleId: roleId }, include: [Permission], raw: true })),

    //TODO: change fields from jointed query
    /**
     * Returns all the roles associated to a specific permission
     * @param {int} id Id of the permission you want to get
     * @returns {Promise<Object|Error>}
     */
    getByPermission: id => tryCatch(() => RolePermission.findAll({ where: { PermissionId: id }, include: [Role], raw: true })),


}