summaryrefslogtreecommitdiffstats
path: root/lib/sendgrid.js
blob: eb58f84dfb0fda9c2cf3fe1c5add0a642e9dc317 (plain)
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
/* eslint dot-notation: 'off' */
'use strict';

/**
 * Dependencies
 */
var pkg = require('./../package.json');
var sendgridRest = require('sendgrid-rest');
var emptyRequest = sendgridRest.emptyRequest;
var Client = sendgridRest.Client;
var SendGridError = require('./helpers/error');

/**
 * Helper to check if response is valid
 */
function isValidResponse(response) {
  return (
    response &&
    response.statusCode &&
    response.statusCode >= 200 &&
    response.statusCode <= 299
  );
}

/**
 * Helper to get a new empty request
 */
function getEmptyRequest(data) {
  var request = JSON.parse(JSON.stringify(emptyRequest));
  if (data && typeof data === 'object') {
    for (var key in data) {
      if (data.hasOwnProperty(key)) {
        request[key] = JSON.parse(JSON.stringify(data[key]));
      }
    }
  }
  return request;
}

/**
 * Helper to make headers
 */
function makeHeaders(apiKey, globalHeaders) {
  var headers = {};
  headers['Authorization'] = 'Bearer '.concat(apiKey);
  headers['Accept'] = 'application/json';
  headers['User-Agent'] = 'sendgrid/' + pkg.version + ';nodejs';
  if (globalHeaders) {
    for (var obj in globalHeaders) {
      if (globalHeaders.hasOwnProperty(obj) &&
        typeof globalHeaders[obj] === 'object') {
        for (var key in globalHeaders[obj]) {
          if (globalHeaders[obj].hasOwnProperty(key)) {
            headers[key] = globalHeaders[obj][key];
          }
        }
      }
    }
  }
  return headers;
}

/**
 * SendGrid allows for quick and easy access to the v3 Web API
 */
function SendGrid(apiKey, host, globalHeaders) {

  //Create global request
  var globalRequest = getEmptyRequest({
    host: host || 'api.sendgrid.com',
    headers: makeHeaders(apiKey, globalHeaders),
  });

  //Initialize new client
  var client = new Client(globalRequest);

  //Interact with the API with this function
  SendGrid.API = function(request, callback) {

    //If no callback provided, we will return a promise
    if (!callback) {
      if (!SendGrid.Promise) {
        throw new SendGridError('Promise API not supported');
      }
      return new SendGrid.Promise(function(resolve, reject) {
        client.API(request, function(response) {
          if (isValidResponse(response)) {
            resolve(response);
          }
          else {
            var error = new SendGridError('Response error');
            error.response = response;
            reject(error);
          }
        });
      });
    }

    //Use callback
    client.API(request, function(response) {
      if (isValidResponse(response)) {
        callback(null, response);
      }
      else {
        var error = new SendGridError('Response error');
        callback(error, response);
      }
    });
  };

  //Set requests
  SendGrid.emptyRequest = getEmptyRequest;
  SendGrid.globalRequest = globalRequest;
  return SendGrid;
}

//Try to use native promises by default
if (typeof Promise !== 'undefined') {
  SendGrid.Promise = Promise;
}
else {
  SendGrid.Promise = null;
}

//Export
module.exports = SendGrid;