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

Skip to content

Commit 8c99e52

Browse files
committed
Add request context to server service interface.
The request context contains the express request and response. This allows the server implementation to validate the authorization, for example.
1 parent 6a75f1b commit 8c99e52

File tree

3 files changed

+96
-25
lines changed

3 files changed

+96
-25
lines changed

example/js/exampleApiServer.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function createApp(service) {
5858
request.minPrice = parseFloat(req.query['minPrice']);
5959
}
6060

61-
return service.getWidgets(request)
61+
return service.getWidgets(request, { request: req, response: res })
6262
.then(result => {
6363
if (result.error) {
6464
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -87,7 +87,7 @@ export function createApp(service) {
8787
const request = {};
8888
request.widget = req.body;
8989

90-
return service.createWidget(request)
90+
return service.createWidget(request, { request: req, response: res })
9191
.then(result => {
9292
if (result.error) {
9393
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -111,7 +111,7 @@ export function createApp(service) {
111111
request.id = req.params.id;
112112
request.ifNoneMatch = req.header('If-None-Match');
113113

114-
return service.getWidget(request)
114+
return service.getWidget(request, { request: req, response: res })
115115
.then(result => {
116116
if (result.error) {
117117
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -141,7 +141,7 @@ export function createApp(service) {
141141
const request = {};
142142
request.id = req.params.id;
143143

144-
return service.deleteWidget(request)
144+
return service.deleteWidget(request, { request: req, response: res })
145145
.then(result => {
146146
if (result.error) {
147147
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -164,7 +164,7 @@ export function createApp(service) {
164164
request.ops = req.body.ops;
165165
request.weight = req.body.weight;
166166

167-
return service.editWidget(request)
167+
return service.editWidget(request, { request: req, response: res })
168168
.then(result => {
169169
if (result.error) {
170170
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -191,7 +191,7 @@ export function createApp(service) {
191191
const request = {};
192192
request.ids = req.body;
193193

194-
return service.getWidgetBatch(request)
194+
return service.getWidgetBatch(request, { request: req, response: res })
195195
.then(result => {
196196
if (result.error) {
197197
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -217,7 +217,7 @@ export function createApp(service) {
217217
const request = {};
218218
request.id = req.params.id;
219219

220-
return service.getWidgetWeight(request)
220+
return service.getWidgetWeight(request, { request: req, response: res })
221221
.then(result => {
222222
if (result.error) {
223223
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -240,7 +240,7 @@ export function createApp(service) {
240240
const request = {};
241241
request.key = req.params.key;
242242

243-
return service.getPreference(request)
243+
return service.getPreference(request, { request: req, response: res })
244244
.then(result => {
245245
if (result.error) {
246246
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -264,7 +264,7 @@ export function createApp(service) {
264264
request.key = req.params.key;
265265
request.value = req.body;
266266

267-
return service.setPreference(request)
267+
return service.setPreference(request, { request: req, response: res })
268268
.then(result => {
269269
if (result.error) {
270270
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -286,7 +286,7 @@ export function createApp(service) {
286286
app.get('/', function (req, res, next) {
287287
const request = {};
288288

289-
return service.getInfo(request)
289+
return service.getInfo(request, { request: req, response: res })
290290
.then(result => {
291291
if (result.error) {
292292
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -308,7 +308,7 @@ export function createApp(service) {
308308
app.post('/notRestful', function (req, res, next) {
309309
const request = {};
310310

311-
return service.notRestful(request)
311+
return service.notRestful(request, { request: req, response: res })
312312
.then(result => {
313313
if (result.error) {
314314
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -328,7 +328,7 @@ export function createApp(service) {
328328
const request = {};
329329
request.sink = req.body.sink;
330330

331-
return service.kitchen(request)
331+
return service.kitchen(request, { request: req, response: res })
332332
.then(result => {
333333
if (result.error) {
334334
const status = result.error.code && standardErrorCodes[result.error.code] || 500;

example/ts/src/exampleApiServer.ts

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,53 @@ import { IServiceResult, IServiceError } from 'facility-core';
66
import { IExampleApi, IGetWidgetsRequest, IGetWidgetsResponse, ICreateWidgetRequest, ICreateWidgetResponse, IGetWidgetRequest, IGetWidgetResponse, IDeleteWidgetRequest, IDeleteWidgetResponse, IEditWidgetRequest, IEditWidgetResponse, IGetWidgetBatchRequest, IGetWidgetBatchResponse, IGetWidgetWeightRequest, IGetWidgetWeightResponse, IGetPreferenceRequest, IGetPreferenceResponse, ISetPreferenceRequest, ISetPreferenceResponse, IGetInfoRequest, IGetInfoResponse, INotRestfulRequest, INotRestfulResponse, IKitchenRequest, IKitchenResponse, IWidget, IWidgetJob, IPreference, IObsoleteData, IKitchenSink } from './exampleApiTypes';
77
export * from './exampleApiTypes';
88

9+
export interface IRequestContext {
10+
request: express.Request;
11+
response: express.Response;
12+
}
13+
14+
declare module './exampleApiTypes' {
15+
export interface IExampleApi {
16+
/** Gets widgets. */
17+
getWidgets(request: IGetWidgetsRequest, context?: IRequestContext): Promise<IServiceResult<IGetWidgetsResponse>>;
18+
19+
/** Creates a new widget. */
20+
createWidget(request: ICreateWidgetRequest, context?: IRequestContext): Promise<IServiceResult<ICreateWidgetResponse>>;
21+
22+
/** Gets the specified widget. */
23+
getWidget(request: IGetWidgetRequest, context?: IRequestContext): Promise<IServiceResult<IGetWidgetResponse>>;
24+
25+
/** Deletes the specified widget. */
26+
deleteWidget(request: IDeleteWidgetRequest, context?: IRequestContext): Promise<IServiceResult<IDeleteWidgetResponse>>;
27+
28+
/** Edits widget. */
29+
editWidget(request: IEditWidgetRequest, context?: IRequestContext): Promise<IServiceResult<IEditWidgetResponse>>;
30+
31+
/** Gets the specified widgets. */
32+
getWidgetBatch(request: IGetWidgetBatchRequest, context?: IRequestContext): Promise<IServiceResult<IGetWidgetBatchResponse>>;
33+
34+
/**
35+
* Gets the widget weight.
36+
* @deprecated
37+
*/
38+
getWidgetWeight(request: IGetWidgetWeightRequest, context?: IRequestContext): Promise<IServiceResult<IGetWidgetWeightResponse>>;
39+
40+
/** Gets a widget preference. */
41+
getPreference(request: IGetPreferenceRequest, context?: IRequestContext): Promise<IServiceResult<IGetPreferenceResponse>>;
42+
43+
/** Sets a widget preference. */
44+
setPreference(request: ISetPreferenceRequest, context?: IRequestContext): Promise<IServiceResult<ISetPreferenceResponse>>;
45+
46+
/** Gets service info. */
47+
getInfo(request: IGetInfoRequest, context?: IRequestContext): Promise<IServiceResult<IGetInfoResponse>>;
48+
49+
/** Demonstrates the default HTTP behavior. */
50+
notRestful(request: INotRestfulRequest, context?: IRequestContext): Promise<IServiceResult<INotRestfulResponse>>;
51+
52+
kitchen(request: IKitchenRequest, context?: IRequestContext): Promise<IServiceResult<IKitchenResponse>>;
53+
}
54+
}
55+
956
const standardErrorCodes: { [code: string]: number } = {
1057
'notModified': 304,
1158
'invalidRequest': 400,
@@ -59,7 +106,7 @@ export function createApp(service: IExampleApi): express.Application {
59106
request.minPrice = parseFloat(req.query['minPrice']);
60107
}
61108

62-
return service.getWidgets(request)
109+
return service.getWidgets(request, { request: req, response: res })
63110
.then(result => {
64111
if (result.error) {
65112
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -88,7 +135,7 @@ export function createApp(service: IExampleApi): express.Application {
88135
const request: ICreateWidgetRequest = {};
89136
request.widget = req.body;
90137

91-
return service.createWidget(request)
138+
return service.createWidget(request, { request: req, response: res })
92139
.then(result => {
93140
if (result.error) {
94141
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -112,7 +159,7 @@ export function createApp(service: IExampleApi): express.Application {
112159
request.id = req.params.id;
113160
request.ifNoneMatch = req.header('If-None-Match');
114161

115-
return service.getWidget(request)
162+
return service.getWidget(request, { request: req, response: res })
116163
.then(result => {
117164
if (result.error) {
118165
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -142,7 +189,7 @@ export function createApp(service: IExampleApi): express.Application {
142189
const request: IDeleteWidgetRequest = {};
143190
request.id = req.params.id;
144191

145-
return service.deleteWidget(request)
192+
return service.deleteWidget(request, { request: req, response: res })
146193
.then(result => {
147194
if (result.error) {
148195
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -165,7 +212,7 @@ export function createApp(service: IExampleApi): express.Application {
165212
request.ops = req.body.ops;
166213
request.weight = req.body.weight;
167214

168-
return service.editWidget(request)
215+
return service.editWidget(request, { request: req, response: res })
169216
.then(result => {
170217
if (result.error) {
171218
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -192,7 +239,7 @@ export function createApp(service: IExampleApi): express.Application {
192239
const request: IGetWidgetBatchRequest = {};
193240
request.ids = req.body;
194241

195-
return service.getWidgetBatch(request)
242+
return service.getWidgetBatch(request, { request: req, response: res })
196243
.then(result => {
197244
if (result.error) {
198245
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -218,7 +265,7 @@ export function createApp(service: IExampleApi): express.Application {
218265
const request: IGetWidgetWeightRequest = {};
219266
request.id = req.params.id;
220267

221-
return service.getWidgetWeight(request)
268+
return service.getWidgetWeight(request, { request: req, response: res })
222269
.then(result => {
223270
if (result.error) {
224271
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -241,7 +288,7 @@ export function createApp(service: IExampleApi): express.Application {
241288
const request: IGetPreferenceRequest = {};
242289
request.key = req.params.key;
243290

244-
return service.getPreference(request)
291+
return service.getPreference(request, { request: req, response: res })
245292
.then(result => {
246293
if (result.error) {
247294
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -265,7 +312,7 @@ export function createApp(service: IExampleApi): express.Application {
265312
request.key = req.params.key;
266313
request.value = req.body;
267314

268-
return service.setPreference(request)
315+
return service.setPreference(request, { request: req, response: res })
269316
.then(result => {
270317
if (result.error) {
271318
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -287,7 +334,7 @@ export function createApp(service: IExampleApi): express.Application {
287334
app.get('/', function (req, res, next) {
288335
const request: IGetInfoRequest = {};
289336

290-
return service.getInfo(request)
337+
return service.getInfo(request, { request: req, response: res })
291338
.then(result => {
292339
if (result.error) {
293340
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -309,7 +356,7 @@ export function createApp(service: IExampleApi): express.Application {
309356
app.post('/notRestful', function (req, res, next) {
310357
const request: INotRestfulRequest = {};
311358

312-
return service.notRestful(request)
359+
return service.notRestful(request, { request: req, response: res })
313360
.then(result => {
314361
if (result.error) {
315362
const status = result.error.code && standardErrorCodes[result.error.code] || 500;
@@ -329,7 +376,7 @@ export function createApp(service: IExampleApi): express.Application {
329376
const request: IKitchenRequest = {};
330377
request.sink = req.body.sink;
331378

332-
return service.kitchen(request)
379+
return service.kitchen(request, { request: req, response: res })
333380
.then(result => {
334381
if (result.error) {
335382
const status = result.error.code && standardErrorCodes[result.error.code] || 500;

src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,30 @@ protected override CodeGenOutput GenerateOutputCore(ServiceInfo service)
307307
code.WriteLine($"export * from './{Uncapitalize(moduleName)}Types';");
308308
}
309309

310+
if (TypeScript)
311+
{
312+
code.WriteLine();
313+
using (code.Block("export interface IRequestContext {", "}"))
314+
{
315+
code.WriteLine("request: express.Request;");
316+
code.WriteLine("response: express.Response;");
317+
}
318+
319+
code.WriteLine();
320+
using (code.Block($"declare module './{Uncapitalize(moduleName)}Types' {{", "}"))
321+
using (code.Block($"export interface I{capModuleName} {{", "}"))
322+
{
323+
foreach (var httpMethodInfo in httpServiceInfo.Methods)
324+
{
325+
string methodName = httpMethodInfo.ServiceMethod.Name;
326+
string capMethodName = CodeGenUtility.Capitalize(methodName);
327+
code.WriteLineSkipOnce();
328+
WriteJsDoc(code, httpMethodInfo.ServiceMethod);
329+
code.WriteLine($"{methodName}(request: I{capMethodName}Request, context?: IRequestContext): Promise<IServiceResult<I{capMethodName}Response>>;");
330+
}
331+
}
332+
}
333+
310334
// TODO: export this from facility-core
311335
code.WriteLine();
312336
using (code.Block("const standardErrorCodes" + IfTypeScript(": { [code: string]: number }") + " = {", "};"))
@@ -385,7 +409,7 @@ protected override CodeGenOutput GenerateOutputCore(ServiceInfo service)
385409
}
386410

387411
code.WriteLine();
388-
code.WriteLine($"return service.{methodName}(request)");
412+
code.WriteLine($"return service.{methodName}(request, {{ request: req, response: res }})");
389413

390414
using (code.Indent())
391415
{

0 commit comments

Comments
 (0)