8000 Updates to controller · ericmicrofocus/botbuilder-python@0517074 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0517074

Browse files
committed
Updates to controller
1 parent d36aac6 commit 0517074

File tree

2 files changed

+89
-37
lines changed

2 files changed

+89
-37
lines changed
Lines changed: 83 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,38 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
3+
import json
4+
from typing import List, Union, Type
35

46
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
714

815
from .channel_service_handler import ChannelServiceHandler
916

1017

11-
async def deserialize_activity(request: Request) -> Activity:
18+
async def deserialize_from_body(
19+
request: Request, target_model: Type[Model]
20+
) -> Activity:
1221
if "application/json" in request.headers["Content-Type"]:
1322
body = await request.json()
1423
else:
1524
return Response(status=415)
1625

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")
1836

1937

2038
def channel_service_routes(handler: ChannelServiceHandler) -> RouteTableDef:
@@ -23,38 +41,38 @@ def channel_service_routes(handler: ChannelServiceHandler) -> RouteTableDef:
2341

2442
@routes.post("/{conversation_id}/activities")
2543
async def send_to_conversation(request: Request):
26-
activity = await deserialize_activity(request)
44+
activity = await deserialize_from_body(request, Activity)
2745
result = await handler.handle_send_to_conversation(
2846
request.headers.get("Authorization"),
2947
request.match_info["conversation_id"],
3048
activity,
3149
)
3250

33-
return Response(body=result.serialize())
51+
return get_serialized_response(result)
3452

3553
@routes.post("/{conversation_id}/activities/{activity_id}")
3654
async def reply_to_activity(request: Request):
37-
activity = await deserialize_activity(request)
55+
activity = await deserialize_from_body(request, Activity)
3856
result = await handler.handle_reply_to_activity(
3957
request.headers.get("Authorization"),
4058
request.match_info["conversation_id"],
4159
request.match_info["activity_id"],
4260
activity,
4361
)
4462

45-
return Response(body=result.serialize())
63+
return get_serialized_response(result)
4664

4765
@routes.put("/{conversation_id}/activities/{activity_id}")
4866
async def update_activity(request: Request):
49-
activity = await deserialize_activity(request)
67+
activity = await deserialize_from_body(request, Activity)
5068
result = await handler.handle_update_activity(
5169
request.headers.get("Authorization"),
5270
request.match_info["conversation_id"],
5371
request.match_info["activity_id"],
5472
activity,
5573
)
5674

57-
return Response(body=result.serialize())
75+
return get_serialized_response(result)
5876

5977
@routes.delete("/{conversation_id}/activities/{activity_id}")
6078
async def delete_activity(request: Request):
@@ -68,34 +86,79 @@ async def delete_activity(request: Request):
6886

6987
@routes.get("/{conversation_id}/activities/{activity_id}/members")
7088
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)
7296

7397
@routes.post("/")
7498
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)
76105

77106
@routes.get("/")
78107
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)
80114

81115
@routes.get("/{conversation_id}/members")
82116
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)
84122

85123
@routes.get("/{conversation_id}/pagedmembers")
86124
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)
88131

89132
@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)
92141

93142
@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)
96152

97153
@routes.post("/{conversation_id}/attachments")
98154
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)
100163

101164
return routes

libraries/botbuilder-core/botbuilder/core/integration/channel_service_handler.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,16 @@ async def handle_get_activity_members(
8383
)
8484

8585
async def handle_create_conversation(
86-
self, auth_header, conversation_id, parameters: ConversationParameters
86+
self, auth_header, parameters: ConversationParameters
8787
) -> ConversationResourceResponse:
8888
claims_identity = await self._authenticate(auth_header)
89-
return await self.on_create_conversation(
90-
claims_identity, conversation_id, parameters
91-
)
89+
return await self.on_create_conversation(claims_identity, parameters)
9290

9391
async def handle_get_conversations(
94-
self, auth_header, conversation_id, continuation_token: str = ""
92+
self, auth_header, continuation_token: str = ""
9593
) -> ConversationsResult:
9694
claims_identity = await self._authenticate(auth_header)
97-
return await self.on_get_conversations(
98-
claims_identity, conversation_id, continuation_token
99-
)
95+
return await self.on_get_conversations(claims_identity, continuation_token)
10096

10197
async def handle_get_conversation_members(
10298
self, auth_header, conversation_id
@@ -141,10 +137,7 @@ async def handle_upload_attachment(
141137
)
142138

143139
async def on_get_conversations(
144-
self,
145-
claims_identity: ClaimsIdentity,
146-
conversation_id: str,
147-
continuation_token: str = "",
140+
self, claims_identity: ClaimsIdentity, continuation_token: str = "",
148141
) -> ConversationsResult:
149142
"""
150143
get_conversations() API for Skill
@@ -169,10 +162,7 @@ async def on_get_conversations(
169162
raise NotImplementedError()
170163

171164
async def on_create_conversation(
172-
self,
173-
claims_identity: ClaimsIdentity,
174-
conversation_id: str,
175-
parameters: ConversationParameters,
165+
self, claims_identity: ClaimsIdentity, parameters: ConversationParameters,
176166
) -> ConversationResourceResponse:
177167
"""
178168
create_conversation() API for Skill
@@ -200,7 +190,6 @@ async def on_create_conversation(
200190
end.
201191
202192
:param claims_identity:
203-
:param conversation_id:
204193
:param parameters:
205194
:return:
206195
"""

0 commit comments

Comments
 (0)
0