Skip to content

Commit d47b9dd

Browse files
authored
Use channel id not name (#48)
* fix broken bot, plus some niceties * cleanup
1 parent 70e4e0b commit d47b9dd

File tree

8 files changed

+49
-38
lines changed

8 files changed

+49
-38
lines changed

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,4 @@ jobs:
6969
# sam build
7070
- run: sam build --use-container
7171
# sam deploy
72-
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --parameter-overrides SlackTokenSecret=${{ secrets.SLACKTOKEN }} SmallImprovementsTokenSecret=${{ secrets.SITOKEN }} SlackChannel=goals ScheduleEnabled=true
72+
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --parameter-overrides SlackTokenSecret=${{ secrets.SLACKTOKEN }} SmallImprovementsTokenSecret=${{ secrets.SITOKEN }} SlackChannel=CF4U95FN0 ScheduleEnabled=true

it/integration.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const index = require('../src/index');
22

33
describe('integration', () => {
44
const event = {
5-
time: '2022-06-16T00:00:00Z'
5+
time: '2025-10-30T00:00:00Z'
66
};
77

88
test('process event', async () => {

src/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,13 @@ async function main(event, context) {
5858
})
5959
);
6060
const allPostResults = completedResults.concat(createdResults);
61-
const successfulPosts = allPostResults.filter(x => x.value);
6261
const failedPosts = allPostResults.filter(x => x.status === 'rejected');
62+
const nonErrorPosts = allPostResults.filter(x => x.status === 'fulfilled');
63+
const successfulPosts = nonErrorPosts.filter(x => x.value !== undefined);
64+
const skippedPosts = nonErrorPosts.filter(x => x.value === undefined);
6365

6466
failedPosts.forEach(fail => console.log(fail.reason));
65-
const message = `Finished ${successfulPosts.length} successfully. Failed ${failedPosts.length}`;
67+
const message = `Finished ${successfulPosts.length} successfully. Failed ${failedPosts.length}. ${skippedPosts.length} already existed (skipped)`;
6668
console.log(message);
6769
return message;
6870
}

src/slack-service.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
const slackClient = require('./slack');
22

33
// Get Slack ID, Format Message, Post
4-
async function PostCompletedObjective(token, channelName, content, newStatus, email) {
4+
async function PostCompletedObjective(token, channelId, content, newStatus, email) {
55
const slackID = await slackClient.getSlackID(email, token);
66
const formattedMessage = await slackClient.formatSlackMessageForCompleted(content.objective, newStatus, slackID, content.cycle.id);
7-
return await slackClient.slackPost(token, channelName, formattedMessage);
7+
return await slackClient.slackPost(token, channelId, formattedMessage);
88
}
9-
async function PostCreatedObjective(token, channelName, content, email) {
9+
async function PostCreatedObjective(token, channelId, content, email) {
1010
const slackID = await slackClient.getSlackID(email, token);
1111
const formattedMessage = await slackClient.formatSlackMessageForCreated(content.objective, slackID, content.cycle.id);
12-
return await slackClient.slackPost(token, channelName, formattedMessage);
12+
return await slackClient.slackPost(token, channelId, formattedMessage);
1313
}
1414

1515
exports.PostCompletedObjective = PostCompletedObjective;

src/slack.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ const messageVariables = {
44
};
55

66
// Post a message to a channel your app is in using ID and message text
7-
async function slackPost(authToken, channelName, formattedMessage) { // postData should be JSON, e.g. { channel:"#channel", text:'message' }
8-
formattedMessage.channel = '' + channelName;
7+
async function slackPost(authToken, channelId, formattedMessage) { // postData should be JSON, e.g. { channel:"#channel", text:'message' }
8+
formattedMessage.channel = '' + channelId;
99

1010
const options = {
1111
hostname: 'sourceallies.slack.com',
@@ -30,7 +30,12 @@ async function slackPost(authToken, channelName, formattedMessage) { // postData
3030
});
3131
res.on('end', () => {
3232
const responseBody = Buffer.concat(body).toString();
33-
resolve(responseBody);
33+
const jsonResponse = JSON.parse(responseBody);
34+
if (jsonResponse.ok === true) {
35+
resolve(responseBody);
36+
} else {
37+
reject(new Error(`Slack post failed with error: ${jsonResponse.error}`));
38+
}
3439
});
3540
});
3641
req.on('error', (e) => {
@@ -118,8 +123,13 @@ function getSlackID(email, token) {
118123
res.on('data', d => {
119124
responsePayload += d;
120125
});
121-
res.on('close', () => {
122-
resolve(JSON.parse(responsePayload).user.id);
126+
res.on('end', () => {
127+
const responseObject = JSON.parse(responsePayload);
128+
if (typeof responseObject.user === 'undefined' || responseObject.user.id === 'undefined') {
129+
reject(new Error(`Unexpected slack ID response: ${responsePayload}`));
130+
} else {
131+
resolve(responseObject.user.id);
132+
}
123133
});
124134
});
125135
req.on('error', err => {

src/small-improvements.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function getObjectives(token) {
2424
res.on('data', d => {
2525
responsePayload += d;
2626
});
27-
res.on('close', () => {
27+
res.on('end', () => {
2828
resolve(JSON.parse(responsePayload));
2929
});
3030
});
@@ -54,12 +54,11 @@ function getEmail(SIUID, token) { // SIUID (Small Improvements User ID) is in th
5454
if (res.statusCode !== 200) {
5555
console.log(`status logged ${res.statusCode}`);
5656
reject(new Error(`Could not get email: ${res.statusCode}`));
57-
return;
5857
}
5958
res.on('data', d => {
6059
responsePayload += d;
6160
});
62-
res.on('close', () => {
61+
res.on('end', () => {
6362
resolve(JSON.parse(responsePayload).loginname);
6463
});
6564
});

test/index.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ describe('index', () => {
8181
}];
8282
});
8383

84-
test('should not post previously existing objective', async () => {
84+
test('should not post previously existing objectives', async () => {
8585
secretsClient.getSecret.mockResolvedValue(secrets);
8686
smallImprovementsClient.GetObjectives.mockResolvedValue(activities);
8787
dynamodbClient.getRecord.mockResolvedValue(dynamoRecords);
8888

8989
const result = await index.handler(event);
9090

91-
expect(result).toBe('Finished 0 successfully. Failed 0');
91+
expect(result).toBe('Finished 0 successfully. Failed 0. 2 already existed (skipped)');
9292
expect(dynamodbClient.getRecord).toHaveBeenCalledWith(objectiveId);
9393
expect(dynamodbClient.insertRecord).not.toHaveBeenCalled();
9494
});
@@ -105,7 +105,7 @@ describe('index', () => {
105105

106106
const result = await index.handler(event);
107107

108-
expect(result).toBe('Finished 2 successfully. Failed 0');
108+
expect(result).toBe('Finished 2 successfully. Failed 0. 0 already existed (skipped)');
109109
expect(dynamodbClient.getRecord).toHaveBeenCalledWith(objectiveId);
110110
expect(dynamodbClient.getRecord).toHaveBeenCalledWith(objectiveId + 'CREATED');
111111
expect(dynamodbClient.insertRecord).toHaveBeenCalledWith(activities.items[0].items[0].activities[0], '');
@@ -139,7 +139,7 @@ describe('index', () => {
139139

140140
const result = await index.handler(event);
141141

142-
expect(result).toBe('Finished 2 successfully. Failed 1');
142+
expect(result).toBe('Finished 2 successfully. Failed 1. 0 already existed (skipped)');
143143
expect(dynamodbClient.getRecord).toHaveBeenCalledWith(objectiveId);
144144
expect(dynamodbClient.getRecord).toHaveBeenCalledWith(secondObjectiveId);
145145
expect(dynamodbClient.getRecord).toHaveBeenCalledWith(objectiveId + 'CREATED');

test/slack.test.js

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,24 @@ describe('Slack Requests', () => {
2424
mockSlackID = 'Reece';
2525
mockCycleId = 'CycleId';
2626
responseBody = `{
27-
ok: true,
28-
channel: 'C0179PL5K8E',
29-
ts: '1595354927.001300',
30-
message: {
31-
bot_id: 'B017GED1UEN',
32-
type: 'message',
33-
text: 'Hello, World!',
34-
user: 'U0171MZ51E3',
35-
ts: '1595354927.001300',
36-
team: 'T2CA1AURM',
37-
bot_profile: {
38-
id: 'B017GED1UEN',
39-
deleted: false,
40-
name: 'My Test App',
41-
updated: 1595353545,
42-
app_id: 'A017NKGAKHA',
43-
icons: [Object],
44-
team_id: 'T2CA1AURM'
27+
"ok": true,
28+
"channel": "C0179PL5K8E",
29+
"ts": "1595354927.001300",
30+
"message": {
31+
"bot_id": "B017GED1UEN",
32+
"type": "message",
33+
"text": "Hello, World!",
34+
"user": "U0171MZ51E3",
35+
"ts": "1595354927.001300",
36+
"team": "T2CA1AURM",
37+
"bot_profile": {
38+
"id": "B017GED1UEN",
39+
"deleted": false,
40+
"name": "My Test App",
41+
"updated": 1595353545,
42+
"app_id": "A017NKGAKHA",
43+
"icons": [],
44+
"team_id": "T2CA1AURM"
4545
}
4646
}
4747
}`;

0 commit comments

Comments
 (0)