-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
132 lines (107 loc) · 3.26 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
'use strict';
/**
* @name byteskode-sms-callback
* @description byteskode infobip sms deliveries & track callback
* @singleton
*/
//dependencies
var _ = require('lodash');
var SMS = require('byteskode-sms');
var Utils = require('byteskode-sms/lib/utils');
var config = require('config');
var express = require('express');
var router = express.Router();
//prepare configurations
//obtain configuration from config
var _config = config.has('sms') ? config.get('sms') : {};
//merge default configurations
_config = _.merge({}, {
callback: {
deliveries: '/sms-deliveries',
},
models: {
sms: {
name: 'SMS',
},
message: {
name: 'SMSMessage',
}
}
}, _config);
//deduce sms deliveries & tracking callback url
var deliveriesPath = _config.callback.deliveries;
//obtain SMS and Message model
var Message = SMS.Message;
/**
* @name handle
* @description handle deliveries and tracking reports
* @param {Request} request valid express http request
* @param {Function} done a callback to invoke on success or error
* @return {Object}
*/
function handle(request, done) {
//grab sms _id
var source = (request.query || {}).source;
//back of if source is tempered on not available
if (_.isEmpty(source)) {
return done(new Error('Invalid source'));
}
//ensure delivery or tracking report provided
var hasNoDeliveryReport =
request &&
_.isEmpty(request.body) &&
(_.isEmpty(request.body.results) || _.isEmpty(request.body.messages));
if (hasNoDeliveryReport) {
return done(new Error('Missing delivery report'));
}
//obtain message responses from the report
var responses = Utils.normalize(request.body);
Message.updateStatuses(responses, function(error, updates) {
if (error) {
Message.emit('sms:deliveries:error', error);
return done(new Error('Unprocessed delivery report'));
} else {
Message.emit('sms:deliveries', updates);
return done(null, _.compact(updates));
}
});
}
/**
* Handle Http POST on sms callback path
* @description process received sms deliveries & tracking reports
* @param {HttpRequest} request a http request
* @param {HttpResponse} response a http response
*/
router.post(deliveriesPath, function(request, response) {
handle(request, function(error, result) {
if (error) {
response.status(error.status || 400);
response.json({
success: false,
message: error.message
});
} else {
response.json(result);
}
});
});
/**
* Handle Http PUT on sms callback path
* @description process received sms deliveries & tracking reports
* @param {HttpRequest} request a http request
* @param {HttpResponse} response a http response
*/
router.put(deliveriesPath, function(request, response) {
handle(request, function(error, result) {
if (error) {
response.status(error.status || 400);
response.json({
success: false,
message: error.message
});
} else {
response.json(result);
}
});
});
module.exports = exports = router;