grigori-gru/jira-to-matrix

View on GitHub
src/bot/commands/command-list/autoinvite.ts

Summary

Maintainability
C
7 hrs
Test Coverage
import { translate } from '../../../locales';
import * as utils from '../../../lib/utils';
import { getAllSettingData, setSettingsData } from '../../settings';
import { Command, RunCommand } from './command-base';
import { CommandOptions } from '../../../types';
import { Jira } from '../../../task-trackers/jira';

export class AutoInviteCommand extends Command<Jira> implements RunCommand {
    async run({ bodyText, roomName, sender }: CommandOptions) {
        const jiraBotUser = this.config.taskTracker.user;
        const projectKey = utils.getProjectKeyFromIssueKey(roomName);
        const { lead, issueTypes, admins } = await this.taskTracker.getProjectWithAdmins(projectKey);

        if (!admins) {
            return translate('jiraBotWereAreNotInProject', { jiraBotUser });
        }

        const allAdmins = await Promise.all(
            [lead, ...admins].map(displayName => this.chatApi.getUserIdByDisplayName(displayName)),
        );

        if (!allAdmins.some(name => name.includes(sender))) {
            return translate('notAdmin', { sender });
        }
        const namesIssueTypeInProject = issueTypes.map(({ name }) => name);

        const { [projectKey]: currentInvite = {} } = await getAllSettingData('autoinvite');

        // to do
        if (!bodyText) {
            return utils.getIgnoreTips(projectKey, Object.entries(currentInvite), 'autoinvite');
        }
        const [command, typeTaskFromUser, userFromCommand] = bodyText.split(' ');
        const { [typeTaskFromUser]: currentUsers = [] } = currentInvite;

        if (!['add', 'del'].includes(command) || !typeTaskFromUser || !userFromCommand) {
            return translate('invalidCommand');
        }

        if (!namesIssueTypeInProject.includes(typeTaskFromUser)) {
            return utils.ignoreKeysInProject(projectKey, namesIssueTypeInProject);
        }
        // to do
        const matrixUserFromCommand = this.chatApi.getChatUserId(userFromCommand);
        // TODO rename to isUser
        if (!(await this.chatApi.getUser(matrixUserFromCommand))) {
            return translate('notInMatrix', { userFromCommand });
        }

        switch (command) {
            case 'add':
                if (currentUsers.includes(userFromCommand)) {
                    return translate('keyAlreadyExistForAdd', { typeTaskFromUser: userFromCommand, projectKey });
                }
                await setSettingsData(
                    projectKey,
                    {
                        ...currentInvite,
                        [typeTaskFromUser]: [...currentUsers, userFromCommand],
                    },
                    'autoinvite',
                );

                return translate('autoinviteKeyAdded', { projectKey, matrixUserFromCommand, typeTaskFromUser });
            case 'del':
                if (!currentUsers.includes(userFromCommand)) {
                    return translate('keyNotFoundForDelete', { projectKey });
                }
                await setSettingsData(
                    projectKey,
                    {
                        ...currentInvite,
                        [typeTaskFromUser]: currentUsers.filter(task => task !== matrixUserFromCommand),
                    },
                    'autoinvite',
                );

                return translate('autoinviteKeyDeleted', {
                    projectKey,
                    matrixUserFromCommand: userFromCommand,
                    typeTaskFromUser,
                });
            default:
                return translate('invalidCommand');
        }
    }
}