Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/api-docs/paths/path-client.js
Original file line number Diff line number Diff line change
@@ -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': {
Expand Down Expand Up @@ -59,7 +58,9 @@ export default {
},
strategies: {
type: 'array',
items: configStrategy.ConfigStrategyCriteriaResponse
items: {
$ref: '#/components/schemas/ConfigStrategyCriteriaResponse'
}
}
}
}
Expand Down
20 changes: 18 additions & 2 deletions src/api-docs/paths/path-slack.js
Original file line number Diff line number Diff line change
@@ -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': {
Expand Down Expand Up @@ -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'],
Expand All @@ -200,7 +216,7 @@ export default {
responses: {
200: {
description: 'The installation was found',
content: commonSchemaContent('SlackInstallationSummary')
content: commonArraySchemaContent('SlackInstallationSummary')
}
}
}
Expand Down
15 changes: 15 additions & 0 deletions src/api-docs/schemas/slack.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down Expand Up @@ -223,6 +237,7 @@ const ticket_content = {
export default {
Slack: slack,
SlackInstallation: installation_payload,
SlackDomains: domains_payload,
SlackBot: bot_payload,
SlackTicket: ticket,
SlackInstallationRequest: {
Expand Down
2 changes: 0 additions & 2 deletions src/api-docs/swagger-document.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ export default {
description: 'Cloud API'
}
],
consumes: ['application/json'],
produces: ['application/json'],
components: {
securitySchemes: {
bearerAuth: {
Expand Down
11 changes: 11 additions & 0 deletions src/routers/slack.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
18 changes: 18 additions & 0 deletions src/services/slack.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
52 changes: 49 additions & 3 deletions tests/slack.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
});

Expand Down Expand Up @@ -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', () => {
Expand Down