Skip to content

Commit fe85099

Browse files
authored
better exception handling and typing (#1474)
1 parent 867a599 commit fe85099

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

libraries/botbuilder/src/botFrameworkAdapter.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ export interface WebRequest {
5454
*/
5555
method?: any;
5656

57+
/***
58+
* Optional. The request parameters from the url.
59+
*/
60+
params?: any;
61+
62+
/***
63+
* Optional. The values from the query string.
64+
*/
65+
query?: any;
66+
5767
/**
5868
* When implemented in a derived class, adds a listener for an event.
5969
* The framework uses this method to retrieve the request body when the

libraries/botbuilder/src/channelServiceRoutes.ts

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import { ChannelServiceHandler } from './channelServiceHandler';
1010
import { Activity, ConversationParameters, Transcript, AttachmentData } from 'botbuilder-core';
11-
import { WebRequest, WebResponse, StatusCodeError } from './botFrameworkAdapter';
11+
import { WebRequest, WebResponse, StatusCodeError, StatusCodes } from './botFrameworkAdapter';
1212

1313
export class ChannelServiceRoutes {
1414

@@ -31,7 +31,7 @@ export class ChannelServiceRoutes {
3131
server.post(baseAddress + '/v3/conversations/:conversationId/attachments', this.processUploadAttachment.bind(this));
3232
}
3333

34-
processSendToConversation(req, res) {
34+
processSendToConversation(req: WebRequest, res: WebResponse) {
3535
const authHeader = req.headers.authorization || req.headers.Authorization || '';
3636
ChannelServiceRoutes.readActivity(req)
3737
.then((activity) => {
@@ -44,10 +44,11 @@ export class ChannelServiceRoutes {
4444
res.end();
4545
})
4646
.catch(err => { ChannelServiceRoutes.handleError(err, res); })
47-
});
47+
})
48+
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
4849
}
4950

50-
processReplyToActivity(req, res) {
51+
processReplyToActivity(req: WebRequest, res: WebResponse) {
5152
const authHeader = req.headers.authorization || req.headers.Authorization || '';
5253
ChannelServiceRoutes.readActivity(req)
5354
.then((activity) => {
@@ -60,10 +61,11 @@ export class ChannelServiceRoutes {
6061
res.end();
6162
})
6263
.catch(err => { ChannelServiceRoutes.handleError(err, res); })
63-
});
64+
})
65+
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
6466
}
6567

66-
processUpdateActivity(req, res) {
68+
processUpdateActivity(req: WebRequest, res: WebResponse) {
6769
const authHeader = req.headers.authorization || req.headers.Authorization || '';
6870
ChannelServiceRoutes.readActivity(req)
6971
.then((activity) => {
@@ -76,20 +78,21 @@ export class ChannelServiceRoutes {
7678
res.end();
7779
})
7880
.catch(err => { ChannelServiceRoutes.handleError(err, res); })
79-
});
81+
})
82+
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
8083
}
8184

82-
processDeleteActivity(req, res) {
85+
processDeleteActivity(req: WebRequest, res: WebResponse) {
8386
const authHeader = req.headers.authorization || req.headers.Authorization || '';
8487
this.channelServiceHandler.handleDeleteActivity(authHeader, req.params.conversationId, req.params.activityId)
8588
.then(() => {
8689
res.status(200);
8790
res.end();
8891
})
8992
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
90-
}
93+
}
9194

92-
processGetActivityMembers(req, res) {
95+
processGetActivityMembers(req: WebRequest, res: WebResponse) {
9396
const authHeader = req.headers.authorization || req.headers.Authorization || '';
9497
this.channelServiceHandler.handleGetActivityMembers(authHeader, req.params.conversationId, req.params.activityId)
9598
.then((channelAccounts) => {
@@ -102,7 +105,7 @@ export class ChannelServiceRoutes {
102105
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
103106
}
104107

105-
processCreateConversation(req, res) {
108+
processCreateConversation(req: WebRequest, res: WebResponse) {
106109
const authHeader = req.headers.authorization || req.headers.Authorization || '';
107110
ChannelServiceRoutes.readBody<ConversationParameters>(req)
108111
.then((conversationParameters) => {
@@ -118,7 +121,7 @@ export class ChannelServiceRoutes {
118121
});
119122
}
120123

121-
processGetConversations(req, res) {
124+
processGetConversations(req: WebRequest, res: WebResponse) {
122125
const authHeader = req.headers.authorization || req.headers.Authorization || '';
123126
this.channelServiceHandler.handleGetConversations(authHeader, req.params.conversationId, req.query.continuationToken)
124127
.then((conversationsResult) => {
@@ -131,7 +134,7 @@ export class ChannelServiceRoutes {
131134
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
132135
}
133136

134-
processGetConversationMembers(req, res) {
137+
processGetConversationMembers(req: WebRequest, res: WebResponse) {
135138
const authHeader = req.headers.authorization || req.headers.Authorization || '';
136139
this.channelServiceHandler.handleGetConversationMembers(authHeader, req.params.conversationId)
137140
.then((channelAccounts) => {
@@ -144,7 +147,7 @@ export class ChannelServiceRoutes {
144147
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
145148
}
146149

147-
processGetConversationPagedMembers(req, res) {
150+
processGetConversationPagedMembers(req: WebRequest, res: WebResponse) {
148151
const authHeader = req.headers.authorization || req.headers.Authorization || '';
149152
let pageSize = parseInt(req.query.pageSize);
150153
if (isNaN(pageSize))
@@ -166,7 +169,7 @@ export class ChannelServiceRoutes {
166169
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
167170
}
168171

169-
processDeleteConversationMember(req, res) {
172+
processDeleteConversationMember(req: WebRequest, res: WebResponse) {
170173
const authHeader = req.headers.authorization || req.headers.Authorization || '';
171174
this.channelServiceHandler.handleDeleteConversationMember(authHeader, req.params.conversationId, req.params.memberId)
172175
.then((resourceResponse) => {
@@ -176,7 +179,7 @@ export class ChannelServiceRoutes {
176179
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
177180
}
178181

179-
processSendConversationHistory(req, res) {
182+
processSendConversationHistory(req: WebRequest, res: WebResponse) {
180183
const authHeader = req.headers.authorization || req.headers.Authorization || '';
181184
ChannelServiceRoutes.readBody<Transcript>(req)
182185
.then((transcript) => {
@@ -185,14 +188,15 @@ export class ChannelServiceRoutes {
185188
if (resourceResponse) {
186189
res.send(resourceResponse);
187190
}
188-
res.status(201);
191+
res.status(200);
189192
res.end();
190193
})
191194
.catch(err => { ChannelServiceRoutes.handleError(err, res); })
192-
});
195+
})
196+
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
193197
}
194198

195-
processUploadAttachment(req, res) {
199+
processUploadAttachment(req: WebRequest, res: WebResponse) {
196200
const authHeader = req.headers.authorization || req.headers.Authorization || '';
197201
ChannelServiceRoutes.readBody<AttachmentData>(req)
198202
.then((attachmentData) => {
@@ -201,18 +205,19 @@ export class ChannelServiceRoutes {
201205
if (resourceResponse) {
202206
res.send(resourceResponse);
203207
}
204-
res.status(201);
208+
res.status(200);
205209
res.end();
206210
})
207211
.catch(err => { ChannelServiceRoutes.handleError(err, res); })
208-
});
212+
})
213+
.catch(err => { ChannelServiceRoutes.handleError(err, res); });
209214
}
210215

211216
static readActivity(req: WebRequest) : Promise<Activity> {
212217
return new Promise((resolve, reject) => {
213218
function returnActivity(activity) {
214-
if (typeof activity !== 'object') { throw new Error(`BotFrameworkAdapter.parseRequest(): invalid request body.`); }
215-
if (typeof activity.type !== 'string') { throw new Error(`BotFrameworkAdapter.parseRequest(): missing activity type.`); }
219+
if (typeof activity !== 'object') { throw new Error(`Invalid request body.`); }
220+
if (typeof activity.type !== 'string') { throw new Error(`Missing activity type.`); }
216221
if (typeof activity.timestamp === 'string') { activity.timestamp = new Date(activity.timestamp); }
217222
if (typeof activity.localTimestamp === 'string') { activity.localTimestamp = new Date(activity.localTimestamp); }
218223
if (typeof activity.expiration === 'string') { activity.expiration = new Date(activity.expiration); }
@@ -223,7 +228,7 @@ export class ChannelServiceRoutes {
223228
try {
224229
returnActivity(req.body);
225230
} catch (err) {
226-
reject(err);
231+
reject(new StatusCodeError(StatusCodes.BAD_REQUEST, err.message));
227232
}
228233
} else {
229234
let requestData = '';
@@ -235,7 +240,7 @@ export class ChannelServiceRoutes {
235240
const body = JSON.parse(requestData);
236241
returnActivity(body);
237242
} catch (err) {
238-
reject(err);
243+
reject(new StatusCodeError(StatusCodes.BAD_REQUEST, err.message));
239244
}
240245
});
241246
}
@@ -248,7 +253,7 @@ export class ChannelServiceRoutes {
248253
try {
249254
resolve(req.body);
250255
} catch (err) {
251-
reject(err);
256+
reject(new StatusCodeError(StatusCodes.BAD_REQUEST, err.message));
252257
}
253258
} else {
254259
let requestData = '';
@@ -260,7 +265,7 @@ export class ChannelServiceRoutes {
260265
const body = JSON.parse(requestData);
261266
resolve(body);
262267
} catch (err) {
263-
reject(err);
268+
reject(new StatusCodeError(StatusCodes.BAD_REQUEST, err.message));
264269
}
265270
});
266271
}
@@ -269,6 +274,7 @@ export class ChannelServiceRoutes {
269274

270275
static handleError(err: any, res: WebResponse) {
271276
if (err instanceof StatusCodeError) {
277+
res.send(err.message);
272278
res.status(err.statusCode);
273279
} else {
274280
res.status(500);

0 commit comments

Comments
 (0)