RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/livechat/server/hooks/afterUserActions.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { type IUser } from '@rocket.chat/core-typings';
import { Users } from '@rocket.chat/models';

import { callbacks } from '../../../../lib/callbacks';
import { Livechat as LivechatTyped } from '../lib/LivechatTyped';

type IAfterSaveUserProps = {
    user: IUser;
    oldUser: IUser | null;
};

const wasAgent = (user: Pick<IUser, 'roles'> | null) => user?.roles?.includes('livechat-agent');
const isAgent = (user: Pick<IUser, 'roles'> | null) => user?.roles?.includes('livechat-agent');

const handleAgentUpdated = async (userData: IAfterSaveUserProps) => {
    const { user: newUser, oldUser } = userData;

    if (wasAgent(oldUser) && !isAgent(newUser)) {
        await LivechatTyped.afterRemoveAgent(newUser);
    }

    if (!wasAgent(oldUser) && isAgent(newUser)) {
        await LivechatTyped.afterAgentAdded(newUser);
    }
};

const handleAgentCreated = async (user: IUser) => {
    // created === no prev roles :)
    if (isAgent(user)) {
        await LivechatTyped.afterAgentAdded(user);
    }
};

const handleDeactivateUser = async (user: IUser) => {
    if (wasAgent(user)) {
        await Users.makeAgentUnavailableAndUnsetExtension(user._id);
    }
};

const handleActivateUser = async (user: IUser) => {
    if (isAgent(user) && user.username) {
        await LivechatTyped.afterAgentUserActivated(user);
    }
};

callbacks.add('afterCreateUser', handleAgentCreated, callbacks.priority.LOW, 'livechat-after-create-user-update-agent');

callbacks.add('afterSaveUser', handleAgentUpdated, callbacks.priority.LOW, 'livechat-after-save-user-update-agent');

callbacks.add('afterDeactivateUser', handleDeactivateUser, callbacks.priority.LOW, 'livechat-after-deactivate-user-remove-agent');

callbacks.add('afterActivateUser', handleActivateUser, callbacks.priority.LOW, 'livechat-after-activate-user-add-agent');