Commit 6abb33e39cacc42d658b089116d7970e302382d2
1 parent
1697d0840e
Exists in
master
Incoming SMS from with +
Showing 3 changed files with 14 additions and 2 deletions Inline Diff
lib/report-sender.js
1 | 'use strict'; | 1 | 'use strict'; |
2 | 2 | ||
3 | const request = require('request'); | 3 | const request = require('request'); |
4 | 4 | ||
5 | const config = require('komodo-sdk/config'); | 5 | const config = require('komodo-sdk/config'); |
6 | const logger = require('komodo-sdk/logger'); | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | ||
8 | function incomingSMS(message) { | 8 | function incomingSMS(message) { |
9 | if (!message || !config || !config.report_url || !config.report_url.incoming_sms) return; | 9 | if (!message || !config || !config.report_url || !config.report_url.incoming_sms) return; |
10 | 10 | ||
11 | if (!message.metadata) { | 11 | if (!message.metadata) { |
12 | const e = new Error('Missing metadata on incoming sms'); | 12 | const e = new Error('Missing metadata on incoming sms'); |
13 | e.smsObj = message; | 13 | e.smsObj = message; |
14 | throw e; | 14 | throw e; |
15 | } | 15 | } |
16 | 16 | ||
17 | if (!message.metadata.from) { | ||
18 | const e = new Error('Missing metadata.from on incoming sms'); | ||
19 | e.smsObj = message; | ||
20 | throw e; | ||
21 | } | ||
22 | |||
17 | if (!message.message) { | 23 | if (!message.message) { |
18 | const e = new Error('Missing message on incoming sms'); | 24 | const e = new Error('Missing message on incoming sms'); |
19 | e.smsObj = message; | 25 | e.smsObj = message; |
20 | throw e; | 26 | throw e; |
21 | } | 27 | } |
22 | 28 | ||
29 | if (message.metadata.from.indexOf('+') !== 0) { | ||
30 | logger.verbose('Do not send report on incoming message when sender does not start with "+".', { from: message.metadata.from, msg: message.message }); | ||
31 | return; | ||
32 | } | ||
33 | |||
23 | const requestOptions = { | 34 | const requestOptions = { |
24 | url: config.report_url.incoming_sms, | 35 | url: config.report_url.incoming_sms, |
25 | qs: { | 36 | qs: { |
26 | modem: config.name, | 37 | modem: config.name, |
27 | ts: message.metadata.ts, | 38 | ts: message.metadata.ts, |
28 | status: message.metadata.status, | 39 | status: message.metadata.status, |
29 | number: message.metadata.from, | 40 | number: message.metadata.from, |
30 | msg: message.message, | 41 | msg: message.message, |
31 | }, | 42 | }, |
32 | }; | 43 | }; |
33 | 44 | ||
34 | logger.info('Sending report via HTTP', requestOptions); | 45 | logger.info('Sending report via HTTP', requestOptions); |
35 | request(requestOptions, (err, res, body) => { | 46 | request(requestOptions, (err, res, body) => { |
36 | if (err) { | 47 | if (err) { |
37 | logger.warn(`Error sending report via HTTP. ${err.toString()}`); | 48 | logger.warn(`Error sending report via HTTP. ${err.toString()}`); |
38 | return; | 49 | return; |
39 | } | 50 | } |
40 | 51 | ||
41 | if (res.statusCode !== 200) { | 52 | if (res.statusCode !== 200) { |
42 | logger.warn(`Error sending report via HTTP. Server respond with HTTP status code ${res.statusCode}`, { http_status_code: res.statusCode, body }); | 53 | logger.warn(`Error sending report via HTTP. Server respond with HTTP status code ${res.statusCode}`, { http_status_code: res.statusCode, body }); |
43 | } | 54 | } |
44 | }); | 55 | }); |
45 | } | 56 | } |
46 | 57 | ||
47 | exports.incomingSMS = incomingSMS; | 58 | exports.incomingSMS = incomingSMS; |
48 | 59 |
lib/sms.js
1 | 'use strict'; | 1 | 'use strict'; |
2 | 2 | ||
3 | const moment = require('moment'); | 3 | const moment = require('moment'); |
4 | 4 | ||
5 | function extract(raw) { | 5 | function extract(raw) { |
6 | if (!raw) return null; | 6 | if (!raw) return null; |
7 | const lines = raw.trim().split(/[\n\r]+/m); | 7 | const lines = raw.trim().split(/[\n\r]+/m); |
8 | if (!lines) return null; | 8 | if (!lines) return null; |
9 | 9 | ||
10 | const result = { | 10 | const result = { |
11 | metadata: { | 11 | metadata: { |
12 | status: null, | 12 | status: null, |
13 | from: null, | 13 | from: null, |
14 | ts: null, | 14 | ts: null, |
15 | raw: null, | 15 | raw: null, |
16 | }, | 16 | }, |
17 | message: null, | 17 | message: null, |
18 | raw, | 18 | raw, |
19 | }; | 19 | }; |
20 | 20 | ||
21 | const metadata = lines[0].split(',').map(el => el.replace(/"/g, '')) || []; | 21 | const metadata = lines[0].split(',').map(el => el.replace(/"/g, '')) || []; |
22 | 22 | ||
23 | [result.metadata.raw] = lines; | 23 | [result.metadata.raw] = lines; |
24 | result.metadata.status = typeof metadata[0] === 'string' ? metadata[0].replace(/^.+: /, '') : ''; | 24 | result.metadata.status = typeof metadata[0] === 'string' ? metadata[0].replace(/^.+: /, '') : ''; |
25 | result.metadata.from = typeof metadata[1] === 'string' ? metadata[1].replace(/^\+/, '') : ''; | 25 | // result.metadata.from = typeof metadata[1] === 'string' ? metadata[1].replace(/^\+/, '') : ''; |
26 | result.metadata.from = metadata[1]; | ||
26 | 27 | ||
27 | const tsFromRaw = `${metadata[3]} ${(metadata[4] || '').replace(/\+\d+/, '')}`; | 28 | const tsFromRaw = `${metadata[3]} ${(metadata[4] || '').replace(/\+\d+/, '')}`; |
28 | result.metadata.ts = moment(tsFromRaw, 'YY/MM/DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss'); | 29 | result.metadata.ts = moment(tsFromRaw, 'YY/MM/DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss'); |
29 | 30 | ||
30 | result.message = lines.slice(1).join('\n').trim(); | 31 | result.message = lines.slice(1).join('\n').trim(); |
31 | return result; | 32 | return result; |
32 | } | 33 | } |
33 | 34 | ||
34 | exports.extract = extract; | 35 | exports.extract = extract; |
35 | 36 |
test/sms.js
1 | 'use strict'; | 1 | 'use strict'; |
2 | 2 | ||
3 | /* global describe it */ | 3 | /* global describe it */ |
4 | 4 | ||
5 | require('should'); | 5 | require('should'); |
6 | 6 | ||
7 | const sms = require('../lib/sms'); | 7 | const sms = require('../lib/sms'); |
8 | 8 | ||
9 | describe('#sms', () => { | 9 | describe('#sms', () => { |
10 | describe('#extract', () => { | 10 | describe('#extract', () => { |
11 | const raw = '+CMGR: "REC UNREAD","+6282210008543",,"19/07/26,13:21:16+28"\r\nsudah bisa?'; | 11 | const raw = '+CMGR: "REC UNREAD","+6282210008543",,"19/07/26,13:21:16+28"\r\nsudah bisa?'; |
12 | const messageParsed = sms.extract(raw); | 12 | const messageParsed = sms.extract(raw); |
13 | 13 | ||
14 | it('should return raw correctly', () => { | 14 | it('should return raw correctly', () => { |
15 | messageParsed.raw.should.equal(raw); | 15 | messageParsed.raw.should.equal(raw); |
16 | }); | 16 | }); |
17 | 17 | ||
18 | it('should return correct metadata', () => { | 18 | it('should return correct metadata', () => { |
19 | messageParsed.metadata.status.should.equal('REC UNREAD'); | 19 | messageParsed.metadata.status.should.equal('REC UNREAD'); |
20 | messageParsed.metadata.from.should.equal('6282210008543'); | 20 | messageParsed.metadata.from.should.equal('+6282210008543'); |
21 | messageParsed.metadata.ts.should.equal('2019-07-26 13:21:16'); | 21 | messageParsed.metadata.ts.should.equal('2019-07-26 13:21:16'); |
22 | }); | 22 | }); |
23 | 23 | ||
24 | it('should return correct message', () => { | 24 | it('should return correct message', () => { |
25 | messageParsed.message.should.equal('sudah bisa?'); | 25 | messageParsed.message.should.equal('sudah bisa?'); |
26 | }); | 26 | }); |
27 | }); | 27 | }); |
28 | }); | 28 | }); |
29 | 29 |