UNPKG

10.6 kBJavaScriptView Raw
1'use strict';
2
3var _templateObject = _taggedTemplateLiteral(['\n {\n "querystring" : {\n #foreach($key in $input.params().querystring.keySet())\n #if($foreach.index > 0), #end\n "$util.escapeJavaScript($key)": "$util.escapeJavaScript($input.params().querystring.get($key))"\n #end\n },\n "header" : {\n #foreach($key in $input.params().header.keySet())\n #if($foreach.index > 0), #end\n "$util.escapeJavaScript($key)": "$util.escapeJavaScript($input.params().header.get($key))"\n #end\n },\n "path" : {\n #foreach($key in $input.params().path.keySet())\n #if($foreach.index > 0), #end\n "$util.escapeJavaScript($key)": "$util.escapeJavaScript($input.params().path.get($key))"\n #end\n },\n "body" : $input.json(\'$\')\n }\n '], ['\n {\n "querystring" : {\n #foreach($key in $input.params().querystring.keySet())\n #if($foreach.index > 0), #end\n "$util.escapeJavaScript($key)": "$util.escapeJavaScript($input.params().querystring.get($key))"\n #end\n },\n "header" : {\n #foreach($key in $input.params().header.keySet())\n #if($foreach.index > 0), #end\n "$util.escapeJavaScript($key)": "$util.escapeJavaScript($input.params().header.get($key))"\n #end\n },\n "path" : {\n #foreach($key in $input.params().path.keySet())\n #if($foreach.index > 0), #end\n "$util.escapeJavaScript($key)": "$util.escapeJavaScript($input.params().path.get($key))"\n #end\n },\n "body" : $input.json(\'$\')\n }\n ']);
4
5var _dedent = require('dedent');
6
7var _dedent2 = _interopRequireDefault(_dedent);
8
9var _2 = require('./');
10
11var _3 = _interopRequireDefault(_2);
12
13var _sanitize = require('./utils/sanitize');
14
15var _sanitize2 = _interopRequireDefault(_sanitize);
16
17var _promisify = require('./utils/promisify');
18
19var _promisify2 = _interopRequireDefault(_promisify);
20
21function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
23function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
24
25var AWS = require('aws-sdk');
26var _ = require('underscore');
27var pync = require('pync');
28
29_3.default.prototype._findEndpoint = function (data, endpoint) {
30 return data.api.endpoints.find(function (endp) {
31 return endp.method === endpoint.method && endp.path === endpoint.path;
32 });
33};
34
35_3.default.prototype.apiDeleteEndpoint = function (endpoint) {
36 var _this = this;
37
38 return Promise.resolve().then(function () {
39 endpoint = (0, _sanitize2.default)(endpoint, {
40 method: 'string',
41 path: 'string',
42 functionName: 'string'
43 });
44 }).then(function () {
45 return _this.readConfig();
46 }).then(function (data) {
47 var endpoints = data.api.endpoints;
48 var endp = _this._findEndpoint(data, endpoint);
49 if (!endp) return Promise.reject(new Error('Endpoint not found'));
50 endpoints.splice(endpoints.indexOf(endp), 1);
51 return _this.writeConfig(data);
52 }).then(function () {
53 return _this.emit('api_changed');
54 });
55};
56
57_3.default.prototype.apiEditEndpoint = function (endpoint, state) {
58 var _this2 = this;
59
60 return Promise.resolve().then(function () {
61 endpoint = (0, _sanitize2.default)(endpoint, {
62 method: 'string',
63 path: 'string',
64 functionName: 'string'
65 });
66 state = (0, _sanitize2.default)(state, {
67 method: 'string',
68 path: 'string',
69 functionName: 'string',
70 input: 'string?',
71 output: 'string?'
72 });
73 }).then(function () {
74 return _this2.readConfig();
75 }).then(function (data) {
76 var endpoints = data.api.endpoints;
77 var endp = _this2._findEndpoint(data, endpoint);
78 var endp2 = _this2._findEndpoint(data, state);
79 if (!endp) return Promise.reject(new Error('Endpoint not found'));
80 if (endp2 && endp !== endp2) {
81 return Promise.reject(new Error('An endpoint witht he same method and path already exists'));
82 }
83 Object.assign(endp, state);
84 return _this2.writeConfig(data);
85 }).then(function () {
86 return _this2.emit('api_changed');
87 });
88};
89
90_3.default.prototype.apiCreateEndpoint = function (endpoint) {
91 var _this3 = this;
92
93 return Promise.resolve().then(function () {
94 endpoint = (0, _sanitize2.default)(endpoint, {
95 method: 'string',
96 path: 'string',
97 functionName: 'string',
98 input: 'string?',
99 output: 'string?'
100 });
101 }).then(function () {
102 return _this3.readConfig();
103 }).then(function (data) {
104 var endpoints = data.api.endpoints;
105 var endp = _this3._findEndpoint(data, endpoint);
106 if (endp) {
107 return Promise.reject(new Error('An endpoint witht he same method and path already exists'));
108 }
109 data.api.endpoints.push(endpoint);
110 return _this3.writeConfig(data);
111 }).then(function () {
112 return _this3.emit('api_changed');
113 });
114};
115
116_3.default.prototype.apiList = function () {
117 var apigateway = new AWS.APIGateway();
118 return (0, _promisify2.default)(apigateway, 'getRestApis', {});
119};
120
121_3.default.prototype.apiCreate = function (params) {
122 var apigateway = new AWS.APIGateway();
123 return (0, _promisify2.default)(apigateway, 'createRestApi', params);
124};
125
126_3.default.prototype.apiSyncEndpoint = function (params, syncFunction) {
127 var _this4 = this;
128
129 var apigateway = new AWS.APIGateway();
130 var method = params.method;
131 var path = params.path;
132 var api, func, endpoint, parentResource, resourceId;
133
134 var job = this._random();
135 this.emit('job:start', { id: job, name: 'Synching endpoint ' + method + ' ' + path, steps: 5 });
136
137 return this.readConfig().then(function (data) {
138 api = data.api;
139 endpoint = _this4._findEndpoint(data, params);
140 if (!endpoint) return Promise.reject(new Error('Endpoint not found ' + method + ' ' + path));
141
142 func = _this4._findFunction(data, { functionName: endpoint.functionName });
143 if (!func) return Promise.reject(new Error('Lambda function not found ' + endpoint.functionName));
144 if (syncFunction) return _this4.lambdaSyncFunction(endpoint.functionName);
145 if (!func.functionArn) return Promise.reject(new Error('Lambda function not synched ' + endpoint.functionName));
146 }).then(function () {
147 _this4.emit('job:progress', { id: job, log: 'Creating API resources' });
148 return (0, _promisify2.default)(apigateway, 'getResources', { restApiId: api.id });
149 }).then(function (data) {
150 var resources = data.items;
151 resources.forEach(function (resource) {
152 if (endpoint.path.indexOf(resource.path) === 0 && (!parentResource || resource.path.length > parentResource.path.length)) {
153 parentResource = resource;
154 }
155 });
156 var pathParts = _.compact(endpoint.path.substring(parentResource.path.length).split('/'));
157
158 pync.series(pathParts, function (part) {
159 return (0, _promisify2.default)(apigateway, 'createResource', {
160 restApiId: api.id,
161 parentId: parentResource.id,
162 pathPart: part
163 }).then(function (body) {
164 parentResource = body;
165 });
166 });
167 }).then(function () {
168 resourceId = parentResource.id;
169 var method = parentResource.resourceMethods && parentResource.resourceMethods[endpoint.method];
170 if (method) {
171 var params = {
172 restApiId: api.id,
173 resourceId: resourceId,
174 httpMethod: endpoint.method
175 };
176 console.log('deleteMethod');
177 return (0, _promisify2.default)(apigateway, 'deleteMethod', params);
178 } else {
179 var params = {
180 authorizationType: 'none',
181 httpMethod: endpoint.method,
182 resourceId: resourceId,
183 restApiId: api.id,
184 apiKeyRequired: false
185 };
186 return (0, _promisify2.default)(apigateway, 'putMethod', params);
187 }
188 }).then(function () {
189 _this4.emit('job:progress', { id: job, log: 'Creating integration' });
190 var params = {
191 restApiId: api.id,
192 resourceId: resourceId,
193 httpMethod: endpoint.method,
194 integrationHttpMethod: 'POST', // always POST?
195 type: 'AWS',
196 uri: 'arn:aws:apigateway:' + AWS.config.region + ':lambda:path/2015-03-31/functions/' + func.functionArn + '/invocations',
197 requestTemplates: {
198 'application/json': (0, _dedent2.default)(_templateObject)
199 }
200 };
201 return (0, _promisify2.default)(apigateway, 'putIntegration', params);
202 }).then(function () {
203 _this4.emit('job:progress', { id: job, log: 'Creating integration response' });
204 var params = {
205 httpMethod: endpoint.method,
206 resourceId: resourceId,
207 restApiId: api.id,
208 statusCode: '200',
209 responseParameters: {},
210 responseTemplates: {},
211 selectionPattern: '.*'
212 };
213 if (endpoint.output === 'html') {
214 params.responseTemplates['text/html'] = '$input.path(\'$.html\')';
215 }
216 return (0, _promisify2.default)(apigateway, 'putIntegrationResponse', params);
217 }).then(function () {
218 _this4.emit('job:progress', { id: job, log: 'Creating method response' });
219 var params = {
220 httpMethod: endpoint.method,
221 resourceId: resourceId,
222 restApiId: api.id,
223 statusCode: '200',
224 responseModels: {},
225 responseParameters: {}
226 };
227 if (endpoint.output === 'html') {
228 params.responseModels['text/html'] = 'Empty';
229 }
230 return (0, _promisify2.default)(apigateway, 'putMethodResponse', params);
231 }).then(function () {
232 _this4.emit('job:succees', { id: job });
233 }).catch(function (e) {
234 _this4.emit('job:fail', { id: job, error: e });
235 return Promise.reject(e);
236 });
237};
238
239_3.default.prototype.apiListStages = function () {
240 var apigateway = new AWS.APIGateway();
241 return this.readConfig().then(function (data) {
242 return (0, _promisify2.default)(apigateway, 'getStages', { restApiId: data.api.id });
243 });
244};
245
246_3.default.prototype.apiCreateStage = function (params) {
247 var apigateway = new AWS.APIGateway();
248 return this.readConfig().then(function (data) {
249 var options = {
250 restApiId: data.api.id,
251 stageName: params.name
252 };
253 return (0, _promisify2.default)(apigateway, 'createDeployment', options);
254 });
255};
256//# sourceMappingURL=api.js.map
\No newline at end of file