Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 228657c

Browse files
authored
Generate Express apps. (#5)
1 parent e9149f3 commit 228657c

11 files changed

+1509
-341
lines changed

build.cake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ string GetSemVerFromFile(string path)
192192
void CodeGen(bool verify)
193193
{
194194
var fsdPath = File("example/ExampleApi.fsd").ToString();
195-
ExecuteCodeGen($"{fsdPath} {File("example/js")} --indent 2", verify);
196-
ExecuteCodeGen($"{fsdPath} {File("example/ts")} --typescript", verify);
195+
ExecuteCodeGen($"{fsdPath} {File("example/js")} --indent 2 --express", verify);
196+
ExecuteCodeGen($"{fsdPath} {File("example/ts/src")} --typescript --express", verify);
197197
}
198198

199199
void ExecuteCodeGen(string args, bool verify)

example/js/exampleApiServer.js

Lines changed: 348 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,348 @@
1+
// DO NOT EDIT: generated by fsdgenjs
2+
'use strict';
3+
4+
import * as bodyParser from 'body-parser';
5+
import * as express from 'express';
6+
import { } from 'facility-core';
7+
8+
const standardErrorCodes = {
9+
'notModified': 304,
10+
'invalidRequest': 400,
11+
'notAuthenticated': 401,
12+
'notAuthorized': 403,
13+
'notFound': 404,
14+
'conflict': 409,
15+
'requestTooLarge': 413,
16+
'tooManyRequests': 429,
17+
'internalError': 500,
18+
'serviceUnavailable': 503,
19+
};
20+
21+
function parseBoolean(value) {
22+
if (typeof value === 'string') {
23+
const lowerValue = value.toLowerCase();
24+
if (lowerValue === 'true') {
25+
return true;
26+
}
27+
if (lowerValue === 'false') {
28+
return false;
29+
}
30+
}
31+
return undefined;
32+
}
33+
34+
export function createApp(service) {
35+
const app = express();
36+
app.use(bodyParser.json());
37+
app.use(bodyParser.urlencoded({ extended: true }));
38+
39+
/** Gets widgets. */
40+
app.get('/widgets', function (req, res, next) {
41+
const request = {};
42+
if (req.query['q'] != null) {
43+
request.query = req.query['q'];
44+
}
45+
if (req.query['limit'] != null) {
46+
request.limit = parseInt(req.query['limit'], 10);
47+
}
48+
if (req.query['sort'] != null) {
49+
request.sort = req.query['sort'];
50+
}
51+
if (req.query['desc'] != null) {
52+
request.desc = parseBoolean(req.query['desc']);
53+
}
54+
if (req.query['maxWeight'] != null) {
55+
request.maxWeight = parseFloat(req.query['maxWeight']);
56+
}
57+
if (req.query['minPrice'] != null) {
58+
request.minPrice = parseFloat(req.query['minPrice']);
59+
}
60+
61+
return service.getWidgets(request)
62+
.then(result => {
63+
if (result.error) {
64+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
65+
res.status(status).send(result.error);
66+
return;
67+
}
68+
if (result.value) {
69+
if (result.value.job) {
70+
res.status(202).send(result.value.job);
71+
return;
72+
}
73+
res.status(200).send({
74+
widgets: result.value.widgets,
75+
total: result.value.total,
76+
totalWeight: result.value.totalWeight,
77+
});
78+
return;
79+
}
80+
throw new Error('Result must have an error or value.');
81+
})
82+
.catch(next);
83+
});
84+
85+
/** Creates a new widget. */
86+
app.post('/widgets', function (req, res, next) {
87+
const request = {};
88+
request.widget = req.body;
89+
90+
return service.createWidget(request)
91+
.then(result => {
92+
if (result.error) {
93+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
94+
res.status(status).send(result.error);
95+
return;
96+
}
97+
if (result.value) {
98+
if (result.value.widget) {
99+
res.status(201).send(result.value.widget);
100+
return;
101+
}
102+
}
103+
throw new Error('Result must have an error or value.');
104+
})
105+
.catch(next);
106+
});
107+
108+
/** Gets the specified widget. */
109+
app.get('/widgets/:id', function (req, res, next) {
110+
const request = {};
111+
request.id = req.params.id;
112+
request.ifNoneMatch = req.header('If-None-Match');
113+
114+
return service.getWidget(request)
115+
.then(result => {
116+
if (result.error) {
117+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
118+
res.status(status).send(result.error);
119+
return;
120+
}
121+
if (result.value) {
122+
if (result.value.eTag != null) {
123+
res.setHeader('eTag', result.value.eTag);
124+
}
125+
if (result.value.widget) {
126+
res.status(200).send(result.value.widget);
127+
return;
128+
}
129+
if (result.value.notModified) {
130+
res.sendStatus(304);
131+
return;
132+
}
133+
}
134+
throw new Error('Result must have an error or value.');
135+
})
136+
.catch(next);
137+
});
138+
139+
/** Deletes the specified widget. */
140+
app.delete('/widgets/:id', function (req, res, next) {
141+
const request = {};
142+
request.id = req.params.id;
143+
144+
return service.deleteWidget(request)
145+
.then(result => {
146+
if (result.error) {
147+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
148+
res.status(status).send(result.error);
149+
return;
150+
}
151+
if (result.value) {
152+
res.sendStatus(204);
153+
return;
154+
}
155+
throw new Error('Result must have an error or value.');
156+
})
157+
.catch(next);
158+
});
159+
160+
/** Edits widget. */
161+
app.post('/widgets/:id', function (req, res, next) {
162+
const request = {};
163+
request.id = req.params.id;
164+
request.ops = req.body.ops;
165+
request.weight = req.body.weight;
166+
167+
return service.editWidget(request)
168+
.then(result => {
169+
if (result.error) {
170+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
171+
res.status(status).send(result.error);
172+
return;
173+
}
174+
if (result.value) {
175+
if (result.value.widget) {
176+
res.status(200).send(result.value.widget);
177+
return;
178+
}
179+
if (result.value.job) {
180+
res.status(202).send(result.value.job);
181+
return;
182+
}
183+
}
184+
throw new Error('Result must have an error or value.');
185+
})
186+
.catch(next);
187+
});
188+
189+
/** Gets the specified widgets. */
190+
app.post('/widgets/get', function (req, res, next) {
191+
const request = {};
192+
request.ids = req.body;
193+
194+
return service.getWidgetBatch(request)
195+
.then(result => {
196+
if (result.error) {
197+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
198+
res.status(status).send(result.error);
199+
return;
200+
}
201+
if (result.value) {
202+
if (result.value.results) {
203+
res.status(200).send(result.value.results);
204+
return;
205+
}
206+
}
207+
throw new Error('Result must have an error or value.');
208+
})
209+
.catch(next);
210+
});
211+
212+
/**
213+
* Gets the widget weight.
214+
* @deprecated
215+
*/
216+
app.get('/widgets/:id/weight', function (req, res, next) {
217+
const request = {};
218+
request.id = req.params.id;
219+
220+
return service.getWidgetWeight(request)
221+
.then(result => {
222+
if (result.error) {
223+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
224+
res.status(status).send(result.error);
225+
return;
226+
}
227+
if (result.value) {
228+
res.status(200).send({
229+
value: result.value.value,
230+
});
231+
return;
232+
}
233+
throw new Error('Result must have an error or value.');
234+
})
235+
.catch(next);
236+
});
237+
238+
/** Gets a widget preference. */
239+
app.get('/prefs/:key', function (req, res, next) {
240+
const request = {};
241+
request.key = req.params.key;
242+
243+
return service.getPreference(request)
244+
.then(result => {
245+
if (result.error) {
246+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
247+
res.status(status).send(result.error);
248+
return;
249+
}
250+
if (result.value) {
251+
if (result.value.value) {
252+
res.status(200).send(result.value.value);
253+
return;
254+
}
255+
}
256+
throw new Error('Result must have an error or value.');
257+
})
258+
.catch(next);
259+
});
260+
261+
/** Sets a widget preference. */
262+
app.put('/prefs/:key', function (req, res, next) {
263+
const request = {};
264+
request.key = req.params.key;
265+
request.value = req.body;
266+
267+
return service.setPreference(request)
268+
.then(result => {
269+
if (result.error) {
270+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
271+
res.status(status).send(result.error);
272+
return;
273+
}
274+
if (result.value) {
275+
if (result.value.value) {
276+
res.status(200).send(result.value.value);
277+
return;
278+
}
279+
}
280+
throw new Error('Result must have an error or value.');
281+
})
282+
.catch(next);
283+
});
284+
285+
/** Gets service info. */
286+
app.get('/', function (req, res, next) {
287+
const request = {};
288+
289+
return service.getInfo(request)
290+
.then(result => {
291+
if (result.error) {
292+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
293+
res.status(status).send(result.error);
294+
return;
295+
}
296+
if (result.value) {
297+
res.status(200).send({
298+
name: result.value.name,
299+
});
300+
return;
301+
}
302+
throw new Error('Result must have an error or value.');
303+
})
304+
.catch(next);
305+
});
306+
307+
/** Demonstrates the default HTTP behavior. */
308+
app.post('/notRestful', function (req, res, next) {
309+
const request = {};
310+
311+
return service.notRestful(request)
312+
.then(result => {
313+
if (result.error) {
314+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
315+
res.status(status).send(result.error);
316+
return;
317+
}
318+
if (result.value) {
319+
res.sendStatus(200);
320+
return;
321+
}
322+
throw new Error('Result must have an error or value.');
323+
})
324+
.catch(next);
325+
});
326+
327+
app.post('/kitchen', function (req, res, next) {
328+
const request = {};
329+
request.sink = req.body.sink;
330+
331+
return service.kitchen(request)
332+
.then(result => {
333+
if (result.error) {
334+
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
335+
res.status(status).send(result.error);
336+
return;
337+
}
338+
if (result.value) {
339+
res.sendStatus(200);
340+
return;
341+
}
342+
throw new Error('Result must have an error or value.');
343+
})
344+
.catch(next);
345+
});
346+
347+
return app;
348+
}

example/js/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
"mocha": "^3.1.2"
2020
},
2121
"dependencies": {
22+
"body-parser": "^1.18.2",
23+
"express": "^4.16.2",
2224
"facility-core": "file:../../ts"
2325
}
2426
}

example/ts/package.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "A client for the example API.",
55
"scripts": {
66
"build": "tsc",
7-
"test": "tsc && mocha"
7+
"test": "tsc && mocha --require source-map-support/register"
88
},
99
"repository": {
1010
"type": "git",
@@ -13,14 +13,21 @@
1313
"author": "Ed Ball",
1414
"license": "UNLICENSED",
1515
"devDependencies": {
16+
"@types/body-parser": "^1.16.8",
1617
"@types/chai": "^3.4.34",
1718
"@types/es6-promise": "0.0.32",
19+
"@types/express": "^4.11.0",
1820
"@types/mocha": "^2.2.32",
21+
"@types/node-fetch": "^1.6.7",
1922
"chai": "^3.5.0",
2023
"mocha": "^3.1.2",
24+
"node-fetch": "^1.7.1",
25+
"source-map-support": "^0.5.3",
2126
"typescript": "^2.0.9"
2227
},
2328
"dependencies": {
29+
"body-parser": "^1.18.2",
30+
"express": "^4.16.2",
2431
"facility-core": "file:../../ts"
2532
}
2633
}

0 commit comments

Comments
 (0)