diff --git a/src/api-docs/paths/path-client.js b/src/api-docs/paths/path-client.js index 3df491e..2ed6748 100644 --- a/src/api-docs/paths/path-client.js +++ b/src/api-docs/paths/path-client.js @@ -1,6 +1,5 @@ import { StrategiesType } from '../../models/config-strategy.js'; import { pathParameter, queryParameter } from '../schemas/common.js'; -import configStrategy from '../schemas/config-strategy.js'; export default { '/criteria': { @@ -59,7 +58,9 @@ export default { }, strategies: { type: 'array', - items: configStrategy.ConfigStrategyCriteriaResponse + items: { + $ref: '#/components/schemas/ConfigStrategyCriteriaResponse' + } } } } diff --git a/src/api-docs/paths/path-slack.js b/src/api-docs/paths/path-slack.js index 68e2183..f926973 100644 --- a/src/api-docs/paths/path-slack.js +++ b/src/api-docs/paths/path-slack.js @@ -1,5 +1,5 @@ import { pathParameter, queryParameter } from '../schemas/common.js'; -import { commonSchemaContent } from './common.js'; +import { commonArraySchemaContent, commonSchemaContent } from './common.js'; export default { '/slack/v1/installation': { @@ -189,6 +189,22 @@ export default { } } }, + '/slack/v1/domains': { + get: { + tags: ['Switcher Slack App'], + description: 'Return all domains given a team ID', + security: [{ bearerAuth: [] }], + parameters: [ + queryParameter('team_id', 'The Slack team ID', true, 'string') + ], + responses: { + 200: { + description: 'The domains were found', + content: commonSchemaContent('SlackDomains') + } + } + } + }, '/slack/v1/installation/{domain}': { get: { tags: ['Switcher Slack App'], @@ -200,7 +216,7 @@ export default { responses: { 200: { description: 'The installation was found', - content: commonSchemaContent('SlackInstallationSummary') + content: commonArraySchemaContent('SlackInstallationSummary') } } } diff --git a/src/api-docs/schemas/slack.js b/src/api-docs/schemas/slack.js index ad19481..9901a11 100644 --- a/src/api-docs/schemas/slack.js +++ b/src/api-docs/schemas/slack.js @@ -128,6 +128,20 @@ const installation_payload = { } }; +const domains_payload = { + type: 'object', + properties: { + id: { + type: 'string', + description: 'The domain ID' + }, + name: { + type: 'string', + description: 'The domain name' + } + } +}; + const bot_payload = { type: 'object', properties: { @@ -223,6 +237,7 @@ const ticket_content = { export default { Slack: slack, SlackInstallation: installation_payload, + SlackDomains: domains_payload, SlackBot: bot_payload, SlackTicket: ticket, SlackInstallationRequest: { diff --git a/src/api-docs/swagger-document.js b/src/api-docs/swagger-document.js index a9bc23c..ecad578 100644 --- a/src/api-docs/swagger-document.js +++ b/src/api-docs/swagger-document.js @@ -38,8 +38,6 @@ export default { description: 'Cloud API' } ], - consumes: ['application/json'], - produces: ['application/json'], components: { securitySchemes: { bearerAuth: { diff --git a/src/routers/slack.js b/src/routers/slack.js index e695426..673ead0 100644 --- a/src/routers/slack.js +++ b/src/routers/slack.js @@ -191,6 +191,17 @@ router.get('/slack/v1/installation/:domain', auth, [ } }); +router.get('/slack/v1/domains', auth, [ + query('team_id').exists() +], validate, async (req, res) => { + try { + const domains = await Services.getDomainsByTeamId(req.query.team_id); + res.send(domains); + } catch (e) { + responseException(res, e, 400); + } +}); + router.delete('/slack/v1/installation', slackAuth, [ query('team_id').exists() ], validate, async (req, res) => { diff --git a/src/services/slack.js b/src/services/slack.js index 11c06ce..9add2b0 100644 --- a/src/services/slack.js +++ b/src/services/slack.js @@ -67,6 +67,24 @@ async function hasSlackTicket(slackId, ticket_content) { return tickets; } +export async function getDomainsByTeamId(team_id) { + const slacks = await Slack.find({ team_id }); + + if (!slacks.length) { + throw new NotFoundError('Slack installation not found'); + } + + const domains = await Promise.all(slacks.map(async slack => { + const domain = await getDomainById(slack.domain); + return { + id: domain._id, + name: domain.name + }; + })); + + return domains; +} + export async function getSlackOrError(where, newInstallation = false) { const slack = await getSlack(where, newInstallation); diff --git a/tests/slack.test.js b/tests/slack.test.js index 1a1e591..c19c103 100644 --- a/tests/slack.test.js +++ b/tests/slack.test.js @@ -371,13 +371,13 @@ describe('Slack Installation', () => { const installation = await buildInstallation('SHOULD_DELETE_AUTHORIZE_INSTALLATION', null); await authorizeInstallation(installation, domainId, adminMasterAccountToken); - const responseCreateTicket = await createTicket(installation.team_id); + const { ticket } = await createTicket(installation.team_id); //verify that let domain = await getDomainById(domainId); expect(domain.integrations.slack).not.toBe(null); - let slackTickets = await SlackTicket.find({ slack: responseCreateTicket.ticket.slack }).exec(); + let slackTickets = await SlackTicket.find({ slack: ticket.slack }).exec(); expect(slackTickets.length).toBe(1); //test @@ -395,7 +395,7 @@ describe('Slack Installation', () => { }); expect(slackDb).toBe(null); - slackTickets = await SlackTicket.find({ slack: responseCreateTicket.ticket.slack }).exec(); + slackTickets = await SlackTicket.find({ slack: ticket.slack }).exec(); expect(slackTickets.length).toBe(0); }); @@ -500,6 +500,52 @@ describe('Slack Installation', () => { expect(slackDb).toBe(null); }); + test('SLACK_SUITE - Should find Domains by Slack Team Id', async () => { + //given + const teamId = 'SLACK_INSTALLATION_DOMAINS'; + const domainId2 = await createDomain('Domain 2 (findByTeamId)'); + await buildInstallation(teamId, domainId2); + + const domainId3 = await createDomain('Domain 3 (findByTeamId)'); + await buildInstallation(teamId, domainId3); + + //test + const response = await request(app) + .get(`/slack/v1/domains?team_id=${teamId}`) + .set('Authorization', `Bearer ${adminMasterAccountToken}`) + .send().expect(200); + + expect(response.body).toMatchObject([ + { id: String(domainId2), name: 'Domain 2 (findByTeamId)' }, + { id: String(domainId3), name: 'Domain 3 (findByTeamId)' } + ]); + }); + + test('SLACK_SUITE - Should NOT find Domains by Slack Team Id - Missing param', async () => { + await request(app) + .get('/slack/v1/domains') + .set('Authorization', `Bearer ${adminMasterAccountToken}`) + .send().expect(422); + }); + + test('SLACK_SUITE - Should NOT find Domains by Slack Team Id - Team Id not found', async () => { + await request(app) + .get('/slack/v1/domains?team_id=NOT_FOUND') + .set('Authorization', `Bearer ${adminMasterAccountToken}`) + .send().expect(404); + }); + + test('SLACK_SUITE - Should NOT find Domains by Slack Team Id - Slack Installation not associated with a Domain', async () => { + //given + const teamId = 'NO_DOMAIN_TEAM_ID'; + await buildInstallation(teamId, null); + + //test + await request(app) + .get(`/slack/v1/domains?team_id=${teamId}`) + .set('Authorization', `Bearer ${adminMasterAccountToken}`) + .send().expect(404); + }); }); describe('Slack Settings', () => {