Skip to content

Commit db120c1

Browse files
author
Sachin Maheshwari
committed
adding 'A new submission is uploaded' support
1 parent f17135b commit db120c1

File tree

6 files changed

+99
-14
lines changed

6 files changed

+99
-14
lines changed

config/default.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ module.exports = {
4848
// key is Kafka topic name, value is array of ruleset which have key as handler function name defined in src/processors/index.js
4949
'challenge.notification.events': [{ handleChallenge: { type: 'UPDATE_DRAFT_CHALLENGE', roles: ["Submitter" /** Competitor */, "Copilot", "Reviewer"] } }],
5050
'notifications.autopilot.events': [{ handleAutoPilot: { phaseTypeName: 'Checkpoint Screening', state: 'START', roles: ["Copilot", "Reviewer"] } }],
51+
'submission.notification.create': [{ handleSubmission: { resource: 'submission', roles: ["Copilot", "Reviewer"], selfOnly: true /** Submitter only */ } }],
5152
//'notifications.community.challenge.created': ['handleChallengeCreated'],
5253
//'notifications.community.challenge.phasewarning': ['handleChallengePhaseWarning'],
5354
},

src/common/tcApiHelper.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -260,25 +260,30 @@ function* getUsersInfoFromChallenge(challengeId) {
260260

261261
/**
262262
* Filter associated challenge's user based on criteria
263-
* @param {Array} usersInfo user object array
264-
* @param {Array} filterCriteria on roles
263+
* @param {Array} usersInfo user object array
264+
* @param {Array} filterOnRoles on roles
265+
* @param {Array} filterOnUsers on user's ids
265266
*
266267
* @returns {Array} of user object
267268
*/
268-
function filterChallengeUsers(usersInfo, filterCriteria = []) {
269-
let users = []
270-
let totaleRoles = []
269+
function filterChallengeUsers(usersInfo, filterOnRoles = [], filterOnUsers = []) {
270+
const users = [] // filtered users
271+
const rolesAvailable = [] // available roles in challenge api response
271272
_.map(usersInfo, (user) => {
272-
let userId = _.get(user, 'properties.External Reference ID')
273-
let role = _.get(user, 'role')
274-
totaleRoles[role] = 1
275-
if (filterCriteria.length > 0 && _.indexOf(filterCriteria, role) >= 0) {
273+
const userId = parseInt(_.get(user, 'properties.External Reference ID'))
274+
const role = _.get(user, 'role')
275+
276+
_.indexOf(rolesAvailable, role) == -1 ? rolesAvailable.push(role) : ''
277+
278+
if (filterOnRoles.length > 0 && _.indexOf(filterOnRoles, role) >= 0) {
276279
users.push({ userId: userId })
277-
} else if (filterCriteria.length == 0) {
280+
} else if (filterOnUsers.length > 0 && _.indexOf(filterOnUsers, userId) >= 0) {
281+
users.push({ userId: userId }) /** Submitter only case */
282+
} else if (filterOnRoles.length == 0 && filterOnUsers.length == 0) {
278283
users.push({ userId: userId })
279284
}
280285
})
281-
logger.info(`Total roles availables in this challenge are: ${_.keys(totaleRoles).join(',')}`)
286+
logger.info(`Total roles available in this challenge are: ${rolesAvailable.join(',')}`)
282287
return users
283288
}
284289

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* Challenge submission general handler.
3+
*/
4+
const co = require('co');
5+
const service = require('../../services/SubmissionService');
6+
7+
/**
8+
* Handle Kafka JSON message of autopilot.
9+
*
10+
* @param {Object} message the Kafka JSON message
11+
* @param {Object} ruleSets
12+
*
13+
* @return {Promise} promise resolved to notifications
14+
*/
15+
const handle = (message, ruleSets) => co(function* () {
16+
return yield service.handle(message, ruleSets);
17+
});
18+
19+
module.exports = {
20+
handle,
21+
};

src/processors/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ const ChallengeCreatedHandler = require('./challenge/ChallengeCreatedHandler');
77
const ChallengePhaseWarningHandler = require('./challenge/ChallengePhaseWarningHandler');
88
const ChallengeHandler = require('./challenge/ChallengeHandler');
99
const AutoPilotHandler = require('./challenge/AutoPilotHandler')
10+
const SubmissionHandler = require('./challenge/SubmissionHandler')
1011

1112
// Exports
1213
module.exports = {
1314
handleChallengeCreated: ChallengeCreatedHandler.handle,
1415
handleChallengePhaseWarning: ChallengePhaseWarningHandler.handle,
1516
handleChallenge: ChallengeHandler.handle,
1617
handleAutoPilot: AutoPilotHandler.handle,
18+
handleSubmission: SubmissionHandler.handle,
1719
};

src/services/ChallengeService.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ function* handle(message, ruleSets) {
2020
if (message.payload.type === _.get(ruleSets, "type")) {
2121
const challengeId = message.payload.data.id
2222
const usersInfo = yield tcApiHelper.getUsersInfoFromChallenge(challengeId)
23-
const filerOnRoles = _.get(ruleSets, "roles")
24-
const users = tcApiHelper.filterChallengeUsers(usersInfo, filerOnRoles)
25-
logger.info(`Successfully filetered ${users.length} users on rulesets ${JSON.stringify(filerOnRoles)} `)
23+
const filterOnRoles = _.get(ruleSets, "roles")
24+
const users = tcApiHelper.filterChallengeUsers(usersInfo, filterOnRoles)
25+
logger.info(`Successfully filetered ${users.length} users on rulesets ${JSON.stringify(filterOnRoles)} `)
2626
// notify users of message
2727
return yield tcApiHelper.notifyUsersOfMessage(users, message);
2828
}

src/services/SubmissionService.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* Submission general handler service.
3+
*/
4+
5+
'use strict';
6+
7+
const joi = require('joi');
8+
const _ = require('lodash')
9+
const logger = require('../common/logger');
10+
const tcApiHelper = require('../common/tcApiHelper');
11+
12+
/**
13+
* Handle submission message
14+
* @param {Object} message the Kafka message
15+
* @param {Object} ruleSets
16+
* @returns {Array} the notifications
17+
*/
18+
function* handle(message, ruleSets) {
19+
20+
if (message.payload.resource === _.get(ruleSets, "resource")) {
21+
const challengeId = message.payload.challengeId
22+
const usersInfo = yield tcApiHelper.getUsersInfoFromChallenge(challengeId)
23+
24+
const filterOnUsers = []
25+
if (_.get(ruleSets, 'selfOnly')) {
26+
const memberId = _.get(message.payload, "memberId")
27+
filterOnUsers.push(memberId)
28+
}
29+
const filterOnRoles = _.get(ruleSets, "roles")
30+
const users = tcApiHelper.filterChallengeUsers(usersInfo, filterOnRoles, filterOnUsers)
31+
logger.info(`Successfully filetered ${users.length} users on rulesets ${JSON.stringify(filterOnRoles)} `)
32+
// notify users of message
33+
return yield tcApiHelper.notifyUsersOfMessage(users, message);
34+
}
35+
return {}
36+
}
37+
38+
handle.schema = {
39+
message: joi.object().keys({
40+
topic: joi.string().required(),
41+
originator: joi.string().required(),
42+
timestamp: joi.date().required(),
43+
'mime-type': joi.string().required(),
44+
payload: joi.object().keys({
45+
resource: joi.string().required()
46+
}).unknown(true).required(),
47+
}).required(),
48+
ruleSets: joi.object()
49+
}
50+
51+
// Exports
52+
module.exports = {
53+
handle,
54+
}
55+
56+
logger.buildService(module.exports);

0 commit comments

Comments
 (0)