Skip to content
This repository was archived by the owner on Mar 26, 2024. It is now read-only.

Commit 61528d0

Browse files
authored
Add beeper_inbox_state endpoint for Inbox 3.1 (#19)
1 parent 3ae02c0 commit 61528d0

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

synapse/rest/client/account_data.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,56 @@ async def on_GET(
155155
return 200, event
156156

157157

158+
class RoomBeeperInboxStateServlet(RestServlet):
159+
"""
160+
PUT /user/{user_id}/rooms/{room_id}/beeper_inbox_state HTTP/1.1
161+
"""
162+
163+
PATTERNS = client_patterns(
164+
"/user/(?P<user_id>[^/]*)/rooms/(?P<room_id>[^/]*)/beeper_inbox_state"
165+
)
166+
167+
def __init__(self, hs: "HomeServer"):
168+
super().__init__()
169+
self.auth = hs.get_auth()
170+
self.clock = hs.get_clock()
171+
self.store = hs.get_datastores().main
172+
self.handler = hs.get_account_data_handler()
173+
174+
async def on_PUT(
175+
self, request: SynapseRequest, user_id: str, room_id: str
176+
) -> Tuple[int, JsonDict]:
177+
requester = await self.auth.get_user_by_req(request)
178+
if user_id != requester.user.to_string():
179+
raise AuthError(403, "Cannot add beeper inbox state for other users.")
180+
181+
if not RoomID.is_valid(room_id):
182+
raise SynapseError(
183+
400,
184+
f"{room_id} is not a valid room ID",
185+
Codes.INVALID_PARAM,
186+
)
187+
188+
ts = self.clock.time_msec()
189+
190+
body = parse_json_object_from_request(request)
191+
192+
if body.get("marked_unread"):
193+
marked_unread = {"unread": body["marked_unread"], "ts": ts}
194+
await self.handler.add_account_data_to_room(
195+
user_id, room_id, "m.marked_unread", marked_unread
196+
)
197+
198+
if body.get("done"):
199+
done = {"updated_ts": ts, "at_ts": ts + body["done"].get("at_delta", 0)}
200+
await self.handler.add_account_data_to_room(
201+
user_id, room_id, "com.beeper.inbox.done", done
202+
)
203+
204+
return 200, {}
205+
206+
158207
def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
159208
AccountDataServlet(hs).register(http_server)
160209
RoomAccountDataServlet(hs).register(http_server)
210+
RoomBeeperInboxStateServlet(hs).register(http_server)

tests/rest/client/test_account_data.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,62 @@ def test_on_account_data_updated_callback(self) -> None:
7373
mocked_callback.assert_called_with(
7474
user_id, room_id, account_data_type, account_data_content
7575
)
76+
77+
def test_beeper_inbox_state_endpoint(self) -> None:
78+
store = self.hs.get_datastores().main
79+
80+
user_id = self.register_user("user", "password")
81+
tok = self.login("user", "password")
82+
83+
room_id = self.helper.create_room_as(user_id, tok=tok)
84+
channel = self.make_request(
85+
"PUT",
86+
f"/user/{user_id}/rooms/{room_id}/beeper_inbox_state",
87+
{},
88+
access_token=tok,
89+
)
90+
91+
self.assertEqual(channel.code, 200, channel.result)
92+
self.assertIsNone(
93+
self.get_success(
94+
store.get_account_data_for_room_and_type(
95+
user_id, room_id, "com.beeper.inbox.done"
96+
)
97+
)
98+
)
99+
self.assertIsNone(
100+
self.get_success(
101+
store.get_account_data_for_room_and_type(
102+
user_id, room_id, "m.marked_unread"
103+
)
104+
)
105+
)
106+
107+
channel = self.make_request(
108+
"PUT",
109+
f"/user/{user_id}/rooms/{room_id}/beeper_inbox_state",
110+
{"done": {"at_delta": 1000 * 60 * 5}, "marked_unread": True},
111+
access_token=tok,
112+
)
113+
114+
self.assertEqual(channel.code, 200, channel.result)
115+
116+
# FIXME: I give up, I don't know how to mock time in tests
117+
# ts = self.clock.time_msec()
118+
ts = 500
119+
120+
done = self.get_success(
121+
store.get_account_data_for_room_and_type(
122+
user_id, room_id, "com.beeper.inbox.done"
123+
)
124+
)
125+
self.assertEqual(done["updated_ts"], ts)
126+
self.assertEqual(done["at_ts"], ts + (1000 * 60 * 5))
127+
128+
marked_unread = self.get_success(
129+
store.get_account_data_for_room_and_type(
130+
user_id, room_id, "m.marked_unread"
131+
)
132+
)
133+
self.assertEqual(marked_unread["unread"], True)
134+
self.assertEqual(marked_unread["ts"], ts)

0 commit comments

Comments
 (0)