1
1
# Copyright (c) Microsoft Corporation. All rights reserved.
2
2
# Licensed under the MIT License.
3
+ import json
4
+ from typing import List , Union , Type
3
5
4
6
from aiohttp .web import RouteTableDef , Request , Response
5
-
6
- from botbuilder .schema import Activity
7
+ from botbuilder .schema import (
8
+ Activity ,
9
+ AttachmentData ,
10
+ ConversationParameters ,
11
+ Transcript ,
12
+ )
13
+ from msrest .serialization import Model
7
14
8
15
from .channel_service_handler import ChannelServiceHandler
9
16
10
17
11
- async def deserialize_activity (request : Request ) -> Activity :
18
+ async def deserialize_from_body (
19
+ request : Request , target_model : Type [Model ]
20
+ ) -> Activity :
12
21
if "application/json" in request .headers ["Content-Type" ]:
13
22
body = await request .json ()
14
23
else :
15
24
return Response (status = 415 )
16
25
17
- return Activity ().deserialize (body )
26
+ return target_model ().deserialize (body )
27
+
28
+
29
+ def get_serialized_response (model_or_list : Union [Model , List [Model ]]) -> Response :
30
+ if isinstance (model_or_list , Model ):
31
+ json_obj = model_or_list .serialize ()
32
+ else :
33
+ json_obj = [model .serialize () for model in model_or_list ]
34
+
35
+ return Response (body = json .dumps (json_obj ), content_type = "application/json" )
18
36
19
37
20
38
def channel_service_routes (handler : ChannelServiceHandler ) -> RouteTableDef :
@@ -23,38 +41,38 @@ def channel_service_routes(handler: ChannelServiceHandler) -> RouteTableDef:
23
41
24
42
@routes .post ("/{conversation_id}/activities" )
25
43
async def send_to_conversation (request : Request ):
26
- activity = await deserialize_activity (request )
44
+ activity = await deserialize_from_body (request , Activity )
27
45
result = await handler .handle_send_to_conversation (
28
46
request .headers .get ("Authorization" ),
29
47
request .match_info ["conversation_id" ],
30
48
activity ,
31
49
)
32
50
33
- return Response ( body = result . serialize () )
51
+ return get_serialized_response ( result )
34
52
35
53
@routes .post ("/{conversation_id}/activities/{activity_id}" )
36
54
async def reply_to_activity (request : Request ):
37
- activity = await deserialize_activity (request )
55
+ activity = await deserialize_from_body (request , Activity )
38
56
result = await handler .handle_reply_to_activity (
39
57
request .headers .get ("Authorization" ),
40
58
request .match_info ["conversation_id" ],
41
59
request .match_info ["activity_id" ],
42
60
activity ,
43
61
)
44
62
45
- return Response ( body = result . serialize () )
63
+ return get_serialized_response ( result )
46
64
47
65
@routes .put ("/{conversation_id}/activities/{activity_id}" )
48
66
async def update_activity (request : Request ):
49
- activity = await deserialize_activity (request )
67
+ activity = await deserialize_from_body (request , Activity )
50
68
result = await handler .handle_update_activity (
51
69
request .headers .get ("Authorization" ),
52
70
request .match_info ["conversation_id" ],
53
71
request .match_info ["activity_id" ],
54
72
activity ,
55
73
)
56
74
57
- return Response ( body = result . serialize () )
75
+ return get_serialized_response ( result )
58
76
59
77
@routes .delete ("/{conversation_id}/activities/{activity_id}" )
60
78
async def delete_activity (request : Request ):
@@ -68,34 +86,79 @@ async def delete_activity(request: Request):
68
86
69
87
@routes .get ("/{conversation_id}/activities/{activity_id}/members" )
70
88
async def get_activity_members (request : Request ):
71
- raise NotImplementedError ("get_activity_members is not supported" )
89
+ result = await handler .handle_get_activity_members (
90
+ request .headers .get ("Authorization" ),
91
+ request .match_info ["conversation_id" ],
92
+ request .match_info ["activity_id" ],
93
+ )
94
+
95
+ return get_serialized_response (result )
72
96
73
97
@routes .post ("/" )
74
98
async def create_conversation (request : Request ):
75
- raise NotImplementedError ("create_conversation is not supported" )
99
+ conversation_parameters = deserialize_from_body (request , ConversationParameters )
100
+ result = await handler .handle_create_conversation (
101
+ request .headers .get ("Authorization" ), conversation_parameters
102
+ )
103
+
104
+ return get_serialized_response (result )
76
105
77
106
@routes .get ("/" )
78
107
async def get_conversation (request : Request ):
79
- raise NotImplementedError ("get_conversation is not supported" )
108
+ # TODO: continuation token?
109
+ result = await handler .handle_get_conversations (
110
+ request .headers .get ("Authorization" )
111
+ )
112
+
113
+ return get_serialized_response (result )
80
114
81
115
@routes .get ("/{conversation_id}/members" )
82
116
async def get_conversation_members (request : Request ):
83
- raise NotImplementedError ("get_activity_members is not supported" )
117
+ result = await handler .handle_get_conversation_members (
118
+ request .headers .get ("Authorization" ), request .match_info ["conversation_id" ],
119
+ )
120
+
121
+ return get_serialized_response (result )
84
122
85
123
@routes .get ("/{conversation_id}/pagedmembers" )
86
124
async def get_conversation_paged_members (request : Request ):
87
- raise NotImplementedError ("get_conversation_paged_members is not supported" )
125
+ # TODO: continuation token? page size?
126
+ result = await handler .handle_get_conversation_paged_members (
127
+ request .headers .get ("Authorization" ), request .match_info ["conversation_id" ],
128
+ )
129
+
130
+ return get_serialized_response (result )
88
131
89
132
@routes .delete ("/{conversation_id}/members/{member_id}" )
90
- async def delete_conversation_members (request : Request ):
91
- raise NotImplementedError ("delete_conversation_members is not supported" )
133
+ async def delete_conversation_member (request : Request ):
134
+ result = await handler .handle_delete_conversation_member (
135
+ request .headers .get ("Authorization" ),
136
+ request .match_info ["conversation_id" ],
137
+ request .match_info ["member_id" ],
138
+ )
139
+
140
+ return get_serialized_response (result )
92
141
93
142
@routes .post ("/{conversation_id}/activities/history" )
94
- async def get_conversation_history (request : Request ):
95
- raise NotImplementedError ("get_conversation_history is not supported" )
143
+ async def send_conversation_history (request : Request ):
144
+ transcript = deserialize_from_body (request , Transcript )
145
+ result = await handler .handle_send_conversation_history (
146
+ request .headers .get ("Authorization" ),
147
+ request .match_info ["conversation_id" ],
148
+ transcript ,
149
+ )
150
+
151
+ return get_serialized_response (result )
96
152
97
153
@routes .post ("/{conversation_id}/attachments" )
98
154
async def upload_attachment (request : Request ):
99
- raise NotImplementedError ("upload_attachment is not supported" )
155
+ attachment_data = deserialize_from_body (request , AttachmentData )
156
+ result = await handler .handle_upload_attachment (
157
+ request .headers .get ("Authorization" ),
158
+ request .match_info ["conversation_id" ],
159
+ attachment_data ,
160
+ )
161
+
162
+ return get_serialized_response (result )
100
163
101
164
return routes
0 commit comments