diff --git a/packages/bp/src/admin/workspace/bots/bots-router.ts b/packages/bp/src/admin/workspace/bots/bots-router.ts index 092fdd17da6..45a3dc4c81e 100644 --- a/packages/bp/src/admin/workspace/bots/bots-router.ts +++ b/packages/bp/src/admin/workspace/bots/bots-router.ts @@ -81,12 +81,23 @@ class BotsRouter extends CustomAdminRouter { }) ) + const assertBotInWorkspace = async (botId: string, workspaceId?: string) => { + const botExists = (await this.botService.getBotsIds()).includes(botId) + const isBotInCurrentWorkspace = (await this.workspaceService.getBotRefs(workspaceId)).includes(botId) + + if (botExists && !isBotInCurrentWorkspace) { + throw new ConflictError(`Bot "${botId}" already exists in another workspace. Bot ID are unique server-wide`) + } + } + router.post( '/', this.needPermissions('write', this.resource), this.asyncMiddleware(async (req, res) => { const bot = _.pick(req.body, ['id', 'name', 'category', 'defaultLanguage']) + await assertBotInWorkspace(bot.id, req.workspace) + const botExists = (await this.botService.getBotsIds()).includes(bot.id) const botLinked = (await this.workspaceService.getBotRefs()).includes(bot.id) @@ -205,6 +216,8 @@ class BotsRouter extends CustomAdminRouter { const botId = await this.botService.makeBotId(req.params.botId, req.workspace!) + await assertBotInWorkspace(botId, req.workspace) + const buffers: any[] = [] req.on('data', chunk => buffers.push(chunk)) await Promise.fromCallback(cb => req.on('end', cb))