@rocket.chat/apps-engine
Version:
The engine code for the Rocket.Chat Apps which manages, runs, translates, coordinates and all of that.
162 lines (132 loc) • 6.76 kB
text/typescript
import type { IModifyUpdater } from '@rocket.chat/apps-engine/definition/accessors/IModifyUpdater.ts';
import type { ILivechatUpdater } from '@rocket.chat/apps-engine/definition/accessors/ILivechatUpdater.ts';
import type { IUserUpdater } from '@rocket.chat/apps-engine/definition/accessors/IUserUpdater.ts';
import type { IMessageBuilder } from '@rocket.chat/apps-engine/definition/accessors/IMessageBuilder.ts';
import type { IRoomBuilder } from '@rocket.chat/apps-engine/definition/accessors/IRoomBuilder.ts';
import type { IUser } from '@rocket.chat/apps-engine/definition/users/IUser.ts';
import type { IMessage } from '@rocket.chat/apps-engine/definition/messages/IMessage.ts';
import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms/IRoom.ts';
import type { UIHelper as _UIHelper } from '@rocket.chat/apps-engine/server/misc/UIHelper.ts';
import type { RoomType as _RoomType } from '@rocket.chat/apps-engine/definition/rooms/RoomType.ts';
import type { RocketChatAssociationModel as _RocketChatAssociationModel } from '@rocket.chat/apps-engine/definition/metadata/RocketChatAssociations.ts';
import * as Messenger from '../../messenger.ts';
import { MessageBuilder } from '../builders/MessageBuilder.ts';
import { RoomBuilder } from '../builders/RoomBuilder.ts';
import { AppObjectRegistry } from '../../../AppObjectRegistry.ts';
import { require } from '../../../lib/require.ts';
const { UIHelper } = require('@rocket.chat/apps-engine/server/misc/UIHelper.js') as { UIHelper: typeof _UIHelper };
const { RoomType } = require('@rocket.chat/apps-engine/definition/rooms/RoomType.js') as { RoomType: typeof _RoomType };
const { RocketChatAssociationModel } = require('@rocket.chat/apps-engine/definition/metadata/RocketChatAssociations.js') as {
RocketChatAssociationModel: typeof _RocketChatAssociationModel;
};
export class ModifyUpdater implements IModifyUpdater {
constructor(private readonly senderFn: typeof Messenger.sendRequest) { }
public getLivechatUpdater(): ILivechatUpdater {
return new Proxy(
{ __kind: 'getLivechatUpdater' },
{
get:
(_target: unknown, prop: string) =>
(...params: unknown[]) =>
prop === 'toJSON'
? {}
: this.senderFn({
method: `accessor:getModifier:getUpdater:getLivechatUpdater:${prop}`,
params,
})
.then((response) => response.result)
.catch((err) => {
throw new Error(err.error);
}),
},
) as ILivechatUpdater;
}
public getUserUpdater(): IUserUpdater {
return new Proxy(
{ __kind: 'getUserUpdater' },
{
get:
(_target: unknown, prop: string) =>
(...params: unknown[]) =>
prop === 'toJSON'
? {}
: this.senderFn({
method: `accessor:getModifier:getUpdater:getUserUpdater:${prop}`,
params,
})
.then((response) => response.result)
.catch((err) => {
throw new Error(err.error);
}),
},
) as IUserUpdater;
}
public async message(messageId: string, editor: IUser): Promise<IMessageBuilder> {
const response = await this.senderFn({
method: 'bridges:getMessageBridge:doGetById',
params: [messageId, AppObjectRegistry.get('id')],
});
const builder = new MessageBuilder(response.result as IMessage);
builder.setEditor(editor);
return builder;
}
public async room(roomId: string, _updater: IUser): Promise<IRoomBuilder> {
const response = await this.senderFn({
method: 'bridges:getRoomBridge:doGetById',
params: [roomId, AppObjectRegistry.get('id')],
});
return new RoomBuilder(response.result as IRoom);
}
public finish(builder: IMessageBuilder | IRoomBuilder): Promise<void> {
switch (builder.kind) {
case RocketChatAssociationModel.MESSAGE:
return this._finishMessage(builder as MessageBuilder);
case RocketChatAssociationModel.ROOM:
return this._finishRoom(builder as RoomBuilder);
default:
throw new Error('Invalid builder passed to the ModifyUpdater.finish function.');
}
}
private async _finishMessage(builder: MessageBuilder): Promise<void> {
const result = builder.getMessage();
if (!result.id) {
throw new Error("Invalid message, can't update a message without an id.");
}
if (!result.sender?.id) {
throw new Error('Invalid sender assigned to the message.');
}
if (result.blocks?.length) {
result.blocks = UIHelper.assignIds(result.blocks, AppObjectRegistry.get('id') || '');
}
const changes = { id: result.id, ...builder.getChanges() };
await this.senderFn({
method: 'bridges:getMessageBridge:doUpdate',
params: [changes, AppObjectRegistry.get('id')],
});
}
private async _finishRoom(builder: RoomBuilder): Promise<void> {
const room = builder.getRoom();
if (!room.id) {
throw new Error("Invalid room, can't update a room without an id.");
}
if (!room.type) {
throw new Error('Invalid type assigned to the room.');
}
if (room.type !== RoomType.LIVE_CHAT) {
if (!room.creator || !room.creator.id) {
throw new Error('Invalid creator assigned to the room.');
}
if (!room.slugifiedName || !room.slugifiedName.trim()) {
throw new Error('Invalid slugifiedName assigned to the room.');
}
}
if (!room.displayName || !room.displayName.trim()) {
throw new Error('Invalid displayName assigned to the room.');
}
const changes = { id: room.id, ...builder.getChanges() };
await this.senderFn({
method: 'bridges:getRoomBridge:doUpdate',
params: [changes, builder.getMembersToBeAddedUsernames(), AppObjectRegistry.get('id')],
});
}
}