diff --git a/packages/backend/src/apps/slack/auth/generate-auth-url.ts b/packages/backend/src/apps/slack/auth/generate-auth-url.ts index 76282180..72e6ec03 100644 --- a/packages/backend/src/apps/slack/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/slack/auth/generate-auth-url.ts @@ -29,6 +29,7 @@ const userScopes = [ 'groups:history', 'groups:read', 'groups:write', + 'im:read', 'im:write', 'mpim:write', 'reactions:read', diff --git a/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts b/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts index 15b8c367..7553406c 100644 --- a/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts +++ b/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts @@ -1,5 +1,24 @@ import { IGlobalVariable, IJSONObject } from '@automatisch/types'; +type TChannel = { + id: string; + name: string; +} + +type TConversationListResponseData = { + channels: TChannel[], + response_metadata?: { + next_cursor: string + }; + needed?: string; + error?: string; + ok: boolean; +} + +type TResponse = { + data: TConversationListResponseData; +} + export default { name: 'List channels', key: 'listChannels', @@ -13,24 +32,33 @@ export default { error: null, }; - const response = await $.http.get('/conversations.list', { - params: { - types: 'public_channel,private_channel', - limit: 1000, - exclude_archived: true, + let nextCursor; + do { + const response: TResponse = await $.http.get('/conversations.list', { + params: { + types: 'public_channel,private_channel,im', + cursor: nextCursor, + limit: 1000, + } + }); + + nextCursor = response.data.response_metadata?.next_cursor; + + if (response.data.error === 'missing_scope') { + throw new Error(`Missing "${response.data.needed}" scope while authorizing. Please, reconnect your connection!`); } - }); - if (response.data.ok === false) { - throw new Error(response.data); - } + if (response.data.ok === false) { + throw new Error(JSON.stringify(response.data, null, 2)); + } - channels.data = response.data.channels.map((channel: IJSONObject) => { - return { - value: channel.id, - name: channel.name, - }; - }); + for (const channel of response.data.channels) { + channels.data.push({ + value: channel.id as string, + name: channel.name as string, + }); + } + } while (nextCursor); return channels; },