Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NEW] Update IModifyCreator to expose IUserBuilder to enable user creation #536

Merged
merged 12 commits into from Feb 8, 2023
13 changes: 12 additions & 1 deletion src/definition/accessors/IModifyCreator.ts
@@ -1,3 +1,4 @@
import { IBotUser } from './../users/IBotUser';
import { ILivechatMessage } from '../livechat';
import { IMessage } from '../messages';
import { IRoom } from '../rooms';
Expand All @@ -9,6 +10,7 @@ import { ILivechatMessageBuilder } from './ILivechatMessageBuilder';
import { IMessageBuilder } from './IMessageBuilder';
import { IRoomBuilder } from './IRoomBuilder';
import { IUploadCreator } from './IUploadCreator';
import { IUserBuilder } from './IUserBuilder';
import { IVideoConferenceBuilder } from './IVideoConferenceBuilder';

export interface IModifyCreator {
Expand Down Expand Up @@ -71,11 +73,20 @@ export interface IModifyCreator {
*/
startVideoConference(data?: Partial<AppVideoConference>): IVideoConferenceBuilder;

/**
* Starts the process for building a new bot user.
*
* @param data (optional) the initial data to pass into the builder,
* the `id` property will be ignored
* @return an IUserBuilder instance
*/
startCreateBotUser(data?: Partial<IBotUser>): IUserBuilder;

/**
* Finishes the creating process, saving the object to the database.
*
* @param builder the builder instance
* @return the resulting `id` of the resulting object
*/
finish(builder: IMessageBuilder | ILivechatMessageBuilder | IRoomBuilder | IDiscussionBuilder | IVideoConferenceBuilder): Promise<string>;
finish(builder: IMessageBuilder | ILivechatMessageBuilder | IRoomBuilder | IDiscussionBuilder | IVideoConferenceBuilder | IUserBuilder): Promise<string>;
}
6 changes: 6 additions & 0 deletions src/definition/users/IBotUser.ts
@@ -0,0 +1,6 @@
import { UserType } from './UserType';
import { IUser } from './IUser';

export interface IBotUser extends Omit<IUser, 'emails' | 'utcOffset'> {
albuquerquefabio marked this conversation as resolved.
Show resolved Hide resolved
type: UserType.BOT;
}
47 changes: 39 additions & 8 deletions src/server/accessors/ModifyCreator.ts
@@ -1,3 +1,5 @@
import { UserType } from './../../definition/users/UserType';
import { IBotUser } from './../../definition/users/IBotUser';
import {
IDiscussionBuilder,
ILivechatCreator,
Expand All @@ -6,6 +8,7 @@ import {
IModifyCreator,
IRoomBuilder,
IUploadCreator,
IUserBuilder,
IVideoConferenceBuilder,
} from '../../definition/accessors';
import { ILivechatMessage } from '../../definition/livechat/ILivechatMessage';
Expand All @@ -21,6 +24,7 @@ import { LivechatMessageBuilder } from './LivechatMessageBuilder';
import { MessageBuilder } from './MessageBuilder';
import { RoomBuilder } from './RoomBuilder';
import { UploadCreator } from './UploadCreator';
import { UserBuilder } from './UserBuilder';
import { VideoConferenceBuilder } from './VideoConferenceBuilder';

export class ModifyCreator implements IModifyCreator {
Expand Down Expand Up @@ -80,7 +84,30 @@ export class ModifyCreator implements IModifyCreator {
return new VideoConferenceBuilder(data);
}

public finish(builder: IMessageBuilder | ILivechatMessageBuilder | IRoomBuilder | IDiscussionBuilder | IVideoConferenceBuilder): Promise<string> {
public startCreateBotUser(data?: Partial<IBotUser>): IUserBuilder {
if (data) {
delete data.id;

if (data.roles && data.roles.length) {
const roles = data.roles;
const hasRole = roles.map((role) => role.toLocaleLowerCase()).some((role) => role === 'admin' || role === 'owner' || role === 'moderator');

if (hasRole) {
throw new Error('Invalid role assigned to the user. Should not be admin, owner or moderator.');
}
}

if (!data.type) {
data.type = UserType.BOT;
}
}

return new UserBuilder(data);
}

public finish(
builder: IMessageBuilder | ILivechatMessageBuilder | IRoomBuilder | IDiscussionBuilder | IVideoConferenceBuilder | IUserBuilder,
): Promise<string> {
switch (builder.kind) {
case RocketChatAssociationModel.MESSAGE:
return this._finishMessage(builder);
Expand All @@ -92,6 +119,8 @@ export class ModifyCreator implements IModifyCreator {
return this._finishDiscussion(builder as IDiscussionBuilder);
case RocketChatAssociationModel.VIDEO_CONFERENCE:
return this._finishVideoConference(builder);
case RocketChatAssociationModel.USER:
return this._finishUser(builder);
default:
throw new Error('Invalid builder passed to the ModifyCreator.finish function.');
}
Expand Down Expand Up @@ -180,13 +209,9 @@ export class ModifyCreator implements IModifyCreator {
throw new Error('Invalid parentRoom assigned to the discussion.');
}

return this.bridges.getRoomBridge().doCreateDiscussion(
room,
builder.getParentMessage(),
builder.getReply(),
builder.getMembersToBeAddedUsernames(),
this.appId,
);
return this.bridges
.getRoomBridge()
.doCreateDiscussion(room, builder.getParentMessage(), builder.getReply(), builder.getMembersToBeAddedUsernames(), this.appId);
}

private _finishVideoConference(builder: IVideoConferenceBuilder): Promise<string> {
Expand All @@ -206,4 +231,10 @@ export class ModifyCreator implements IModifyCreator {

return this.bridges.getVideoConferenceBridge().doCreate(videoConference, this.appId);
}

private _finishUser(builder: IUserBuilder): Promise<string> {
const user = builder.getUser();

return this.bridges.getUserBridge().doCreate(user, this.appId);
}
}