Skip to content

Commit 023b1fc

Browse files
authored
Merge pull request #9306 from Couchers-org/na/backend/split-shared-convo-types-proto
Backend: Split shared conversation types into a leaf proto file
2 parents 054133d + 92aacb9 commit 023b1fc

31 files changed

Lines changed: 236 additions & 220 deletions

app/backend/src/couchers/email/emails.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
from couchers.i18n.localize import format_phone_number
5252
from couchers.markup import html_link, html_mailto_link, markdown_to_plaintext
5353
from couchers.notifications.quick_links import generate_quick_decline_link
54-
from couchers.proto import conversations_pb2, events_pb2, notification_data_pb2
54+
from couchers.proto import events_pb2, messages_pb2, notification_data_pb2
5555
from couchers.utils import now, to_aware_datetime
5656

5757
# Common string keys
@@ -1445,20 +1445,20 @@ class HostRequestStatusChangedEmail(EmailBase):
14451445
other_user: UserInfo
14461446
from_date: date
14471447
to_date: date
1448-
new_status: conversations_pb2.HostRequestStatus.ValueType
1448+
new_status: messages_pb2.HostRequestStatus.ValueType
14491449
view_link: str
14501450

14511451
@property
14521452
def string_key_base(self) -> str:
14531453
base_key = "host_requests.status_changed"
14541454
match self.new_status:
1455-
case conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED:
1455+
case messages_pb2.HOST_REQUEST_STATUS_ACCEPTED:
14561456
return f"{base_key}.accepted_by_host"
1457-
case conversations_pb2.HOST_REQUEST_STATUS_REJECTED:
1457+
case messages_pb2.HOST_REQUEST_STATUS_REJECTED:
14581458
return f"{base_key}.declined_by_host"
1459-
case conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED:
1459+
case messages_pb2.HOST_REQUEST_STATUS_CONFIRMED:
14601460
return f"{base_key}.confirmed_by_surfer"
1461-
case conversations_pb2.HOST_REQUEST_STATUS_CANCELLED:
1461+
case messages_pb2.HOST_REQUEST_STATUS_CANCELLED:
14621462
return f"{base_key}.cancelled_by_surfer"
14631463
case _:
14641464
raise ValueError(f"Unexpected host request status: {self.new_status}")
@@ -1492,20 +1492,20 @@ def from_notification(
14921492
user_name: str,
14931493
) -> Self:
14941494
other_user: UserInfo
1495-
new_status: conversations_pb2.HostRequestStatus.ValueType
1495+
new_status: messages_pb2.HostRequestStatus.ValueType
14961496
match data:
14971497
case notification_data_pb2.HostRequestAccept():
14981498
other_user = UserInfo.from_protobuf(data.host)
1499-
new_status = conversations_pb2.HostRequestStatus.HOST_REQUEST_STATUS_ACCEPTED
1499+
new_status = messages_pb2.HostRequestStatus.HOST_REQUEST_STATUS_ACCEPTED
15001500
case notification_data_pb2.HostRequestReject():
15011501
other_user = UserInfo.from_protobuf(data.host)
1502-
new_status = conversations_pb2.HostRequestStatus.HOST_REQUEST_STATUS_REJECTED
1502+
new_status = messages_pb2.HostRequestStatus.HOST_REQUEST_STATUS_REJECTED
15031503
case notification_data_pb2.HostRequestConfirm():
15041504
other_user = UserInfo.from_protobuf(data.surfer)
1505-
new_status = conversations_pb2.HostRequestStatus.HOST_REQUEST_STATUS_CONFIRMED
1505+
new_status = messages_pb2.HostRequestStatus.HOST_REQUEST_STATUS_CONFIRMED
15061506
case notification_data_pb2.HostRequestCancel():
15071507
other_user = UserInfo.from_protobuf(data.surfer)
1508-
new_status = conversations_pb2.HostRequestStatus.HOST_REQUEST_STATUS_CANCELLED
1508+
new_status = messages_pb2.HostRequestStatus.HOST_REQUEST_STATUS_CANCELLED
15091509
case _:
15101510
# Enable mypy's exhaustiveness checking
15111511
assert_never("Unexpected host request status changed notification data type.")
@@ -1526,14 +1526,14 @@ def test_instances(cls) -> list[Self]:
15261526
other_user=UserInfo.dummy_bob(),
15271527
from_date=date(2025, 6, 1),
15281528
to_date=date(2025, 6, 7),
1529-
new_status=conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED,
1529+
new_status=messages_pb2.HOST_REQUEST_STATUS_ACCEPTED,
15301530
view_link="https://couchers.org/requests/123",
15311531
)
15321532
return [
1533-
replace(prototype, new_status=conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED),
1534-
replace(prototype, new_status=conversations_pb2.HOST_REQUEST_STATUS_REJECTED),
1535-
replace(prototype, new_status=conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED),
1536-
replace(prototype, new_status=conversations_pb2.HOST_REQUEST_STATUS_CANCELLED),
1533+
replace(prototype, new_status=messages_pb2.HOST_REQUEST_STATUS_ACCEPTED),
1534+
replace(prototype, new_status=messages_pb2.HOST_REQUEST_STATUS_REJECTED),
1535+
replace(prototype, new_status=messages_pb2.HOST_REQUEST_STATUS_CONFIRMED),
1536+
replace(prototype, new_status=messages_pb2.HOST_REQUEST_STATUS_CANCELLED),
15371537
]
15381538

15391539

app/backend/src/couchers/servicers/auth_unsubscribe.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
)
2121
from couchers.notifications import settings
2222
from couchers.notifications.utils import enum_from_topic_action
23-
from couchers.proto import conversations_pb2, requests_pb2
23+
from couchers.proto import messages_pb2, requests_pb2
2424
from couchers.proto.internal import unsubscribe_pb2
2525
from couchers.servicers.requests import Requests
2626
from couchers.sql import where_moderated_content_visible
@@ -83,7 +83,7 @@ def handle_unsubscribe(payload: unsubscribe_pb2.UnsubscribePayload, context: Cou
8383
Requests().RespondHostRequest(
8484
request=requests_pb2.RespondHostRequestReq(
8585
host_request_id=payload.host_request_quick_decline.host_request_id,
86-
status=conversations_pb2.HOST_REQUEST_STATUS_REJECTED,
86+
status=messages_pb2.HOST_REQUEST_STATUS_REJECTED,
8787
),
8888
context=make_one_off_interactive_user_context(couchers_context=context, user_id=payload.user_id),
8989
session=session,

app/backend/src/couchers/servicers/conversations.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from couchers.models.notifications import NotificationTopicAction
3131
from couchers.moderation.utils import create_moderation
3232
from couchers.notifications.notify import mark_notifications_seen, notify
33-
from couchers.proto import conversations_pb2, conversations_pb2_grpc, notification_data_pb2
33+
from couchers.proto import conversations_pb2, conversations_pb2_grpc, messages_pb2, notification_data_pb2
3434
from couchers.proto.internal import jobs_pb2
3535
from couchers.rate_limits.check import process_rate_limits_and_check_abort
3636
from couchers.rate_limits.definitions import RATE_LIMIT_HOURS
@@ -45,52 +45,48 @@
4545
MAX_PAGE_SIZE = 50
4646

4747

48-
def _message_to_pb(message: Message) -> conversations_pb2.Message:
48+
def _message_to_pb(message: Message) -> messages_pb2.Message:
4949
"""
5050
Turns the given message to a protocol buffer
5151
"""
5252
if message.is_normal_message:
53-
return conversations_pb2.Message(
53+
return messages_pb2.Message(
5454
message_id=message.id,
5555
author_user_id=message.author_id,
5656
time=Timestamp_from_datetime(message.time),
57-
text=conversations_pb2.MessageContentText(text=message.text),
57+
text=messages_pb2.MessageContentText(text=message.text),
5858
)
5959
else:
60-
return conversations_pb2.Message(
60+
return messages_pb2.Message(
6161
message_id=message.id,
6262
author_user_id=message.author_id,
6363
time=Timestamp_from_datetime(message.time),
6464
chat_created=(
65-
conversations_pb2.MessageContentChatCreated()
66-
if message.message_type == MessageType.chat_created
67-
else None
65+
messages_pb2.MessageContentChatCreated() if message.message_type == MessageType.chat_created else None
6866
),
6967
chat_edited=(
70-
conversations_pb2.MessageContentChatEdited()
71-
if message.message_type == MessageType.chat_edited
72-
else None
68+
messages_pb2.MessageContentChatEdited() if message.message_type == MessageType.chat_edited else None
7369
),
7470
user_invited=(
75-
conversations_pb2.MessageContentUserInvited(target_user_id=message.target_id)
71+
messages_pb2.MessageContentUserInvited(target_user_id=message.target_id)
7672
if message.message_type == MessageType.user_invited
7773
else None
7874
),
7975
user_left=(
80-
conversations_pb2.MessageContentUserLeft() if message.message_type == MessageType.user_left else None
76+
messages_pb2.MessageContentUserLeft() if message.message_type == MessageType.user_left else None
8177
),
8278
user_made_admin=(
83-
conversations_pb2.MessageContentUserMadeAdmin(target_user_id=message.target_id)
79+
messages_pb2.MessageContentUserMadeAdmin(target_user_id=message.target_id)
8480
if message.message_type == MessageType.user_made_admin
8581
else None
8682
),
8783
user_removed_admin=(
88-
conversations_pb2.MessageContentUserRemovedAdmin(target_user_id=message.target_id)
84+
messages_pb2.MessageContentUserRemovedAdmin(target_user_id=message.target_id)
8985
if message.message_type == MessageType.user_removed_admin
9086
else None
9187
),
9288
group_chat_user_removed=(
93-
conversations_pb2.MessageContentUserRemoved(target_user_id=message.target_id)
89+
messages_pb2.MessageContentUserRemoved(target_user_id=message.target_id)
9490
if message.message_type == MessageType.user_removed
9591
else None
9692
),

app/backend/src/couchers/servicers/requests.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@
3636
from couchers.models.public_trips import PublicTrip, PublicTripStatus
3737
from couchers.moderation.utils import create_moderation
3838
from couchers.notifications.notify import mark_notifications_seen, notify
39-
from couchers.proto import conversations_pb2, notification_data_pb2, requests_pb2, requests_pb2_grpc
39+
from couchers.proto import (
40+
messages_pb2,
41+
notification_data_pb2,
42+
requests_pb2,
43+
requests_pb2_grpc,
44+
)
4045
from couchers.rate_limits.check import process_rate_limits_and_check_abort
4146
from couchers.rate_limits.definitions import RATE_LIMIT_HOURS
4247
from couchers.servicers.api import response_rate_to_pb, user_model_to_pb
@@ -57,19 +62,19 @@
5762

5863

5964
hostrequeststatus2api = {
60-
HostRequestStatus.pending: conversations_pb2.HOST_REQUEST_STATUS_PENDING,
61-
HostRequestStatus.accepted: conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED,
62-
HostRequestStatus.rejected: conversations_pb2.HOST_REQUEST_STATUS_REJECTED,
63-
HostRequestStatus.confirmed: conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED,
64-
HostRequestStatus.cancelled: conversations_pb2.HOST_REQUEST_STATUS_CANCELLED,
65+
HostRequestStatus.pending: messages_pb2.HOST_REQUEST_STATUS_PENDING,
66+
HostRequestStatus.accepted: messages_pb2.HOST_REQUEST_STATUS_ACCEPTED,
67+
HostRequestStatus.rejected: messages_pb2.HOST_REQUEST_STATUS_REJECTED,
68+
HostRequestStatus.confirmed: messages_pb2.HOST_REQUEST_STATUS_CONFIRMED,
69+
HostRequestStatus.cancelled: messages_pb2.HOST_REQUEST_STATUS_CANCELLED,
6570
}
6671

6772
api2hostrequeststatus = {
68-
conversations_pb2.HOST_REQUEST_STATUS_PENDING: HostRequestStatus.pending,
69-
conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED: HostRequestStatus.accepted,
70-
conversations_pb2.HOST_REQUEST_STATUS_REJECTED: HostRequestStatus.rejected,
71-
conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED: HostRequestStatus.confirmed,
72-
conversations_pb2.HOST_REQUEST_STATUS_CANCELLED: HostRequestStatus.cancelled,
73+
messages_pb2.HOST_REQUEST_STATUS_PENDING: HostRequestStatus.pending,
74+
messages_pb2.HOST_REQUEST_STATUS_ACCEPTED: HostRequestStatus.accepted,
75+
messages_pb2.HOST_REQUEST_STATUS_REJECTED: HostRequestStatus.rejected,
76+
messages_pb2.HOST_REQUEST_STATUS_CONFIRMED: HostRequestStatus.confirmed,
77+
messages_pb2.HOST_REQUEST_STATUS_CANCELLED: HostRequestStatus.cancelled,
7378
}
7479

7580
hostrequestquality2sql = {
@@ -79,29 +84,27 @@
7984
}
8085

8186

82-
def message_to_pb(message: Message) -> conversations_pb2.Message:
87+
def message_to_pb(message: Message) -> messages_pb2.Message:
8388
"""
8489
Turns the given message to a protocol buffer
8590
"""
8691
if message.is_normal_message:
87-
return conversations_pb2.Message(
92+
return messages_pb2.Message(
8893
message_id=message.id,
8994
author_user_id=message.author_id,
9095
time=Timestamp_from_datetime(message.time),
91-
text=conversations_pb2.MessageContentText(text=message.text),
96+
text=messages_pb2.MessageContentText(text=message.text),
9297
)
9398
else:
94-
return conversations_pb2.Message(
99+
return messages_pb2.Message(
95100
message_id=message.id,
96101
author_user_id=message.author_id,
97102
time=Timestamp_from_datetime(message.time),
98103
chat_created=(
99-
conversations_pb2.MessageContentChatCreated()
100-
if message.message_type == MessageType.chat_created
101-
else None
104+
messages_pb2.MessageContentChatCreated() if message.message_type == MessageType.chat_created else None
102105
),
103106
host_request_status_changed=(
104-
conversations_pb2.MessageContentHostRequestStatusChanged(
107+
messages_pb2.MessageContentHostRequestStatusChanged(
105108
status=hostrequeststatus2api[message.host_request_status_target] # type: ignore[index]
106109
)
107110
if message.message_type == MessageType.host_request_status_changed
@@ -575,7 +578,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None:
575578
if host_request.initiator_user_id != context.user_id and host_request.recipient_user_id != context.user_id:
576579
context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found")
577580

578-
if request.status == conversations_pb2.HOST_REQUEST_STATUS_PENDING:
581+
if request.status == messages_pb2.HOST_REQUEST_STATUS_PENDING:
579582
context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status")
580583

581584
if host_request.end_time < now():
@@ -587,7 +590,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None:
587590
author_id=context.user_id,
588591
)
589592

590-
if request.status == conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED:
593+
if request.status == messages_pb2.HOST_REQUEST_STATUS_ACCEPTED:
591594
# only host can accept
592595
if context.user_id != host_request.recipient_user_id:
593596
context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "not_the_host")
@@ -633,7 +636,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None:
633636
},
634637
)
635638

636-
if request.status == conversations_pb2.HOST_REQUEST_STATUS_REJECTED:
639+
if request.status == messages_pb2.HOST_REQUEST_STATUS_REJECTED:
637640
# only host can reject
638641
if context.user_id != host_request.recipient_user_id:
639642
context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status")
@@ -676,7 +679,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None:
676679
},
677680
)
678681

679-
if request.status == conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED:
682+
if request.status == messages_pb2.HOST_REQUEST_STATUS_CONFIRMED:
680683
# only surfer can confirm
681684
if context.user_id != host_request.initiator_user_id:
682685
context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status")
@@ -717,7 +720,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None:
717720
},
718721
)
719722

720-
if request.status == conversations_pb2.HOST_REQUEST_STATUS_CANCELLED:
723+
if request.status == messages_pb2.HOST_REQUEST_STATUS_CANCELLED:
721724
# only surfer can cancel
722725
if context.user_id != host_request.initiator_user_id:
723726
context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status")

app/backend/src/tests/test_account.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
Upload,
2323
User,
2424
)
25-
from couchers.proto import account_pb2, api_pb2, auth_pb2, conversations_pb2, requests_pb2
25+
from couchers.proto import account_pb2, api_pb2, auth_pb2, messages_pb2, requests_pb2
2626
from couchers.utils import now, today
2727
from tests.fixtures.db import generate_user, make_volunteer
2828
from tests.fixtures.misc import EmailCollector, PushCollector, process_jobs
@@ -1075,7 +1075,7 @@ def test_reminders(db, moderator):
10751075
with requests_session(token) as api:
10761076
api.RespondHostRequest(
10771077
requests_pb2.RespondHostRequestReq(
1078-
host_request_id=host_request1_id, status=conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED
1078+
host_request_id=host_request1_id, status=messages_pb2.HOST_REQUEST_STATUS_ACCEPTED
10791079
)
10801080
)
10811081

@@ -1150,7 +1150,7 @@ def test_confirm_host_request_reminder(db, moderator):
11501150
with requests_session(host_token) as api:
11511151
api.RespondHostRequest(
11521152
requests_pb2.RespondHostRequestReq(
1153-
host_request_id=host_request_id, status=conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED
1153+
host_request_id=host_request_id, status=messages_pb2.HOST_REQUEST_STATUS_ACCEPTED
11541154
)
11551155
)
11561156

@@ -1165,7 +1165,7 @@ def test_confirm_host_request_reminder(db, moderator):
11651165
with requests_session(surfer_token) as api:
11661166
api.RespondHostRequest(
11671167
requests_pb2.RespondHostRequestReq(
1168-
host_request_id=host_request_id, status=conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED
1168+
host_request_id=host_request_id, status=messages_pb2.HOST_REQUEST_STATUS_CONFIRMED
11691169
)
11701170
)
11711171

app/backend/src/tests/test_bg_jobs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
UserBlock,
5454
Volunteer,
5555
)
56-
from couchers.proto import conversations_pb2, requests_pb2
56+
from couchers.proto import conversations_pb2, messages_pb2, requests_pb2
5757
from couchers.proto.internal import jobs_pb2
5858
from couchers.utils import now, today
5959
from tests.fixtures.db import generate_user, make_friends, make_user_block, make_volunteer
@@ -703,7 +703,7 @@ def test_send_request_notifications_host_request(db, moderator):
703703
requests.RespondHostRequest(
704704
requests_pb2.RespondHostRequestReq(
705705
host_request_id=host_request_id,
706-
status=conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED,
706+
status=messages_pb2.HOST_REQUEST_STATUS_ACCEPTED,
707707
text="Test request",
708708
)
709709
)
@@ -1438,7 +1438,7 @@ def test_send_request_notifications_blocked_users_no_notification(db, moderator)
14381438
requests.RespondHostRequest(
14391439
requests_pb2.RespondHostRequestReq(
14401440
host_request_id=host_request_id,
1441-
status=conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED,
1441+
status=messages_pb2.HOST_REQUEST_STATUS_ACCEPTED,
14421442
text="Accepting your request",
14431443
)
14441444
)

0 commit comments

Comments
 (0)