RocketChat/Rocket.Chat

View on GitHub
apps/meteor/ee/server/models/raw/CannedResponse.ts

Summary

Maintainability
C
7 hrs
Test Coverage
import type { IOmnichannelCannedResponse } from '@rocket.chat/core-typings';
import type { ICannedResponseModel } from '@rocket.chat/model-typings';
import type { Db, DeleteResult, FindCursor, FindOptions, IndexDescription, UpdateFilter } from 'mongodb';

import { BaseRaw } from '../../../../server/models/raw/BaseRaw';

// TODO need to define type for CannedResponse object
export class CannedResponseRaw extends BaseRaw<IOmnichannelCannedResponse> implements ICannedResponseModel {
    constructor(db: Db) {
        super(db, 'canned_response');
    }

    protected modelIndexes(): IndexDescription[] {
        return [
            {
                key: {
                    shortcut: 1,
                },
                unique: true,
            },
        ];
    }

    async updateCannedResponse(
        _id: string,
        { shortcut, text, tags, scope, userId, departmentId, createdBy }: Omit<IOmnichannelCannedResponse, '_id' | '_updatedAt' | '_createdAt'>,
    ): Promise<Omit<IOmnichannelCannedResponse, '_updatedAt' | '_createdAt'>> {
        const record = {
            shortcut,
            text,
            scope,
            tags,
            userId,
            departmentId,
            createdBy,
        };

        await this.updateOne({ _id }, { $set: record });

        return Object.assign(record, { _id });
    }

    async createCannedResponse({
        shortcut,
        text,
        tags,
        scope,
        userId,
        departmentId,
        createdBy,
        _createdAt,
    }: Omit<IOmnichannelCannedResponse, '_id' | '_updatedAt'>): Promise<Omit<IOmnichannelCannedResponse, '_updatedAt'>> {
        const record = {
            shortcut,
            text,
            scope,
            tags,
            userId,
            departmentId,
            createdBy,
            _createdAt,
        };

        const _id = (await this.insertOne(record)).insertedId;
        return Object.assign(record, { _id });
    }

    findOneById(_id: string, options?: FindOptions<IOmnichannelCannedResponse>): Promise<IOmnichannelCannedResponse | null> {
        const query = { _id };

        return this.findOne(query, options);
    }

    findOneByShortcut(shortcut: string, options?: FindOptions<IOmnichannelCannedResponse>): Promise<IOmnichannelCannedResponse | null> {
        const query = {
            shortcut,
        };

        return this.findOne(query, options);
    }

    findByCannedResponseId(_id: string, options?: FindOptions<IOmnichannelCannedResponse>): FindCursor<IOmnichannelCannedResponse> {
        const query = { _id };

        return this.find(query, options);
    }

    findByDepartmentId(departmentId: string, options?: FindOptions<IOmnichannelCannedResponse>): FindCursor<IOmnichannelCannedResponse> {
        const query = {
            scope: 'department',
            departmentId,
        };

        return this.find(query, options);
    }

    findByShortcut(shortcut: string, options?: FindOptions<IOmnichannelCannedResponse>): FindCursor<IOmnichannelCannedResponse> {
        const query = { shortcut };

        return this.find(query, options);
    }

    // REMOVE
    removeById(_id: string): Promise<DeleteResult> {
        const query = { _id };

        return this.deleteOne(query);
    }

    removeTagFromCannedResponses(tagId: string) {
        const update: UpdateFilter<IOmnichannelCannedResponse> = {
            $pull: {
                tags: tagId,
            },
        };

        return this.updateMany({}, update);
    }
}