Skip to content

Commit 66d7c8c

Browse files
authored
refactor(examples): refactor README.md, examples, .travis.yml (#7)
* docs(README): refactor links * fix(Sns): export Sns.js * fix(package): fix path to main file * refactor(examples): rename 'with_db' to 'with_mongoose' * refactor(examples): add 'try/catch' to 'retry_another' * refactor(Sns): remove Promises, make stubs for unsupported methods * test(Sns): move mock of 'Sns.sendSms()' to test * test(Smsc): remove credentials of test account of SMSC * refactor: remove git_deploy_key.enc * refactor(examples): refactor 'by_regexp' * docs(README): update example, add 'API' * ci(travis): fix .travis.yml * refactor: fix Flow issues, refactor examples
1 parent c8ea5f9 commit 66d7c8c

File tree

13 files changed

+83
-125
lines changed

13 files changed

+83
-125
lines changed

.travis.yml

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ node_js:
1111
- "8"
1212
before_install:
1313
- yarn global add greenkeeper-lockfile@1
14-
- openssl aes-256-cbc -K $encrypted_07079be19108_key -iv $encrypted_07079be19108_iv -in git_deploy_key.enc -out /tmp/git_deploy_key -d
15-
- chmod 600 /tmp/git_deploy_key
16-
- echo 'echo ${SSH_PASSPHRASE}' > /tmp/askpass && chmod +x /tmp/askpass
17-
- eval "$(ssh-agent -s)"
18-
- DISPLAY=":0.0" SSH_ASKPASS="/tmp/askpass" setsid ssh-add /tmp/git_deploy_key </dev/null
14+
1915
before_script: greenkeeper-lockfile-update
2016
after_script: greenkeeper-lockfile-upload
2117
script:

README.md

+19-15
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ This is a wrapper for [AWS.SNS](https://aws.amazon.com/sns/) and [SMSC API](http
1818
yarn add @frankast/sms-sender
1919
```
2020

21-
## Examples
21+
## API
2222

2323
There are two providers `Smsc.js` (default) and `Sns.js`. If you want to use `Sns.js` do not forget to add `aws-sdk` optional dependency.
2424

25+
26+
#### Sending SMS
2527
To send an SMS you have to create an instance of provider and call `sendSms()` method:
2628

2729
```js
@@ -39,6 +41,7 @@ const response = await smsc.sendSms('phone_number', 'message');
3941
// response = { messageId: 'id-phone_number', rawResponse: { cnt: 1, id: 50 }}
4042
```
4143

44+
#### Get delivery status of SMS
4245
To check the delivery status of SMS call `getStatus()` method:
4346

4447
```js
@@ -68,6 +71,7 @@ const response = await smsc.getStatus('40-77718637484'); // takes messageId (id-
6871

6972
P.S. You can get status codes [here](https://github.com/FrankAst/sms-sender/blob/3946a34f0d68369914e1ac6c180cc2a5948b718d/src/transporters/Smsc.js#L49) or in [SMSC docs](https://smsc.kz/api/http/status_messages/statuses/#menu).
7073

74+
#### Get cost of SMS
7175
To get a cost of SMS call `getCost()` method:
7276

7377
```js
@@ -77,6 +81,7 @@ const response = await smsc.getCost('phone_number','message');
7781
// response = { cost: '0', rawResponse: { cnt: 1, cost: '25' } };
7882
```
7983

84+
#### Get current balance
8085
To get the current balance on your account call `getBalance()` method:
8186

8287
```js
@@ -86,6 +91,7 @@ To get the current balance on your account call `getBalance()` method:
8691
// response = { balance: '84.75', currency: 'KZT' };
8792
```
8893

94+
## Examples
8995
Here is an example of usage with RegExp:
9096

9197
```js
@@ -100,31 +106,29 @@ const providers = {
100106
password: '',
101107
}),
102108

103-
// put here or in ~/.aws/credentials
104109
sns: new Sns({
105110
region: '',
106111
accessKeyId: '',
107112
secretAccessKey: '',
108113
}),
109114
};
110115

111-
function getProvider(providerName: string, defaultName?: string = 'smsc'): any {
112-
const regexp = RegExp(providerName, 'g');
116+
async function send(phone: string, message: string): Promise<Object> {
117+
const regexp = RegExp('7708', 'g');
113118
let provider;
114-
Object.keys(providers).forEach(name => {
115-
if (regexp.test(name)) {
116-
provider = providers[name];
117-
} else {
118-
provider = providers[defaultName];
119-
}
120-
});
121-
122-
return provider;
119+
if (regexp.test(phone)) {
120+
provider = providers.smsc;
121+
} else {
122+
provider = providers.sns;
123+
}
124+
const res = await provider.sendSms(phone, message);
125+
return res;
123126
}
124127

125-
const provider = getProvider('sm');
128+
send('+77081113344', 'hello world').then(res => {
129+
console.log(res);
130+
});
126131

127-
provider.sendSms('77718637484', 'test').then(res => console.log(res));
128132

129133
```
130134

examples/by_regexp/index.js

+10-14
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,18 @@ const providers = {
1818
}),
1919
};
2020

21-
function getProvider(providerName: string, defaultName?: string = 'smsc'): any {
22-
const regexp = RegExp(providerName, 'g');
21+
async function send(phone: string, message: string): Promise<Object> {
22+
const regexp = RegExp('7708', 'g');
2323
let provider;
24-
Object.keys(providers).forEach(name => {
25-
if (regexp.test(name)) {
26-
provider = providers[name];
27-
} else {
28-
provider = providers[defaultName];
29-
}
30-
});
31-
32-
return provider;
24+
if (regexp.test(phone)) {
25+
provider = providers.smsc;
26+
} else {
27+
provider = providers.sns;
28+
}
29+
const res = await provider.sendSms(phone, message);
30+
return res;
3331
}
3432

35-
const provider = getProvider('sm');
36-
37-
provider.sendSms('77718637484', 'test').then(res => {
33+
send('+77081113344', 'hello world').then(res => {
3834
console.log(res);
3935
});

examples/retry_another/index.js

+14-22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// @flow
2-
32
/* eslint-disable no-console */
43

54
import Smsc from '../../src/transporters/Smsc';
@@ -19,31 +18,24 @@ const providers = {
1918
}),
2019
};
2120

22-
async function retryAnother(phone: string, message: string, providerName: string): Promise<any> {
23-
let provider = providers.smsc;
24-
Object.keys(providers).forEach(name => {
25-
if (name !== providerName) {
26-
provider = providers[name];
27-
}
28-
});
29-
30-
const res = await provider.sendSms(phone, message);
31-
return res;
32-
}
33-
3421
async function send(phone: string, message: string, providerName: string): Promise<any> {
35-
const provider = providers[providerName];
36-
37-
const res = await provider.sendSms('77718637484', 'test');
38-
const { messageId } = res;
39-
const status = await provider.getStatus(messageId);
40-
if (status === 'ok') {
22+
let provider;
23+
try {
24+
provider = providers[providerName];
25+
const res = await provider.sendSms('77718637484', 'test');
26+
return res;
27+
} catch (e) {
28+
Object.keys(providers).forEach(key => {
29+
if (providerName !== key) {
30+
provider = providers[key];
31+
}
32+
});
33+
if (!provider) throw new Error(e);
34+
const res = await provider.sendSms('77718637484', 'test');
4135
return res;
4236
}
43-
const res2 = await retryAnother(phone, message, providerName);
44-
return res2;
4537
}
4638

47-
send('77718637484', 'with_db', 'smsc').then(res => {
39+
send('77718637484', 'with_mongoose', 'smsc').then(res => {
4840
console.log(res);
4941
});

examples/with_db/index.js examples/with_mongoose/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import { Sms } from './schema/Sms';
77

88
import DB from './schema/db';
99

10-
// put here your mongo connection
10+
// don't forget to put your mongo connection string here
1111
DB.init('MONGO_CONNECTION_STRING');
1212

13-
// don't forget to put your credentials
13+
// don't forget to put your credentials here
1414
const providers = {
1515
smsc: new Smsc({
1616
login: '',

examples/with_db/schema/Sms.js examples/with_mongoose/schema/Sms.js

+13-8
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,13 @@ export class SmsDoc /* :: extends Mongoose$Document */ {
5757
rawResponse: mixed;
5858

5959
static _providers: ProvidersT;
60-
static _providerDefault: string = 'smsc';
60+
static _providerDefault: string = '';
6161

62-
static setProviders(providers: ProvidersT, providerDefault: string) {
62+
static setProviders(providers: ProvidersT) {
6363
this._providers = providers;
64+
}
65+
66+
static setDefaultProvider(providerDefault: string) {
6467
this._providerDefault = providerDefault;
6568
}
6669

@@ -69,12 +72,14 @@ export class SmsDoc /* :: extends Mongoose$Document */ {
6972
let provider;
7073

7174
if (!providerName) {
72-
provider = _providers[_providerDefault];
73-
if (!provider)
74-
throw new Error(
75-
`Cannot find provider: ${_providerDefault} in providers!\n
76-
Please specify correct default provider.`
77-
);
75+
if (_providerDefault) {
76+
provider = _providers[_providerDefault];
77+
} else {
78+
// $FlowFixMe
79+
provider = _providers[0];
80+
}
81+
82+
if (!provider) throw new Error(`You shold specify at least one: provider or providerDefault`);
7883
} else {
7984
provider = _providers[providerName];
8085
if (!provider) throw new Error(`Cannot find provider: ${providerName} in providers!`);
File renamed without changes.

git_deploy_key.enc

-3.25 KB
Binary file not shown.

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@frankast/sms-sender",
33
"main": "lib/index.js",
44
"version": "0.0.0-semantically-released",
5-
"description": "This is a wrapper for SMSC API & AWS in Node.js",
5+
"description": "This is a wrapper for AWS.SNS & SMSC API in Node.js",
66
"files": [
77
"lib"
88
],
@@ -70,8 +70,8 @@
7070
]
7171
},
7272
"scripts": {
73-
"demo-db": "./node_modules/.bin/babel-node ./examples/with_db/index.js",
74-
"demo-regexp": "./node_modules/.bin/babel-node ./examples/by_regexp/index.js",
73+
"demo-with-mongoose": "./node_modules/.bin/babel-node ./examples/with_mongoose/index.js",
74+
"demo-by-regexp": "./node_modules/.bin/babel-node ./examples/by_regexp/index.js",
7575
"demo-retry-another": "./node_modules/.bin/babel-node ./examples/retry_another/index.js",
7676
"build": "npm run build-cjs && npm run build-flow",
7777
"build-cjs": "rimraf lib && babel src --ignore __tests__,__mocks__,__fixtures__ -d lib",

src/transporters/Sns.js

+4-30
Original file line numberDiff line numberDiff line change
@@ -62,44 +62,18 @@ export default class Sns implements ProviderI {
6262
return 'sns';
6363
}
6464

65-
// AWS.SDK DOES NOT PROVIDE THE WAYS TO IMPLEMENTS THESE METHODS
66-
6765
// eslint-disable-next-line
68-
async getCost(phone: string, message: string): Promise<GetCostResponseT> {
69-
return new Promise(resolve => {
70-
resolve({ cost: '0', rawResponse: { cnt: 1, cost: '0' } });
71-
});
66+
async getCost(phone: string, message: string): Promise<GetCostResponseT> {
67+
throw new Error(`AWS.SNS does not support getting cost via 'aws-sdk'`);
7268
}
7369

7470
// eslint-disable-next-line
7571
async getStatus(messageId: string): Promise<GetStatusResponseT> {
76-
return new Promise(resolve => {
77-
resolve({
78-
rawResponse: {
79-
cost: '0.00',
80-
country: 'Казахстан',
81-
last_date: '13.03.2018 15:50:50',
82-
last_timestamp: 1520934650,
83-
message: 'hello',
84-
operator: 'Beeline',
85-
phone: '77718637484',
86-
region: '',
87-
send_date: '13.03.2018 15:50:46',
88-
send_timestamp: 1520934646,
89-
sender_id: 'SMS-CENTRE',
90-
status: 1,
91-
status_name: 'Доставлено',
92-
type: 0,
93-
},
94-
status: 'ok',
95-
});
96-
});
72+
throw new Error(`AWS.SNS does not support getting status via 'aws-sdk'`);
9773
}
9874

9975
// eslint-disable-next-line
10076
async getBalance(): Promise<GetBalanceResponseT> {
101-
return new Promise(resolve => {
102-
resolve({ balance: '84.75', rawResponse: { balance: '84.75', currency: 'KZT' } });
103-
});
77+
throw new Error(`AWS.SNS does not support getting balance via 'aws-sdk'`);
10478
}
10579
}

src/transporters/__mocks__/Sns.js

-17
This file was deleted.

src/transporters/__tests__/Smsc-test.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import fetchMock from 'fetch-mock';
44
import Smsc from '../Smsc';
55

66
describe('Smsc', () => {
7-
const login = 'test_dev_kz';
8-
const password = 'test_dev_kz123';
7+
const login = 'SMSC_LOGIN';
8+
const password = 'SMSC_PASSWORD';
99
const smsc = new Smsc({ login, password });
1010

1111
beforeEach(() => {
@@ -15,7 +15,7 @@ describe('Smsc', () => {
1515
// send message
1616
it('sendSms', async () => {
1717
fetchMock.mock({
18-
matcher: `http://smsc.ru/sys/send.php?login=test_dev_kz&psw=test_dev_kz123&phones=77718637484&mes=%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D0%B8%D1%82&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
18+
matcher: `http://smsc.ru/sys/send.php?login=SMSC_LOGIN&psw=SMSC_PASSWORD&phones=77718637484&mes=%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D0%B8%D1%82&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
1919
response: { cnt: 1, id: 50 },
2020
});
2121

@@ -26,7 +26,7 @@ describe('Smsc', () => {
2626
// get cost of message sending
2727
it('getCost', async () => {
2828
fetchMock.mock({
29-
matcher: `http://smsc.ru/sys/send.php?login=test_dev_kz&psw=test_dev_kz123&cost=1&phones=77718637484&mes=hello&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
29+
matcher: `http://smsc.ru/sys/send.php?login=SMSC_LOGIN&psw=SMSC_PASSWORD&cost=1&phones=77718637484&mes=hello&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
3030
response: { cnt: 1, cost: '0' },
3131
});
3232

@@ -37,7 +37,7 @@ describe('Smsc', () => {
3737
// get status of message with full information
3838
it('getStatus', async () => {
3939
fetchMock.mock({
40-
matcher: `http://smsc.ru/sys/status.php?login=test_dev_kz&psw=test_dev_kz123&id=40&phone=77718637484&all=2&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
40+
matcher: `http://smsc.ru/sys/status.php?login=SMSC_LOGIN&psw=SMSC_PASSWORD&id=40&phone=77718637484&all=2&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
4141
response: {
4242
cost: '0.00',
4343
country: 'Казахстан',
@@ -82,7 +82,7 @@ describe('Smsc', () => {
8282
// get current balance
8383
it('getBalance', async () => {
8484
fetchMock.mock({
85-
matcher: `http://smsc.ru/sys/balance.php?login=test_dev_kz&psw=test_dev_kz123&cur=1&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
85+
matcher: `http://smsc.ru/sys/balance.php?login=SMSC_LOGIN&psw=SMSC_PASSWORD&cur=1&tinyurl=1&charset=utf-8&translit=1&fmt=3`,
8686
response: { balance: '84.75', currency: 'KZT' },
8787
});
8888

src/transporters/__tests__/Sns-test.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22

33
import Sns from '../Sns';
44

5-
jest.mock('../Sns');
5+
const sns = new Sns({ region: 'eu-west-1' });
6+
// $FlowFixMe
7+
sns.sendSms = jest.fn().mockImplementation(() => {
8+
return {
9+
messageId: '8e1e071f-a27d-55db-8ba9-542c4f9c8a73',
10+
rawResponse: {
11+
MessageId: '8e1e071f-a27d-55db-8ba9-542c4f9c8a73',
12+
ResponseMetadata: { RequestId: '919bdf65-2969-5a03-ae88-8c56c48825ab' },
13+
},
14+
};
15+
});
616

717
describe('Sns', () => {
8-
const sns = new Sns({ region: 'eu-west-1' });
9-
1018
// send message
1119
it('sendSms', async () => {
1220
const res = await sns.sendSms('+77081949582', 'Hi');

0 commit comments

Comments
 (0)