Skip to content

Commit 9d3ed96

Browse files
author
Sachin Maheshwari
committed
adding functions to decide recipient condition.
1 parent 6e80a00 commit 9d3ed96

File tree

3 files changed

+157
-58
lines changed

3 files changed

+157
-58
lines changed

src/common/broadcastAPIHelper.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/**
2+
*
3+
*/
4+
5+
const _ = require('lodash')
6+
const config = require('config')
7+
const request = require('superagent')
8+
const logger = require('./logger')
9+
const m2mAuth = require('tc-core-library-js').auth.m2m;
10+
const m2m = m2mAuth(config);
11+
12+
const logPrefix = "BroadcastAPI: "
13+
14+
async function getM2MToken() {
15+
return m2m.getMachineToken(config.AUTH0_CLIENT_ID, config.AUTH0_CLIENT_SECRET)
16+
}
17+
18+
async function getMemberInfo(userId) {
19+
const url = config.TC_API_V3_BASE_URL +
20+
`/members/_search/?fields=userId%2Cskills&query=userId%3A${userId}&limit=1`
21+
return new Promise(function (resolve, reject) {
22+
let memberInfo = []
23+
logger.info(`calling member api ${url} `)
24+
request
25+
.get(url).then((res) => {
26+
if (!_.get(res, 'body.result.success')) {
27+
reject(new Error(`Failed to get member api detail for user id ${userId}`))
28+
}
29+
memberInfo = _.get(res, 'body.result.content')
30+
logger.info(`Feteched ${memberInfo.length} record(s) from member api`)
31+
resolve(memberInfo)
32+
})
33+
.catch((err) => {
34+
reject(new Error(`Failed to get member api detail for user id ${userId}, ${err}`))
35+
})
36+
37+
})
38+
// Need clean-up
39+
/*const m2m = await getM2MToken().catch((err) => {
40+
logger.error(`${logPrefix} Failed to get m2m token`)
41+
return new Promise(function(res, rej) {
42+
rej(err)
43+
})
44+
})
45+
logger.info(`${logPrefix} Fetched m2m token sucessfully. Token length is: `, m2m.length)
46+
*/
47+
//return request.get(url)
48+
}
49+
50+
async function checkBroadcastMessageForUser(userId, bulkMessage) {
51+
return new Promise(function (resolve, reject) {
52+
const skills = _.get(bulkMessage, 'recipients.skills')
53+
if (skills && skills.length > 0) {
54+
try {
55+
getMemberInfo(userId).then((m) => {
56+
let flag = false
57+
logger.info(`${logPrefix} got member info.`)
58+
const ms = _.get(m[0], "skills")
59+
const memberSkills = []
60+
_.map(ms, (o) => {
61+
memberSkills.push(_.get(o, 'name').toLowerCase())
62+
})
63+
logger.info(`${logPrefix} user id have following skills`, memberSkills)
64+
_.map(skills, (s) => {
65+
if (_.indexOf(memberSkills, s.toLowerCase()) >= 0) {
66+
flag = true;
67+
logger.info(`${logPrefix} '${s}' skill matached for user id ${userId}`)
68+
}
69+
})
70+
resolve(flag)
71+
}).catch((err) => {
72+
reject(err)
73+
})
74+
} catch (err) {
75+
reject(new Error(`${logPrefix} issue at skill condition check, ${err.message}`))
76+
}
77+
} else {
78+
resolve(true) // no condition on recipient, so for all
79+
}
80+
}) // promise end
81+
82+
}
83+
84+
module.exports = {
85+
checkBroadcastMessageForUser,
86+
}

src/hooks/hookBulkMessage.js

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -9,74 +9,86 @@ const _ = require('lodash')
99
//const errors = require('../common/errors')
1010
const logger = require('../common/logger')
1111
const models = require('../models')
12+
const api = require('../common/broadcastAPIHelper')
13+
1214
const logPrefix = "BulkNotificationHook: "
1315

1416
/**
1517
* CREATE NEW TABLES IF NOT EXISTS
1618
*/
17-
models.BulkMessages.sync().then((t)=> {
19+
models.BulkMessages.sync().then((t) => {
1820
models.BulkMessageUserRefs.sync()
1921
})
2022

2123
/**
2224
* Main function
2325
* @param {Integer} userId
2426
*/
25-
function checkBulkMessageForUser(userId) {
26-
models.BulkMessages.count().then(function (tBulkMessages) {
27-
if (tBulkMessages > 0) {
28-
// the condition can help to optimize the execution
29-
models.BulkMessageUserRefs.count({
30-
where: {
31-
user_id: userId
32-
}
33-
}).then(function (tUserRefs) {
34-
if (tUserRefs < tBulkMessages) {
35-
logger.info(`${logPrefix} Need to sync broadcast message for current user ${userId}`)
36-
syncBulkMessageForUser(userId)
37-
}
38-
}).catch((e) => {
39-
logger.error(`${logPrefix} Failed to check total userRefs condition. Error: `, e)
40-
})
41-
}
42-
}).catch((e) => {
43-
logger.error(`${logPrefix} Failed to check total broadcast message condition. Error: `, e)
27+
async function checkBulkMessageForUser(userId) {
28+
return new Promise(function (resolve, reject) {
29+
models.BulkMessages.count().then(function (tBulkMessages) {
30+
if (tBulkMessages > 0) {
31+
// the condition can help to optimize the execution
32+
models.BulkMessageUserRefs.count({
33+
where: {
34+
user_id: userId
35+
}
36+
}).then(async function (tUserRefs) {
37+
if (tUserRefs < tBulkMessages) {
38+
logger.info(`${logPrefix} Need to sync broadcast message for current user ${userId}`)
39+
syncBulkMessageForUser(userId).catch((e) => {
40+
reject(e)
41+
})
42+
}
43+
resolve(true) // resolve here
44+
}).catch((e) => {
45+
logger.error(`${logPrefix} Failed to check total userRefs condition. Error: `, e)
46+
reject(e)
47+
})
48+
} else {
49+
resolve(true)
50+
}
51+
}).catch((e) => {
52+
logger.error(`${logPrefix} Failed to check total broadcast message condition. Error: `, e)
53+
reject(e)
54+
})
4455
})
4556
}
4657

4758
/**
4859
* Helper function
4960
* @param {Integer} userId
5061
*/
51-
function syncBulkMessageForUser(userId) {
62+
async function syncBulkMessageForUser(userId) {
5263

53-
/**
54-
* Check if all bulk mesaages processed for current user or not
55-
*/
56-
let q = "SELECT a.* FROM bulk_messages AS a " +
57-
" LEFT OUTER JOIN (SELECT id as refid, bulk_message_id " +
58-
" FROM bulk_message_user_refs AS bmur WHERE bmur.user_id=$1)" +
59-
" AS b ON a.id=b.bulk_message_id WHERE b.refid IS NULL"
60-
models.sequelize.query(q, { bind: [userId] })
61-
.then(function (res) {
62-
_.map(res[0], async (r) => {
63-
logger.info(`${logPrefix} need to process for bulk message id: `, r.id)
64-
// call function to check if current user in reciepent group
65-
// insert row in userRef table
66-
if (isBroadCastMessageForUser(userId, r)) {
67-
// current user in reciepent group
68-
createNotificationForUser(userId, r)
69-
} else {
70-
/**
71-
* Insert row in userRef with notification-id null value
72-
* It means - broadcast message in not for current user
73-
*/
74-
insertUserRefs(userId, r.id, null)
75-
}
64+
return new Promise(function (resolve, reject) {
65+
/**
66+
* Check if all bulk mesaages processed for current user or not
67+
*/
68+
let q = "SELECT a.* FROM bulk_messages AS a " +
69+
" LEFT OUTER JOIN (SELECT id as refid, bulk_message_id " +
70+
" FROM bulk_message_user_refs AS bmur WHERE bmur.user_id=$1)" +
71+
" AS b ON a.id=b.bulk_message_id WHERE b.refid IS NULL"
72+
models.sequelize.query(q, { bind: [userId] })
73+
.then(function (res) {
74+
_.map(res[0], (r) => {
75+
logger.info(`${logPrefix} need to process for bulk message id: `, r.id)
76+
isBroadCastMessageForUser(userId, r).then((result) => {
77+
if (result) {
78+
createNotificationForUser(userId, r)
79+
} else {
80+
insertUserRefs(userId, r.id, null)
81+
}
82+
}).catch((err) => {
83+
logger.error("failed in checking recipient group condition, Error:", err)
84+
})
85+
})
86+
resolve(true)
87+
}).catch((e) => {
88+
logger.error(`${logPrefix} Failed to check bulk message condition: `, e)
89+
reject(e)
7690
})
77-
}).catch((e) => {
78-
logger.error(`${logPrefix} Failed to check bulk message condition: `, err)
79-
})
91+
})
8092
}
8193

8294
/**
@@ -85,9 +97,8 @@ function syncBulkMessageForUser(userId) {
8597
* @param {Integer} userId
8698
* @param {Object} bulkMessage
8799
*/
88-
function isBroadCastMessageForUser(userId, bulkMessage) {
89-
// TODO
90-
return true;
100+
async function isBroadCastMessageForUser(userId, bulkMessage) {
101+
return api.checkBroadcastMessageForUser(userId, bulkMessage)
91102
}
92103

93104
/**
@@ -96,8 +107,8 @@ function isBroadCastMessageForUser(userId, bulkMessage) {
96107
* @param {Integer} bulkMessageId
97108
* @param {Integer} notificationId
98109
*/
99-
function insertUserRefs(userId, bulkMessageId, notificationId) {
100-
models.BulkMessageUserRefs.create({
110+
async function insertUserRefs(userId, bulkMessageId, notificationId) {
111+
await models.BulkMessageUserRefs.create({
101112
bulk_message_id: bulkMessageId,
102113
user_id: userId,
103114
notification_id: notificationId,
@@ -113,8 +124,8 @@ function insertUserRefs(userId, bulkMessageId, notificationId) {
113124
* @param {Integer} userId
114125
* @param {Object} bulkMessage
115126
*/
116-
function createNotificationForUser(userId, bulkMessage) {
117-
models.Notification.create({
127+
async function createNotificationForUser(userId, bulkMessage) {
128+
await models.Notification.create({
118129
userId: userId,
119130
type: bulkMessage.type,
120131
contents: {
@@ -126,9 +137,9 @@ function createNotificationForUser(userId, bulkMessage) {
126137
read: false,
127138
seen: false,
128139
version: null,
129-
}).then((n) => {
140+
}).then(async (n) => {
130141
logger.info(`${logPrefix} Inserted notification record ${n.id} for current user ${userId}`)
131-
insertUserRefs(userId, bulkMessage.id, n.id)
142+
await insertUserRefs(userId, bulkMessage.id, n.id)
132143
}).catch((err) => {
133144
logger.error(`${logPrefix} Error in inserting broadcast message `, err)
134145
})

src/services/NotificationService.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,10 @@ function* listNotifications(query, userId) {
204204
break;
205205
}
206206

207-
if (config.ENABLE_HOOK_BULK_NOTIFICATION){
208-
hooks.hookBulkMessage.checkBulkMessageForUser(userId)
207+
if (config.ENABLE_HOOK_BULK_NOTIFICATION) {
208+
yield hooks.hookBulkMessage.checkBulkMessageForUser(userId).catch((e) => {
209+
logger.info(`Issue in calling bulk notification hook.`, e)
210+
})
209211
}
210212

211213
if (_.keys(notificationSettings).length > 0) {

0 commit comments

Comments
 (0)