RocketChat/Rocket.Chat

View on GitHub
apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { ServerMethods } from '@rocket.chat/ddp-client';
import { LivechatUnit, LivechatDepartmentAgents } from '@rocket.chat/models';
import mem from 'mem';
import { Meteor } from 'meteor/meteor';

import { hasAnyRoleAsync } from '../../../../../app/authorization/server/functions/hasRole';
import { logger } from '../lib/logger';

async function getUnitsFromUserRoles(user: string): Promise<string[]> {
    return LivechatUnit.findByMonitorId(user);
}

async function getDepartmentsFromUserRoles(user: string): Promise<string[]> {
    return (await LivechatDepartmentAgents.findByAgentId(user).toArray()).map((department) => department.departmentId);
}

const memoizedGetUnitFromUserRoles = mem(getUnitsFromUserRoles, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
const memoizedGetDepartmentsFromUserRoles = mem(getDepartmentsFromUserRoles, { maxAge: process.env.TEST_MODE ? 1 : 10000 });

export const getUnitsFromUser = async (user: string): Promise<string[] | undefined> => {
    if (!user || (await hasAnyRoleAsync(user, ['admin', 'livechat-manager']))) {
        return;
    }

    if (!(await hasAnyRoleAsync(user, ['livechat-monitor']))) {
        return;
    }

    const unitsAndDepartments = [...(await memoizedGetUnitFromUserRoles(user)), ...(await memoizedGetDepartmentsFromUserRoles(user))];
    logger.debug({ msg: 'Calculating units for monitor', user, unitsAndDepartments });

    return unitsAndDepartments;
};

declare module '@rocket.chat/ddp-client' {
    // eslint-disable-next-line @typescript-eslint/naming-convention
    interface ServerMethods {
        'livechat:getUnitsFromUser'(): Promise<string[] | undefined>;
    }
}

Meteor.methods<ServerMethods>({
    async 'livechat:getUnitsFromUser'(): Promise<string[] | undefined> {
        const user = Meteor.userId();
        if (!user) {
            return;
        }
        return getUnitsFromUser(user);
    },
});