1 | 'use strict';
|
2 |
|
3 | var _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 |
|
5 | var _dedent = require('dedent');
|
6 |
|
7 | var _dedent2 = _interopRequireDefault(_dedent);
|
8 |
|
9 | var _2 = require('./');
|
10 |
|
11 | var _3 = _interopRequireDefault(_2);
|
12 |
|
13 | var _sanitize = require('./utils/sanitize');
|
14 |
|
15 | var _sanitize2 = _interopRequireDefault(_sanitize);
|
16 |
|
17 | var _promisify = require('./utils/promisify');
|
18 |
|
19 | var _promisify2 = _interopRequireDefault(_promisify);
|
20 |
|
21 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
22 |
|
23 | function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
24 |
|
25 | var AWS = require('aws-sdk');
|
26 | var _ = require('underscore');
|
27 | var 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',
|
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 |
|
\ | No newline at end of file |