Skip to content

Commit 337e95f

Browse files
committed
Expose Client and MailService classes, document use cases
1 parent 13055d6 commit 337e95f

File tree

10 files changed

+333
-261
lines changed

10 files changed

+333
-261
lines changed

packages/client/README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ const request = {
5454
};
5555
client.request(request)
5656
.then(([response, body]) => {
57-
console.log(response.statusCode);
58-
console.log(response.body);
57+
console.log(response.statusCode);
58+
console.log(body);
5959
})
6060
```
6161

@@ -76,6 +76,15 @@ You can overwrite the promise implementation you want the client to use. Default
7676
global.Promise = require('bluebird');
7777
```
7878

79+
## Instantiate Client Instances Manually
80+
```js
81+
const {Client} = require('@sendgrid/client');
82+
const sgClient1 = new Client();
83+
const sgClient2 = new Client();
84+
sgClient1.setApiKey('KEY1');
85+
sgClient2.setApiKey('KEY2');
86+
```
87+
7988
<a name="announcements"></a>
8089
# Announcements
8190

packages/client/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
const client = require('./src/client');
4+
const Client = require('./src/classes/client');
5+
6+
module.exports = client;
7+
module.exports.Client = Client;

packages/client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"publishConfig": {
2323
"access": "public"
2424
},
25-
"main": "src/client.js",
25+
"main": "index.js",
2626
"engines": {
2727
"node": ">=6.0.0"
2828
},

packages/client/src/classes/client.js

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
'use strict';
2+
3+
/**
4+
* Dependencies
5+
*/
6+
const http = require('request');
7+
const pkg = require('../../package.json');
8+
const {
9+
helpers: {
10+
mergeData,
11+
},
12+
classes: {
13+
ResponseError,
14+
},
15+
} = require('@sendgrid/helpers');
16+
17+
/**
18+
* Sendgrid REST Client
19+
*/
20+
class Client {
21+
22+
/**
23+
* Constructor
24+
*/
25+
constructor() {
26+
27+
//API key
28+
this.apiKey = '';
29+
30+
//Default headers
31+
this.defaultHeaders = {
32+
'Accept': 'application/json',
33+
'User-agent': 'sendgrid/' + pkg.version + ';nodejs',
34+
};
35+
36+
//Empty default request
37+
this.defaultRequest = {
38+
json: true,
39+
baseUrl: 'https://api.sendgrid.com/',
40+
url: '',
41+
method: 'GET',
42+
headers: {},
43+
};
44+
}
45+
46+
/**
47+
* Set API key
48+
*/
49+
setApiKey(apiKey) {
50+
this.apiKey = apiKey;
51+
}
52+
53+
/**
54+
* Set default header
55+
*/
56+
setDefaultHeader(key, value) {
57+
this.defaultHeaders[key] = value;
58+
return this;
59+
}
60+
61+
/**
62+
* Set default request
63+
*/
64+
setDefaultRequest(key, value) {
65+
this.defaultRequest[key] = value;
66+
return this;
67+
}
68+
69+
/**
70+
* Create headers for request
71+
*/
72+
createHeaders(data) {
73+
74+
//Merge data with default headers
75+
const headers = mergeData(this.defaultHeaders, data);
76+
77+
//Add API key, but don't overwrite if header already set
78+
if (typeof headers.Authorization === 'undefined' && this.apiKey) {
79+
headers.Authorization = 'Bearer ' + this.apiKey;
80+
}
81+
82+
//Return
83+
return headers;
84+
}
85+
86+
/**
87+
* Create request
88+
*/
89+
createRequest(data) {
90+
91+
//Keep URL parameter consistent
92+
if (data.uri) {
93+
data.url = data.uri;
94+
delete data.uri;
95+
}
96+
97+
//Merge data with empty request
98+
const request = mergeData(this.defaultRequest, data);
99+
100+
//Add headers
101+
request.headers = this.createHeaders(request.headers);
102+
return request;
103+
}
104+
105+
/**
106+
* Do a request
107+
*/
108+
request(data, cb) {
109+
110+
//Create request
111+
const request = this.createRequest(data);
112+
113+
//Perform request
114+
const promise = new Promise((resolve, reject) => {
115+
http(request, (error, response, body) => {
116+
117+
//Request error
118+
if (error) {
119+
return reject(error);
120+
}
121+
122+
//Response error
123+
if (response.statusCode >= 400) {
124+
return reject(new ResponseError(response));
125+
}
126+
127+
//Successful response
128+
resolve([response, body]);
129+
});
130+
});
131+
132+
//Execute callback if provided
133+
if (cb) {
134+
promise
135+
.then(result => cb(null, result))
136+
.catch(error => cb(error, null));
137+
}
138+
139+
//Return promise
140+
return promise;
141+
}
142+
}
143+
144+
//Export class
145+
module.exports = Client;

packages/client/src/client.js

Lines changed: 1 addition & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -3,143 +3,7 @@
33
/**
44
* Dependencies
55
*/
6-
const http = require('request');
7-
const pkg = require('../package.json');
8-
const {
9-
helpers: {
10-
mergeData,
11-
},
12-
classes: {
13-
ResponseError,
14-
},
15-
} = require('@sendgrid/helpers');
16-
17-
/**
18-
* Sendgrid REST Client
19-
*/
20-
class Client {
21-
22-
/**
23-
* Constructor
24-
*/
25-
constructor() {
26-
27-
//API key
28-
this.apiKey = '';
29-
30-
//Default headers
31-
this.defaultHeaders = {
32-
'Accept': 'application/json',
33-
'User-agent': 'sendgrid/' + pkg.version + ';nodejs',
34-
};
35-
36-
//Empty default request
37-
this.defaultRequest = {
38-
json: true,
39-
baseUrl: 'https://api.sendgrid.com/',
40-
url: '',
41-
method: 'GET',
42-
headers: {},
43-
};
44-
}
45-
46-
/**
47-
* Set API key
48-
*/
49-
setApiKey(apiKey) {
50-
this.apiKey = apiKey;
51-
}
52-
53-
/**
54-
* Set default header
55-
*/
56-
setDefaultHeader(key, value) {
57-
this.defaultHeaders[key] = value;
58-
return this;
59-
}
60-
61-
/**
62-
* Set default request
63-
*/
64-
setDefaultRequest(key, value) {
65-
this.defaultRequest[key] = value;
66-
return this;
67-
}
68-
69-
/**
70-
* Create headers for request
71-
*/
72-
createHeaders(data) {
73-
74-
//Merge data with default headers
75-
const headers = mergeData(this.defaultHeaders, data);
76-
77-
//Add API key, but don't overwrite if header already set
78-
if (typeof headers.Authorization === 'undefined' && this.apiKey) {
79-
headers.Authorization = 'Bearer ' + this.apiKey;
80-
}
81-
82-
//Return
83-
return headers;
84-
}
85-
86-
/**
87-
* Create request
88-
*/
89-
createRequest(data) {
90-
91-
//Keep URL parameter consistent
92-
if (data.uri) {
93-
data.url = data.uri;
94-
delete data.uri;
95-
}
96-
97-
//Merge data with empty request
98-
const request = mergeData(this.defaultRequest, data);
99-
100-
//Add headers
101-
request.headers = this.createHeaders(request.headers);
102-
return request;
103-
}
104-
105-
/**
106-
* Do a request
107-
*/
108-
request(data, cb) {
109-
110-
//Create request
111-
const request = this.createRequest(data);
112-
113-
//Perform request
114-
const promise = new Promise((resolve, reject) => {
115-
http(request, (error, response, body) => {
116-
117-
//Request error
118-
if (error) {
119-
return reject(error);
120-
}
121-
122-
//Response error
123-
if (response.statusCode >= 400) {
124-
return reject(new ResponseError(response));
125-
}
126-
127-
//Successful response
128-
resolve([response, body]);
129-
});
130-
});
131-
132-
//Execute callback if provided
133-
if (cb) {
134-
promise
135-
.then(result => cb(null, result))
136-
.catch(error => cb(error, null));
137-
}
138-
139-
//Return promise
140-
return promise;
141-
}
142-
}
6+
const Client = require('./classes/client');
1437

1448
//Export singleton instance
1459
module.exports = new Client();

packages/mail/USE_CASES.md

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ This documentation provides examples for specific email use cases. Please [open
1515
* [Specifying Time to Send At](#timetosend)
1616
* [Specifying Custom Headers](#customheaders)
1717
* [Specifying Categories](#categories)
18+
* [Managing multiple API keys](#multipleapikeys)
1819
* [Kitchen Sink - an example with all settings used](#kitchensink)
1920

2021
<a name="singleemailsinglerecipient"></a>
@@ -209,13 +210,13 @@ Template Body:
209210
<title></title>
210211
</head>
211212
<body>
212-
Hello -name-,
213+
Hello {{name}},
213214
<br /><br/>
214215
I'm glad you are trying out the template feature!
215216
<br /><br/>
216217
<%body%>
217218
<br /><br/>
218-
I hope you are having a great day in -city- :)
219+
I hope you are having a great day in {{city}} :)
219220
<br /><br/>
220221
</body>
221222
</html>
@@ -405,6 +406,27 @@ const msg = {
405406
};
406407
```
407408

409+
<a name="multipleapikeys"></a>
410+
## Managing multiple API keys
411+
412+
In cases where you need to manage multiple instances of the mailer (or underlying client),
413+
for example when you are using multiple API keys, you can import the mail service class and
414+
instantiate new instances as required:
415+
416+
```js
417+
const {MailService} = require('@sendgrid/mail');
418+
419+
//Instantiate mailers
420+
const sgMail1 = new MailService();
421+
const sgMail2 = new MailService();
422+
423+
//Set different API keys
424+
sgMail1.setApiKey('KEY1');
425+
sgMail2.setApiKey('KEY2');
426+
427+
//Now send emails with the mailers as per the usual
428+
```
429+
408430
<a name="kitchensink"></a>
409431
## Kitchen Sink - an example with all settings used
410432

@@ -455,4 +477,4 @@ sgMail
455477
.send(msg)
456478
.then(() => console.log('Mail sent successfully'))
457479
.catch(error => console.error(error.toString()));
458-
```
480+
```

0 commit comments

Comments
 (0)