RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts

Summary

Maintainability
A
1 hr
Test Coverage
import type { ServerMethods } from '@rocket.chat/ddp-client';
import { Integrations, IntegrationHistory } from '@rocket.chat/models';
import { Meteor } from 'meteor/meteor';

import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission';
import { triggerHandler } from '../../lib/triggerHandler';

declare module '@rocket.chat/ddp-client' {
    // eslint-disable-next-line @typescript-eslint/naming-convention
    interface ServerMethods {
        replayOutgoingIntegration(params: { integrationId: string; historyId: string }): Promise<boolean>;
    }
}

Meteor.methods<ServerMethods>({
    async replayOutgoingIntegration({ integrationId, historyId }) {
        let integration;

        if (!this.userId) {
            throw new Meteor.Error('not_authorized', 'Unauthorized', {
                method: 'replayOutgoingIntegration',
            });
        }

        if (await hasPermissionAsync(this.userId, 'manage-outgoing-integrations')) {
            integration = await Integrations.findOneById(integrationId);
        } else if (await hasPermissionAsync(this.userId, 'manage-own-outgoing-integrations')) {
            integration = await Integrations.findOne({
                '_id': integrationId,
                '_createdBy._id': this.userId,
            });
        }

        if (!integration) {
            throw new Meteor.Error('error-invalid-integration', 'Invalid integration', {
                method: 'replayOutgoingIntegration',
            });
        }

        const history = await IntegrationHistory.findOneByIntegrationIdAndHistoryId(integration._id, historyId);

        if (!history) {
            throw new Meteor.Error('error-invalid-integration-history', 'Invalid Integration History', {
                method: 'replayOutgoingIntegration',
            });
        }

        await triggerHandler.replay(integration, history);

        return true;
    },
});