diff --git a/.cursorrules b/.cursorrules index 7142fd2f8f..5953f5766d 100644 --- a/.cursorrules +++ b/.cursorrules @@ -86,3 +86,4 @@ To run the app locally in development, use `yarn start` (not Docker) - Run tests with `make test file=` in the backend folder - See `/app/backend/readme.md` for more details +- Always add a downgrade to migrations when possible and relevant. diff --git a/app/backend/src/couchers/jobs/handlers.py b/app/backend/src/couchers/jobs/handlers.py index d35eca13c5..9d26928652 100644 --- a/app/backend/src/couchers/jobs/handlers.py +++ b/app/backend/src/couchers/jobs/handlers.py @@ -305,8 +305,8 @@ def send_request_notifications(payload: empty_pb2.Empty) -> None: select(1) .select_from(HostRequest) .join(Message, Message.conversation_id == HostRequest.conversation_id) - .where(HostRequest.surfer_user_id == User.id) - .where(Message.id > HostRequest.surfer_last_seen_message_id) + .where(HostRequest.initiator_user_id == User.id) + .where(Message.id > HostRequest.initiator_last_seen_message_id) .where(Message.id > User.last_notified_request_message_id) .where(Message.time < now() - timedelta(minutes=5)) .where(Message.message_type == MessageType.text) @@ -316,8 +316,8 @@ def send_request_notifications(payload: empty_pb2.Empty) -> None: select(1) .select_from(HostRequest) .join(Message, Message.conversation_id == HostRequest.conversation_id) - .where(HostRequest.host_user_id == User.id) - .where(Message.id > HostRequest.host_last_seen_message_id) + .where(HostRequest.recipient_user_id == User.id) + .where(Message.id > HostRequest.recipient_last_seen_message_id) .where(Message.id > User.last_notified_request_message_id) .where(Message.time < now() - timedelta(minutes=5)) .where(Message.message_type == MessageType.text) @@ -338,15 +338,15 @@ def send_request_notifications(payload: empty_pb2.Empty) -> None: where_moderated_content_visible_to_user_column( select(User, HostRequest, func.max(Message.id)) .where(User.id == user_id) - .join(HostRequest, HostRequest.surfer_user_id == User.id), + .join(HostRequest, HostRequest.initiator_user_id == User.id), HostRequest, - HostRequest.surfer_user_id, + HostRequest.initiator_user_id, ), context, - HostRequest.host_user_id, + HostRequest.recipient_user_id, ) .join(Message, Message.conversation_id == HostRequest.conversation_id) - .where(Message.id > HostRequest.surfer_last_seen_message_id) + .where(Message.id > HostRequest.initiator_last_seen_message_id) .where(Message.id > User.last_notified_request_message_id) .where(Message.time < now() - timedelta(minutes=5)) .where(Message.message_type == MessageType.text) @@ -359,15 +359,15 @@ def send_request_notifications(payload: empty_pb2.Empty) -> None: where_moderated_content_visible_to_user_column( select(User, HostRequest, func.max(Message.id)) .where(User.id == user_id) - .join(HostRequest, HostRequest.host_user_id == User.id), + .join(HostRequest, HostRequest.recipient_user_id == User.id), HostRequest, - HostRequest.host_user_id, + HostRequest.recipient_user_id, ), context, - HostRequest.surfer_user_id, + HostRequest.initiator_user_id, ) .join(Message, Message.conversation_id == HostRequest.conversation_id) - .where(Message.id > HostRequest.host_last_seen_message_id) + .where(Message.id > HostRequest.recipient_last_seen_message_id) .where(Message.id > User.last_notified_request_message_id) .where(Message.time < now() - timedelta(minutes=5)) .where(Message.message_type == MessageType.text) @@ -385,7 +385,7 @@ def send_request_notifications(payload: empty_pb2.Empty) -> None: key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestMissedMessages( host_request=host_request_to_pb(host_request, session, context), - user=user_model_to_pb(host_request.host, session, context), + user=user_model_to_pb(host_request.recipient, session, context), am_host=False, ), ) @@ -401,7 +401,7 @@ def send_request_notifications(payload: empty_pb2.Empty) -> None: key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestMissedMessages( host_request=host_request_to_pb(host_request, session, context), - user=user_model_to_pb(host_request.surfer, session, context), + user=user_model_to_pb(host_request.initiator, session, context), am_host=True, ), ) @@ -482,42 +482,42 @@ def send_reference_reminders(payload: empty_pb2.Empty) -> None: # surfers needing to write a ref q1 = ( select(literal(True), HostRequest, user, other_user) - .join(user, user.id == HostRequest.surfer_user_id) - .join(other_user, other_user.id == HostRequest.host_user_id) + .join(user, user.id == HostRequest.initiator_user_id) + .join(other_user, other_user.id == HostRequest.recipient_user_id) .outerjoin( Reference, and_( Reference.host_request_id == HostRequest.conversation_id, # if no reference is found in this join, then the surfer has not written a ref - Reference.from_user_id == HostRequest.surfer_user_id, + Reference.from_user_id == HostRequest.initiator_user_id, ), ) .where(Reference.id == None) .where(HostRequest.can_write_reference) - .where(HostRequest.surfer_sent_reference_reminders < reminder_number) + .where(HostRequest.initiator_sent_reference_reminders < reminder_number) .where(HostRequest.end_time_to_write_reference - reminder_time < now()) - .where(HostRequest.surfer_reason_didnt_meetup == None) + .where(HostRequest.initiator_reason_didnt_meetup == None) .where(users_visible_to_each_other(user, other_user)) ) # hosts needing to write a ref q2 = ( select(literal(False), HostRequest, user, other_user) - .join(user, user.id == HostRequest.host_user_id) - .join(other_user, other_user.id == HostRequest.surfer_user_id) + .join(user, user.id == HostRequest.recipient_user_id) + .join(other_user, other_user.id == HostRequest.initiator_user_id) .outerjoin( Reference, and_( Reference.host_request_id == HostRequest.conversation_id, # if no reference is found in this join, then the host has not written a ref - Reference.from_user_id == HostRequest.host_user_id, + Reference.from_user_id == HostRequest.recipient_user_id, ), ) .where(Reference.id == None) .where(HostRequest.can_write_reference) - .where(HostRequest.host_sent_reference_reminders < reminder_number) + .where(HostRequest.recipient_sent_reference_reminders < reminder_number) .where(HostRequest.end_time_to_write_reference - reminder_time < now()) - .where(HostRequest.host_reason_didnt_meetup == None) + .where(HostRequest.recipient_reason_didnt_meetup == None) .where(users_visible_to_each_other(user, other_user)) ) @@ -551,16 +551,16 @@ def send_reference_reminders(payload: empty_pb2.Empty) -> None: ), ) if surfed: - host_request.surfer_sent_reference_reminders = reminder_number + host_request.initiator_sent_reference_reminders = reminder_number else: - host_request.host_sent_reference_reminders = reminder_number + host_request.recipient_sent_reference_reminders = reminder_number session.commit() def send_host_request_reminders(payload: empty_pb2.Empty) -> None: with session_scope() as session: host_has_sent_message = select(1).where( - Message.conversation_id == HostRequest.conversation_id, Message.author_id == HostRequest.host_user_id + Message.conversation_id == HostRequest.conversation_id, Message.author_id == HostRequest.recipient_user_id ) requests = ( @@ -569,15 +569,15 @@ def send_host_request_reminders(payload: empty_pb2.Empty) -> None: where_moderated_content_visible_to_user_column( select(HostRequest), HostRequest, - HostRequest.host_user_id, + HostRequest.recipient_user_id, ) .where(HostRequest.status == HostRequestStatus.pending) - .where(HostRequest.host_sent_request_reminders < HOST_REQUEST_MAX_REMINDERS) + .where(HostRequest.recipient_sent_request_reminders < HOST_REQUEST_MAX_REMINDERS) .where(HostRequest.start_time > func.now()) .where((func.now() - HostRequest.last_sent_request_reminder_time) >= HOST_REQUEST_REMINDER_INTERVAL) .where(~exists(host_has_sent_message)), - HostRequest.host_user_id, - HostRequest.surfer_user_id, + HostRequest.recipient_user_id, + HostRequest.initiator_user_id, ) ) .scalars() @@ -585,18 +585,18 @@ def send_host_request_reminders(payload: empty_pb2.Empty) -> None: ) for host_request in requests: - host_request.host_sent_request_reminders += 1 + host_request.recipient_sent_request_reminders += 1 host_request.last_sent_request_reminder_time = now() - context = make_background_user_context(user_id=host_request.host_user_id) + context = make_background_user_context(user_id=host_request.recipient_user_id) notify( session, - user_id=host_request.host_user_id, + user_id=host_request.recipient_user_id, topic_action=NotificationTopicAction.host_request__reminder, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestReminder( host_request=host_request_to_pb(host_request, session, context), - surfer=user_model_to_pb(host_request.surfer, session, context), + surfer=user_model_to_pb(host_request.initiator, session, context), ), moderation_state_id=host_request.moderation_state_id, ) diff --git a/app/backend/src/couchers/materialized_views.py b/app/backend/src/couchers/materialized_views.py index 2368642517..b400b7c24c 100644 --- a/app/backend/src/couchers/materialized_views.py +++ b/app/backend/src/couchers/materialized_views.py @@ -306,11 +306,13 @@ def float_(stmt: Any) -> Any: all_responses = union_all( # host request responses sa_select( - HostRequest.host_user_id.label("user_id"), + HostRequest.recipient_user_id.label("user_id"), (s.c.time - t.c.time).label("response_time"), ) .join(t, t.c.conversation_id == HostRequest.conversation_id) - .outerjoin(s, and_(s.c.conversation_id == HostRequest.conversation_id, s.c.author_id == HostRequest.host_user_id)), + .outerjoin( + s, and_(s.c.conversation_id == HostRequest.conversation_id, s.c.author_id == HostRequest.recipient_user_id) + ), # activeness probes sa_select( ActivenessProbe.user_id, diff --git a/app/backend/src/couchers/metrics.py b/app/backend/src/couchers/metrics.py index f7ec76044b..c173e0f5af 100644 --- a/app/backend/src/couchers/metrics.py +++ b/app/backend/src/couchers/metrics.py @@ -172,8 +172,8 @@ def f() -> Any: "couchers_users_sent_request", "Total number of users who have sent a host request", ( - select(func.count(distinct(HostRequest.surfer_user_id))) - .join(User, User.id == HostRequest.surfer_user_id) + select(func.count(distinct(HostRequest.initiator_user_id))) + .join(User, User.id == HostRequest.initiator_user_id) .where(User.is_visible) ), ) diff --git a/app/backend/src/couchers/migrations/versions/0140_rename_host_request_user_columns_v2.py b/app/backend/src/couchers/migrations/versions/0140_rename_host_request_user_columns_v2.py new file mode 100644 index 0000000000..d80e77fb59 --- /dev/null +++ b/app/backend/src/couchers/migrations/versions/0140_rename_host_request_user_columns_v2.py @@ -0,0 +1,89 @@ +"""Rename host_request user columns to initiator/recipient + +Revision ID: 0140 +Revises: 0139 +Create Date: 2026-01-25 12:00:00.000000 + +""" + +from alembic import op + +# revision identifiers, used by Alembic. +revision = "0140" +down_revision = "0139" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # Rename user ID columns + op.alter_column("host_requests", "surfer_user_id", new_column_name="initiator_user_id") + op.alter_column("host_requests", "host_user_id", new_column_name="recipient_user_id") + + # Rename other host/surfer columns + op.alter_column("host_requests", "is_host_archived", new_column_name="is_recipient_archived") + op.alter_column("host_requests", "is_surfer_archived", new_column_name="is_initiator_archived") + op.alter_column("host_requests", "host_last_seen_message_id", new_column_name="recipient_last_seen_message_id") + op.alter_column("host_requests", "surfer_last_seen_message_id", new_column_name="initiator_last_seen_message_id") + op.alter_column( + "host_requests", "host_sent_reference_reminders", new_column_name="recipient_sent_reference_reminders" + ) + op.alter_column( + "host_requests", "surfer_sent_reference_reminders", new_column_name="initiator_sent_reference_reminders" + ) + op.alter_column("host_requests", "host_sent_request_reminders", new_column_name="recipient_sent_request_reminders") + op.alter_column("host_requests", "host_reason_didnt_meetup", new_column_name="recipient_reason_didnt_meetup") + op.alter_column("host_requests", "surfer_reason_didnt_meetup", new_column_name="initiator_reason_didnt_meetup") + + # Rename constraints + op.execute( + "ALTER TABLE host_requests RENAME CONSTRAINT fk_host_requests_surfer_user_id_users " + "TO fk_host_requests_initiator_user_id_users" + ) + op.execute( + "ALTER TABLE host_requests RENAME CONSTRAINT fk_host_requests_host_user_id_users " + "TO fk_host_requests_recipient_user_id_users" + ) + + # Rename indexes + op.execute("ALTER INDEX ix_host_requests_surfer_user_id RENAME TO ix_host_requests_initiator_user_id") + op.execute("ALTER INDEX ix_host_requests_host_user_id RENAME TO ix_host_requests_recipient_user_id") + op.execute("ALTER INDEX ix_host_requests_host_didnt_meetup RENAME TO ix_host_requests_recipient_didnt_meetup") + op.execute("ALTER INDEX ix_host_requests_surfer_didnt_meetup RENAME TO ix_host_requests_initiator_didnt_meetup") + + +def downgrade() -> None: + # Rename indexes back + op.execute("ALTER INDEX ix_host_requests_initiator_didnt_meetup RENAME TO ix_host_requests_surfer_didnt_meetup") + op.execute("ALTER INDEX ix_host_requests_recipient_didnt_meetup RENAME TO ix_host_requests_host_didnt_meetup") + op.execute("ALTER INDEX ix_host_requests_recipient_user_id RENAME TO ix_host_requests_host_user_id") + op.execute("ALTER INDEX ix_host_requests_initiator_user_id RENAME TO ix_host_requests_surfer_user_id") + + # Rename constraints back + op.execute( + "ALTER TABLE host_requests RENAME CONSTRAINT fk_host_requests_recipient_user_id_users " + "TO fk_host_requests_host_user_id_users" + ) + op.execute( + "ALTER TABLE host_requests RENAME CONSTRAINT fk_host_requests_initiator_user_id_users " + "TO fk_host_requests_surfer_user_id_users" + ) + + # Rename other columns back + op.alter_column("host_requests", "initiator_reason_didnt_meetup", new_column_name="surfer_reason_didnt_meetup") + op.alter_column("host_requests", "recipient_reason_didnt_meetup", new_column_name="host_reason_didnt_meetup") + op.alter_column("host_requests", "recipient_sent_request_reminders", new_column_name="host_sent_request_reminders") + op.alter_column( + "host_requests", "initiator_sent_reference_reminders", new_column_name="surfer_sent_reference_reminders" + ) + op.alter_column( + "host_requests", "recipient_sent_reference_reminders", new_column_name="host_sent_reference_reminders" + ) + op.alter_column("host_requests", "initiator_last_seen_message_id", new_column_name="surfer_last_seen_message_id") + op.alter_column("host_requests", "recipient_last_seen_message_id", new_column_name="host_last_seen_message_id") + op.alter_column("host_requests", "is_initiator_archived", new_column_name="is_surfer_archived") + op.alter_column("host_requests", "is_recipient_archived", new_column_name="is_host_archived") + + # Rename user ID columns back + op.alter_column("host_requests", "recipient_user_id", new_column_name="host_user_id") + op.alter_column("host_requests", "initiator_user_id", new_column_name="surfer_user_id") diff --git a/app/backend/src/couchers/models/host_requests.py b/app/backend/src/couchers/models/host_requests.py index 16a7aa23a7..a372372c4e 100644 --- a/app/backend/src/couchers/models/host_requests.py +++ b/app/backend/src/couchers/models/host_requests.py @@ -38,11 +38,11 @@ class HostRequest(Base, kw_only=True): """ __tablename__ = "host_requests" - __moderation_author_column__ = "surfer_user_id" + __moderation_author_column__ = "initiator_user_id" conversation_id: Mapped[int] = mapped_column("id", ForeignKey("conversations.id"), primary_key=True) - surfer_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) - host_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) + initiator_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) + recipient_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) # Unified Moderation System moderation_state_id: Mapped[int] = mapped_column(ForeignKey("moderation_states.id"), index=True) @@ -66,33 +66,33 @@ class HostRequest(Base, kw_only=True): end_time_to_write_reference = column_property(date_in_timezone(to_date, timezone) + text("interval '15 days'")) status: Mapped[HostRequestStatus] = mapped_column(Enum(HostRequestStatus)) - is_host_archived: Mapped[bool] = mapped_column(Boolean, default=False, server_default=expression.false()) - is_surfer_archived: Mapped[bool] = mapped_column(Boolean, default=False, server_default=expression.false()) + is_recipient_archived: Mapped[bool] = mapped_column(Boolean, default=False, server_default=expression.false()) + is_initiator_archived: Mapped[bool] = mapped_column(Boolean, default=False, server_default=expression.false()) - host_last_seen_message_id: Mapped[int] = mapped_column(BigInteger, default=0) - surfer_last_seen_message_id: Mapped[int] = mapped_column(BigInteger, default=0) + recipient_last_seen_message_id: Mapped[int] = mapped_column(BigInteger, default=0) + initiator_last_seen_message_id: Mapped[int] = mapped_column(BigInteger, default=0) # number of reference reminders sent out - host_sent_reference_reminders: Mapped[int] = mapped_column(BigInteger, server_default=text("0"), init=False) - surfer_sent_reference_reminders: Mapped[int] = mapped_column(BigInteger, server_default=text("0"), init=False) - host_sent_request_reminders: Mapped[int] = mapped_column(BigInteger, server_default=text("0"), init=False) + recipient_sent_reference_reminders: Mapped[int] = mapped_column(BigInteger, server_default=text("0"), init=False) + initiator_sent_reference_reminders: Mapped[int] = mapped_column(BigInteger, server_default=text("0"), init=False) + recipient_sent_request_reminders: Mapped[int] = mapped_column(BigInteger, server_default=text("0"), init=False) last_sent_request_reminder_time: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), init=False ) - # reason why the host/surfer marked that they didn't meet up + # reason why the initiator/recipient marked that they didn't meet up # if null then they haven't marked it such - host_reason_didnt_meetup: Mapped[str | None] = mapped_column(String, default=None) - surfer_reason_didnt_meetup: Mapped[str | None] = mapped_column(String, default=None) + recipient_reason_didnt_meetup: Mapped[str | None] = mapped_column(String, default=None) + initiator_reason_didnt_meetup: Mapped[str | None] = mapped_column(String, default=None) + initiator: Mapped[User] = relationship( + init=False, backref="host_requests_initiated", foreign_keys="HostRequest.initiator_user_id" + ) # Optional link to public trip if this request originated from one public_trip_id: Mapped[int | None] = mapped_column(ForeignKey("public_trips.id"), index=True, default=None) - surfer: Mapped[User] = relationship( - init=False, backref="host_requests_sent", foreign_keys="HostRequest.surfer_user_id" - ) - host: Mapped[User] = relationship( - init=False, backref="host_requests_received", foreign_keys="HostRequest.host_user_id" + recipient: Mapped[User] = relationship( + init=False, backref="host_requests_received", foreign_keys="HostRequest.recipient_user_id" ) conversation: Mapped[Conversation] = relationship(init=False) moderation_state: Mapped[ModerationState] = relationship(init=False) @@ -101,18 +101,18 @@ class HostRequest(Base, kw_only=True): __table_args__ = ( # allows fast lookup as to whether they didn't meet up Index( - "ix_host_requests_host_didnt_meetup", - host_reason_didnt_meetup != None, + "ix_host_requests_recipient_didnt_meetup", + recipient_reason_didnt_meetup != None, ), Index( - "ix_host_requests_surfer_didnt_meetup", - surfer_reason_didnt_meetup != None, + "ix_host_requests_initiator_didnt_meetup", + initiator_reason_didnt_meetup != None, ), # Used for figuring out who needs a reminder to respond Index( "ix_host_requests_status_reminder_counts", status, - host_sent_request_reminders, + recipient_sent_request_reminders, last_sent_request_reminder_time, from_date, ), @@ -135,7 +135,7 @@ def can_write_reference_expr(cls) -> Any: # noqa: ARG003,D102 ) def __repr__(self) -> str: - return f"HostRequest(id={self.conversation_id}, surfer_user_id={self.surfer_user_id}, host_user_id={self.host_user_id}...)" + return f"HostRequest(id={self.conversation_id}, initiator_user_id={self.initiator_user_id}, recipient_user_id={self.recipient_user_id}...)" class HostRequestFeedback(Base, kw_only=True): diff --git a/app/backend/src/couchers/rate_limits/definitions.py b/app/backend/src/couchers/rate_limits/definitions.py index 7fb0510a40..1a87ade89c 100644 --- a/app/backend/src/couchers/rate_limits/definitions.py +++ b/app/backend/src/couchers/rate_limits/definitions.py @@ -39,13 +39,13 @@ def _get_user_host_requests_in_past_time_interval(session: Session, user_id: int session.execute( select( Conversation.created.label("created"), - HostRequest.host_user_id.label("host ID"), + HostRequest.recipient_user_id.label("host ID"), User.username.label("host username"), User.city.label("host city"), ) .join(Conversation, HostRequest.conversation_id == Conversation.id) - .join(User, HostRequest.host_user_id == User.id) - .where(HostRequest.surfer_user_id == user_id) + .join(User, HostRequest.recipient_user_id == User.id) + .where(HostRequest.initiator_user_id == user_id) .where(Conversation.created >= now() - RATE_LIMIT_INTERVAL) ) .mappings() @@ -105,7 +105,7 @@ def _get_user_initiated_chats_in_past_time_interval(session: Session, user_id: i select(func.count()) .select_from(HostRequest) .join(Conversation, HostRequest.conversation_id == Conversation.id) - .where(HostRequest.surfer_user_id == user_id) + .where(HostRequest.initiator_user_id == user_id) .where(Conversation.created >= now() - RATE_LIMIT_INTERVAL) ).scalar_one(), mod_email_information_query=_get_user_host_requests_in_past_time_interval, diff --git a/app/backend/src/couchers/servicers/account.py b/app/backend/src/couchers/servicers/account.py index fd48677107..c3a811ee2d 100644 --- a/app/backend/src/couchers/servicers/account.py +++ b/app/backend/src/couchers/servicers/account.py @@ -740,11 +740,13 @@ def GetReminders( user = session.execute(select(User).where(User.id == context.user_id)).scalar_one() # responding to reqs comes first in desc order of when they were received - query = select(HostRequest.conversation_id, LiteUser).join(LiteUser, LiteUser.id == HostRequest.surfer_user_id) - query = where_users_column_visible(query, context, HostRequest.surfer_user_id) + query = select(HostRequest.conversation_id, LiteUser).join( + LiteUser, LiteUser.id == HostRequest.initiator_user_id + ) + query = where_users_column_visible(query, context, HostRequest.initiator_user_id) query = where_moderated_content_visible(query, context, HostRequest, is_list_operation=True) pending_host_requests = session.execute( - query.where(HostRequest.host_user_id == context.user_id) + query.where(HostRequest.recipient_user_id == context.user_id) .where(HostRequest.status == HostRequestStatus.pending) .where(HostRequest.start_time > func.now()) .order_by(HostRequest.conversation_id.asc()) diff --git a/app/backend/src/couchers/servicers/admin.py b/app/backend/src/couchers/servicers/admin.py index b21cb25a60..f70cbcd405 100644 --- a/app/backend/src/couchers/servicers/admin.py +++ b/app/backend/src/couchers/servicers/admin.py @@ -562,8 +562,8 @@ def get_messages_for_conversation(conversation_id: int) -> list[admin_pb2.ChatMe def get_host_request_pb(host_request: HostRequest) -> admin_pb2.AdminHostRequest: return admin_pb2.AdminHostRequest( host_request_id=host_request.conversation_id, - surfer=get_chat_user_info(host_request.surfer_user_id), - host=get_chat_user_info(host_request.host_user_id), + surfer=get_chat_user_info(host_request.initiator_user_id), + host=get_chat_user_info(host_request.recipient_user_id), status=host_request.status.name if host_request.status else "", from_date=date_to_api(host_request.from_date), to_date=date_to_api(host_request.to_date), @@ -603,7 +603,7 @@ def get_group_chat_pb(group_chat: GroupChat) -> admin_pb2.AdminGroupChat: host_requests = ( session.execute( select(HostRequest) - .where(or_(HostRequest.host_user_id == user.id, HostRequest.surfer_user_id == user.id)) + .where(or_(HostRequest.recipient_user_id == user.id, HostRequest.initiator_user_id == user.id)) .order_by(HostRequest.conversation_id.desc()) ) .scalars() diff --git a/app/backend/src/couchers/servicers/api.py b/app/backend/src/couchers/servicers/api.py index f5653dae1b..0446d84221 100644 --- a/app/backend/src/couchers/servicers/api.py +++ b/app/backend/src/couchers/servicers/api.py @@ -172,10 +172,10 @@ def Ping(self, request: api_pb2.PingReq, context: CouchersContext, session: Sess # auth ought to make sure the user exists user = session.execute(select(User).where(User.id == context.user_id)).scalar_one() - sent_reqs_query = select(HostRequest.conversation_id, HostRequest.surfer_last_seen_message_id).where( - HostRequest.surfer_user_id == context.user_id + sent_reqs_query = select(HostRequest.conversation_id, HostRequest.initiator_last_seen_message_id).where( + HostRequest.initiator_user_id == context.user_id ) - sent_reqs_query = where_users_column_visible(sent_reqs_query, context, HostRequest.host_user_id) + sent_reqs_query = where_users_column_visible(sent_reqs_query, context, HostRequest.recipient_user_id) sent_reqs_query = where_moderated_content_visible(sent_reqs_query, context, HostRequest, is_list_operation=True) sent_reqs_last_seen_message_ids = sent_reqs_query.subquery() @@ -185,14 +185,14 @@ def Ping(self, request: api_pb2.PingReq, context: CouchersContext, session: Sess Message, Message.conversation_id == sent_reqs_last_seen_message_ids.c.conversation_id, ) - .where(sent_reqs_last_seen_message_ids.c.surfer_last_seen_message_id < Message.id) + .where(sent_reqs_last_seen_message_ids.c.initiator_last_seen_message_id < Message.id) .where(Message.id != None) ).scalar_one() - received_reqs_query = select(HostRequest.conversation_id, HostRequest.host_last_seen_message_id).where( - HostRequest.host_user_id == context.user_id + received_reqs_query = select(HostRequest.conversation_id, HostRequest.recipient_last_seen_message_id).where( + HostRequest.recipient_user_id == context.user_id ) - received_reqs_query = where_users_column_visible(received_reqs_query, context, HostRequest.surfer_user_id) + received_reqs_query = where_users_column_visible(received_reqs_query, context, HostRequest.initiator_user_id) received_reqs_query = where_moderated_content_visible( received_reqs_query, context, HostRequest, is_list_operation=True ) @@ -204,7 +204,7 @@ def Ping(self, request: api_pb2.PingReq, context: CouchersContext, session: Sess Message, Message.conversation_id == received_reqs_last_seen_message_ids.c.conversation_id, ) - .where(received_reqs_last_seen_message_ids.c.host_last_seen_message_id < Message.id) + .where(received_reqs_last_seen_message_ids.c.recipient_last_seen_message_id < Message.id) .where(Message.id != None) ).scalar_one() diff --git a/app/backend/src/couchers/servicers/moderation.py b/app/backend/src/couchers/servicers/moderation.py index 22d356f94e..159cdf2c18 100644 --- a/app/backend/src/couchers/servicers/moderation.py +++ b/app/backend/src/couchers/servicers/moderation.py @@ -127,7 +127,7 @@ def moderation_state_to_pb(state: ModerationState, session: Session) -> moderati # Get the author user ID and content based on object type if object_type == ModerationObjectType.host_request: author_user_id = session.execute( - select(HostRequest.surfer_user_id).where(HostRequest.conversation_id == object_id) + select(HostRequest.initiator_user_id).where(HostRequest.conversation_id == object_id) ).scalar_one() # Get the first text message for this conversation content = session.execute( diff --git a/app/backend/src/couchers/servicers/references.py b/app/backend/src/couchers/servicers/references.py index 92de642064..86a348019c 100644 --- a/app/backend/src/couchers/servicers/references.py +++ b/app/backend/src/couchers/servicers/references.py @@ -64,11 +64,13 @@ def get_host_req_and_check_can_write_ref( Returns the host req and `surfed`, a boolean of if the user was the surfer or not """ query = select(HostRequest) - query = where_users_column_visible(query, context, HostRequest.surfer_user_id) - query = where_users_column_visible(query, context, HostRequest.host_user_id) + query = where_users_column_visible(query, context, HostRequest.initiator_user_id) + query = where_users_column_visible(query, context, HostRequest.recipient_user_id) query = where_moderated_content_visible(query, context, HostRequest, is_list_operation=False) query = query.where(HostRequest.conversation_id == host_request_id) - query = query.where(or_(HostRequest.surfer_user_id == context.user_id, HostRequest.host_user_id == context.user_id)) + query = query.where( + or_(HostRequest.initiator_user_id == context.user_id, HostRequest.recipient_user_id == context.user_id) + ) host_request = session.execute(query).scalar_one_or_none() if not host_request: @@ -84,12 +86,12 @@ def get_host_req_and_check_can_write_ref( ).scalar_one_or_none(): context.abort_with_error_code(grpc.StatusCode.FAILED_PRECONDITION, "reference_already_given") - surfed = host_request.surfer_user_id == context.user_id + surfed = host_request.initiator_user_id == context.user_id if surfed: - my_reason = host_request.surfer_reason_didnt_meetup + my_reason = host_request.initiator_reason_didnt_meetup else: - my_reason = host_request.host_reason_didnt_meetup + my_reason = host_request.recipient_reason_didnt_meetup if my_reason != None: context.abort_with_error_code( @@ -122,14 +124,14 @@ def get_pending_references_to_write( Reference.from_user_id == context.user_id, ), ) - .join(LiteUser, LiteUser.id == HostRequest.host_user_id) + .join(LiteUser, LiteUser.id == HostRequest.recipient_user_id) ) - q1 = where_users_column_visible(q1, context, HostRequest.host_user_id) + q1 = where_users_column_visible(q1, context, HostRequest.recipient_user_id) q1 = where_moderated_content_visible(q1, context, HostRequest, is_list_operation=True) q1 = q1.where(Reference.id == None) q1 = q1.where(HostRequest.can_write_reference) - q1 = q1.where(HostRequest.surfer_user_id == context.user_id) - q1 = q1.where(HostRequest.surfer_reason_didnt_meetup == None) + q1 = q1.where(HostRequest.initiator_user_id == context.user_id) + q1 = q1.where(HostRequest.initiator_reason_didnt_meetup == None) q2 = ( select(literal(False), HostRequest, LiteUser) @@ -140,14 +142,14 @@ def get_pending_references_to_write( Reference.from_user_id == context.user_id, ), ) - .join(LiteUser, LiteUser.id == HostRequest.surfer_user_id) + .join(LiteUser, LiteUser.id == HostRequest.initiator_user_id) ) - q2 = where_users_column_visible(q2, context, HostRequest.surfer_user_id) + q2 = where_users_column_visible(q2, context, HostRequest.initiator_user_id) q2 = where_moderated_content_visible(q2, context, HostRequest, is_list_operation=True) q2 = q2.where(Reference.id == None) q2 = q2.where(HostRequest.can_write_reference) - q2 = q2.where(HostRequest.host_user_id == context.user_id) - q2 = q2.where(HostRequest.host_reason_didnt_meetup == None) + q2 = q2.where(HostRequest.recipient_user_id == context.user_id) + q2 = q2.where(HostRequest.recipient_reason_didnt_meetup == None) union = union_all(q1, q2).order_by(HostRequest.end_time_to_write_reference.asc()).subquery() query = select(union.c[0].label("surfed"), aliased(HostRequest, union), aliased(LiteUser, union)) @@ -321,13 +323,13 @@ def WriteHostRequestReference( if surfed: # we requested to surf with someone reference_type = ReferenceType.surfed - to_user_id = host_request.host_user_id - assert context.user_id == host_request.surfer_user_id + to_user_id = host_request.recipient_user_id + assert context.user_id == host_request.initiator_user_id else: # we hosted someone reference_type = ReferenceType.hosted - to_user_id = host_request.surfer_user_id - assert context.user_id == host_request.host_user_id + to_user_id = host_request.initiator_user_id + assert context.user_id == host_request.recipient_user_id reference = Reference( from_user_id=context.user_id, @@ -393,9 +395,9 @@ def HostRequestIndicateDidntMeetup( reason = request.reason_didnt_meetup.strip() if surfed: - host_request.surfer_reason_didnt_meetup = reason + host_request.initiator_reason_didnt_meetup = reason else: - host_request.host_reason_didnt_meetup = reason + host_request.recipient_reason_didnt_meetup = reason return empty_pb2.Empty() @@ -431,9 +433,9 @@ def AvailableWriteReferences( ) .where(Reference.id == None) .where(HostRequest.can_write_reference) - .where(HostRequest.surfer_user_id == context.user_id) - .where(HostRequest.host_user_id == request.to_user_id) - .where(HostRequest.surfer_reason_didnt_meetup == None) + .where(HostRequest.initiator_user_id == context.user_id) + .where(HostRequest.recipient_user_id == request.to_user_id) + .where(HostRequest.initiator_reason_didnt_meetup == None) ) q2 = ( @@ -447,9 +449,9 @@ def AvailableWriteReferences( ) .where(Reference.id == None) .where(HostRequest.can_write_reference) - .where(HostRequest.surfer_user_id == request.to_user_id) - .where(HostRequest.host_user_id == context.user_id) - .where(HostRequest.host_reason_didnt_meetup == None) + .where(HostRequest.initiator_user_id == request.to_user_id) + .where(HostRequest.recipient_user_id == context.user_id) + .where(HostRequest.recipient_reason_didnt_meetup == None) ) union = union_all(q1, q2).order_by(HostRequest.end_time_to_write_reference.asc()).subquery() @@ -501,7 +503,7 @@ def GetHostRequestReferenceStatus( query = where_moderated_content_visible(query, context, HostRequest, is_list_operation=False) query = query.where(HostRequest.conversation_id == request.host_request_id) query = query.where( - or_(HostRequest.surfer_user_id == context.user_id, HostRequest.host_user_id == context.user_id) + or_(HostRequest.initiator_user_id == context.user_id, HostRequest.recipient_user_id == context.user_id) ) host_request = session.execute(query).scalar_one_or_none() @@ -516,9 +518,9 @@ def GetHostRequestReferenceStatus( # Block only if current user indicated didn't meet up didnt_stay = ( - (host_request.surfer_reason_didnt_meetup is not None) - if host_request.surfer_user_id == context.user_id - else (host_request.host_reason_didnt_meetup is not None) + (host_request.initiator_reason_didnt_meetup is not None) + if host_request.initiator_user_id == context.user_id + else (host_request.recipient_reason_didnt_meetup is not None) ) # You can write only if: host_request allows it, you didn't already give one, and you didn't indicate didn't meet up diff --git a/app/backend/src/couchers/servicers/requests.py b/app/backend/src/couchers/servicers/requests.py index 4d88a93fd4..9574ed0b80 100644 --- a/app/backend/src/couchers/servicers/requests.py +++ b/app/backend/src/couchers/servicers/requests.py @@ -120,7 +120,7 @@ def host_request_to_pb( lat, lng = get_coordinates(host_request.hosting_location) need_feedback = False - if context.user_id == host_request.host_user_id and host_request.status == HostRequestStatus.rejected: + if context.user_id == host_request.recipient_user_id and host_request.status == HostRequestStatus.rejected: need_feedback = not session.execute( select( exists().where( @@ -132,16 +132,16 @@ def host_request_to_pb( return requests_pb2.HostRequest( host_request_id=host_request.conversation_id, - surfer_user_id=host_request.surfer_user_id, - host_user_id=host_request.host_user_id, + surfer_user_id=host_request.initiator_user_id, + host_user_id=host_request.recipient_user_id, status=hostrequeststatus2api[host_request.status], created=Timestamp_from_datetime(initial_message.time), from_date=date_to_api(host_request.from_date), to_date=date_to_api(host_request.to_date), last_seen_message_id=( - host_request.surfer_last_seen_message_id - if context.user_id == host_request.surfer_user_id - else host_request.host_last_seen_message_id + host_request.initiator_last_seen_message_id + if context.user_id == host_request.initiator_user_id + else host_request.recipient_last_seen_message_id ), latest_message=message_to_pb(latest_message), hosting_city=host_request.hosting_city, @@ -150,9 +150,9 @@ def host_request_to_pb( hosting_radius=host_request.hosting_radius, need_host_request_feedback=need_feedback, is_archived=( - host_request.is_host_archived - if context.user_id == host_request.host_user_id - else host_request.is_surfer_archived + host_request.is_recipient_archived + if context.user_id == host_request.recipient_user_id + else host_request.is_initiator_archived ), ) @@ -161,7 +161,7 @@ def _possibly_observe_first_response_time( session: Session, host_request: HostRequest, user_id: int, response_type: str ) -> None: # if this is the first response then there's nothing by this user yet - assert host_request.host_user_id == user_id + assert host_request.recipient_user_id == user_id number_messages_by_host = session.execute( select(func.count()) @@ -170,8 +170,10 @@ def _possibly_observe_first_response_time( ).scalar_one_or_none() if number_messages_by_host == 0: - host_gender = session.execute(select(User.gender).where(User.id == host_request.host_user_id)).scalar_one() - surfer_gender = session.execute(select(User.gender).where(User.id == host_request.surfer_user_id)).scalar_one() + host_gender = session.execute(select(User.gender).where(User.id == host_request.recipient_user_id)).scalar_one() + surfer_gender = session.execute( + select(User.gender).where(User.id == host_request.initiator_user_id) + ).scalar_one() host_request_first_response_histogram.labels(host_gender, surfer_gender, response_type).observe( (now() - host_request.conversation.created).total_seconds() ) @@ -196,11 +198,11 @@ def CreateHostRequest( if request.host_user_id == context.user_id: context.abort_with_error_code(grpc.StatusCode.INVALID_ARGUMENT, "cant_request_self") - # just to check host exists and is visible - host = session.execute( + # just to check recipient exists and is visible + recipient = session.execute( select(User).where(users_visible(context, User)).where(User.id == request.host_user_id) ).scalar_one_or_none() - if not host: + if not recipient: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "user_not_found") from_date = parse_date(request.from_date) @@ -209,7 +211,7 @@ def CreateHostRequest( if not from_date or not to_date: context.abort_with_error_code(grpc.StatusCode.INVALID_ARGUMENT, "invalid_date") - today = today_in_timezone(host.timezone) + today = today_in_timezone(recipient.timezone) # request starts from the past if from_date < today: @@ -276,38 +278,38 @@ def CreateHostRequest( host_request = HostRequest( conversation_id=conversation.id, - surfer_user_id=context.user_id, - host_user_id=host.id, + initiator_user_id=context.user_id, + recipient_user_id=recipient.id, moderation_state_id=moderation_state.id, from_date=from_date, to_date=to_date, status=HostRequestStatus.pending, - surfer_last_seen_message_id=message.id, + initiator_last_seen_message_id=message.id, # TODO: tz - # timezone=host.timezone, - hosting_city=host.city, - hosting_location=host.geom, - hosting_radius=host.geom_radius, + # timezone=recipient.timezone, + hosting_city=recipient.city, + hosting_location=recipient.geom, + hosting_radius=recipient.geom_radius, ) session.add(host_request) session.flush() notify( session, - user_id=host_request.host_user_id, + user_id=host_request.recipient_user_id, topic_action=NotificationTopicAction.host_request__create, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestCreate( host_request=host_request_to_pb(host_request, session, context), - surfer=user_model_to_pb(host_request.surfer, session, context), + surfer=user_model_to_pb(host_request.initiator, session, context), text=request.text, ), moderation_state_id=moderation_state.id, ) - host_requests_sent_counter.labels(user.gender, host.gender).inc() + host_requests_sent_counter.labels(user.gender, recipient.gender).inc() sent_messages_counter.labels(user.gender, "host request send").inc() - account_age_on_host_request_create_histogram.labels(user.gender, host.gender).observe( + account_age_on_host_request_create_histogram.labels(user.gender, recipient.gender).observe( (now() - user.joined).total_seconds() ) log_event( @@ -316,10 +318,10 @@ def CreateHostRequest( "host_request.created", { "host_request_id": host_request.conversation_id, - "host_id": host.id, + "host_id": recipient.id, "surfer_gender": user.gender, - "host_gender": host.gender, - "city": host.city, + "host_gender": recipient.gender, + "city": recipient.city, "from_date": str(from_date), "to_date": str(to_date), "nights": (to_date - from_date).days, @@ -337,17 +339,19 @@ def GetHostRequest( where_users_column_visible( select(HostRequest), context, - HostRequest.surfer_user_id, + HostRequest.initiator_user_id, ), context, - HostRequest.host_user_id, + HostRequest.recipient_user_id, ), context, HostRequest, is_list_operation=False, ) .where(HostRequest.conversation_id == request.host_request_id) - .where(or_(HostRequest.surfer_user_id == context.user_id, HostRequest.host_user_id == context.user_id)) + .where( + or_(HostRequest.initiator_user_id == context.user_id, HostRequest.recipient_user_id == context.user_id) + ) ).scalar_one_or_none() if not host_request: @@ -378,10 +382,10 @@ def ListHostRequests( .join(HostRequest, HostRequest.conversation_id == Message.conversation_id) .join(Conversation, Conversation.id == HostRequest.conversation_id), context, - HostRequest.surfer_user_id, + HostRequest.initiator_user_id, ), context, - HostRequest.host_user_id, + HostRequest.recipient_user_id, ), context, HostRequest, @@ -391,25 +395,25 @@ def ListHostRequests( if request.last_request_id != 0: statement = statement.where(Message.id < request.last_request_id) if request.only_sent: - statement = statement.where(HostRequest.surfer_user_id == context.user_id) + statement = statement.where(HostRequest.initiator_user_id == context.user_id) elif request.only_received: - statement = statement.where(HostRequest.host_user_id == context.user_id) + statement = statement.where(HostRequest.recipient_user_id == context.user_id) elif request.HasField("only_archived"): statement = statement.where( or_( and_( - HostRequest.surfer_user_id == context.user_id, - HostRequest.is_surfer_archived == request.only_archived, + HostRequest.initiator_user_id == context.user_id, + HostRequest.is_initiator_archived == request.only_archived, ), and_( - HostRequest.host_user_id == context.user_id, - HostRequest.is_host_archived == request.only_archived, + HostRequest.recipient_user_id == context.user_id, + HostRequest.is_recipient_archived == request.only_archived, ), ) ) else: statement = statement.where( - or_(HostRequest.host_user_id == context.user_id, HostRequest.surfer_user_id == context.user_id) + or_(HostRequest.recipient_user_id == context.user_id, HostRequest.initiator_user_id == context.user_id) ) # TODO: I considered having the latest control message be the single source of truth for @@ -434,16 +438,16 @@ def ListHostRequests( host_requests.append( requests_pb2.HostRequest( host_request_id=result.HostRequest.conversation_id, - surfer_user_id=result.HostRequest.surfer_user_id, - host_user_id=result.HostRequest.host_user_id, + surfer_user_id=result.HostRequest.initiator_user_id, + host_user_id=result.HostRequest.recipient_user_id, status=hostrequeststatus2api[result.HostRequest.status], created=Timestamp_from_datetime(result.Conversation.created), from_date=date_to_api(result.HostRequest.from_date), to_date=date_to_api(result.HostRequest.to_date), last_seen_message_id=( - result.HostRequest.surfer_last_seen_message_id - if context.user_id == result.HostRequest.surfer_user_id - else result.HostRequest.host_last_seen_message_id + result.HostRequest.initiator_last_seen_message_id + if context.user_id == result.HostRequest.initiator_user_id + else result.HostRequest.recipient_last_seen_message_id ), latest_message=message_to_pb(result.Message), hosting_city=result.HostRequest.hosting_city, @@ -475,10 +479,10 @@ def count_host_response(other_user_id: int, response_type: str) -> None: where_users_column_visible( select(HostRequest), context, - HostRequest.surfer_user_id, + HostRequest.initiator_user_id, ), context, - HostRequest.host_user_id, + HostRequest.recipient_user_id, ), context, HostRequest, @@ -489,7 +493,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None: if not host_request: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if host_request.surfer_user_id != context.user_id and host_request.host_user_id != context.user_id: + if host_request.initiator_user_id != context.user_id and host_request.recipient_user_id != context.user_id: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") if request.status == conversations_pb2.HOST_REQUEST_STATUS_PENDING: @@ -506,7 +510,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None: if request.status == conversations_pb2.HOST_REQUEST_STATUS_ACCEPTED: # only host can accept - if context.user_id != host_request.host_user_id: + if context.user_id != host_request.recipient_user_id: context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "not_the_host") # can't accept a cancelled or confirmed request (only reject), or already accepted if ( @@ -522,27 +526,27 @@ def count_host_response(other_user_id: int, response_type: str) -> None: notify( session, - user_id=host_request.surfer_user_id, + user_id=host_request.initiator_user_id, topic_action=NotificationTopicAction.host_request__accept, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestAccept( host_request=host_request_to_pb(host_request, session, context), - host=user_model_to_pb(host_request.host, session, context), + host=user_model_to_pb(host_request.recipient, session, context), ), moderation_state_id=host_request.moderation_state_id, ) - count_host_response(host_request.surfer_user_id, "accepted") + count_host_response(host_request.initiator_user_id, "accepted") log_event( context, session, "host_request.accepted", { "host_request_id": host_request.conversation_id, - "surfer_id": host_request.surfer_user_id, - "host_id": host_request.host_user_id, - "surfer_gender": host_request.surfer.gender, - "host_gender": host_request.host.gender, + "surfer_id": host_request.initiator_user_id, + "host_id": host_request.recipient_user_id, + "surfer_gender": host_request.initiator.gender, + "host_gender": host_request.recipient.gender, "from_date": str(host_request.from_date), "to_date": str(host_request.to_date), "host_city": host_request.hosting_city, @@ -551,7 +555,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None: if request.status == conversations_pb2.HOST_REQUEST_STATUS_REJECTED: # only host can reject - if context.user_id != host_request.host_user_id: + if context.user_id != host_request.recipient_user_id: context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status") # can't reject a cancelled or already rejected request if host_request.status == HostRequestStatus.cancelled or host_request.status == HostRequestStatus.rejected: @@ -563,27 +567,28 @@ def count_host_response(other_user_id: int, response_type: str) -> None: notify( session, - user_id=host_request.surfer_user_id, + user_id=host_request.initiator_user_id, topic_action=NotificationTopicAction.host_request__reject, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestReject( host_request=host_request_to_pb(host_request, session, context), - host=user_model_to_pb(host_request.host, session, context), + host=user_model_to_pb(host_request.recipient, session, context), ), moderation_state_id=host_request.moderation_state_id, ) - count_host_response(host_request.surfer_user_id, "rejected") + count_host_response(host_request.initiator_user_id, "rejected") + log_event( context, session, "host_request.rejected", { "host_request_id": host_request.conversation_id, - "surfer_id": host_request.surfer_user_id, - "host_id": host_request.host_user_id, - "surfer_gender": host_request.surfer.gender, - "host_gender": host_request.host.gender, + "surfer_id": host_request.initiator_user_id, + "host_id": host_request.recipient_user_id, + "surfer_gender": host_request.initiator.gender, + "host_gender": host_request.recipient.gender, "from_date": str(host_request.from_date), "to_date": str(host_request.to_date), "host_city": host_request.hosting_city, @@ -592,7 +597,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None: if request.status == conversations_pb2.HOST_REQUEST_STATUS_CONFIRMED: # only surfer can confirm - if context.user_id != host_request.surfer_user_id: + if context.user_id != host_request.initiator_user_id: context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status") # can only confirm an accepted request if host_request.status != HostRequestStatus.accepted: @@ -603,27 +608,27 @@ def count_host_response(other_user_id: int, response_type: str) -> None: notify( session, - user_id=host_request.host_user_id, + user_id=host_request.recipient_user_id, topic_action=NotificationTopicAction.host_request__confirm, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestConfirm( host_request=host_request_to_pb(host_request, session, context), - surfer=user_model_to_pb(host_request.surfer, session, context), + surfer=user_model_to_pb(host_request.initiator, session, context), ), moderation_state_id=host_request.moderation_state_id, ) - count_host_response(host_request.host_user_id, "confirmed") + count_host_response(host_request.recipient_user_id, "confirmed") log_event( context, session, "host_request.confirmed", { "host_request_id": host_request.conversation_id, - "surfer_id": host_request.surfer_user_id, - "host_id": host_request.host_user_id, - "surfer_gender": host_request.surfer.gender, - "host_gender": host_request.host.gender, + "surfer_id": host_request.initiator_user_id, + "host_id": host_request.recipient_user_id, + "surfer_gender": host_request.initiator.gender, + "host_gender": host_request.recipient.gender, "from_date": str(host_request.from_date), "to_date": str(host_request.to_date), "host_city": host_request.hosting_city, @@ -632,7 +637,7 @@ def count_host_response(other_user_id: int, response_type: str) -> None: if request.status == conversations_pb2.HOST_REQUEST_STATUS_CANCELLED: # only surfer can cancel - if context.user_id != host_request.surfer_user_id: + if context.user_id != host_request.initiator_user_id: context.abort_with_error_code(grpc.StatusCode.PERMISSION_DENIED, "invalid_host_request_status") # can't' cancel an already cancelled or rejected request if host_request.status == HostRequestStatus.rejected or host_request.status == HostRequestStatus.cancelled: @@ -643,27 +648,27 @@ def count_host_response(other_user_id: int, response_type: str) -> None: notify( session, - user_id=host_request.host_user_id, + user_id=host_request.recipient_user_id, topic_action=NotificationTopicAction.host_request__cancel, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestCancel( host_request=host_request_to_pb(host_request, session, context), - surfer=user_model_to_pb(host_request.surfer, session, context), + surfer=user_model_to_pb(host_request.initiator, session, context), ), moderation_state_id=host_request.moderation_state_id, ) - count_host_response(host_request.host_user_id, "cancelled") + count_host_response(host_request.recipient_user_id, "cancelled") log_event( context, session, "host_request.cancelled", { "host_request_id": host_request.conversation_id, - "surfer_id": host_request.surfer_user_id, - "host_id": host_request.host_user_id, - "surfer_gender": host_request.surfer.gender, - "host_gender": host_request.host.gender, + "surfer_id": host_request.initiator_user_id, + "host_id": host_request.recipient_user_id, + "surfer_gender": host_request.initiator.gender, + "host_gender": host_request.recipient.gender, "from_date": str(host_request.from_date), "to_date": str(host_request.to_date), "host_city": host_request.hosting_city, @@ -686,10 +691,10 @@ def count_host_response(other_user_id: int, response_type: str) -> None: session.flush() - if host_request.surfer_user_id == context.user_id: - host_request.surfer_last_seen_message_id = latest_message.id + if host_request.initiator_user_id == context.user_id: + host_request.initiator_last_seen_message_id = latest_message.id else: - host_request.host_last_seen_message_id = latest_message.id + host_request.recipient_last_seen_message_id = latest_message.id session.commit() return empty_pb2.Empty() @@ -706,7 +711,7 @@ def GetHostRequestMessages( if not host_request: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if host_request.surfer_user_id != context.user_id and host_request.host_user_id != context.user_id: + if host_request.initiator_user_id != context.user_id and host_request.recipient_user_id != context.user_id: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") pagination = request.number if request.number > 0 else DEFAULT_PAGINATION_LENGTH @@ -748,10 +753,10 @@ def SendHostRequestMessage( if not host_request: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if host_request.surfer_user_id != context.user_id and host_request.host_user_id != context.user_id: + if host_request.initiator_user_id != context.user_id and host_request.recipient_user_id != context.user_id: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if host_request.host_user_id == context.user_id: + if host_request.recipient_user_id == context.user_id: _possibly_observe_first_response_time(session, host_request, context.user_id, "message") message = Message( @@ -764,17 +769,17 @@ def SendHostRequestMessage( session.add(message) session.flush() - if host_request.surfer_user_id == context.user_id: - host_request.surfer_last_seen_message_id = message.id + if host_request.initiator_user_id == context.user_id: + host_request.initiator_last_seen_message_id = message.id notify( session, - user_id=host_request.host_user_id, + user_id=host_request.recipient_user_id, topic_action=NotificationTopicAction.host_request__message, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestMessage( host_request=host_request_to_pb(host_request, session, context), - user=user_model_to_pb(host_request.surfer, session, context), + user=user_model_to_pb(host_request.initiator, session, context), text=request.text, am_host=True, ), @@ -782,16 +787,16 @@ def SendHostRequestMessage( ) else: - host_request.host_last_seen_message_id = message.id + host_request.recipient_last_seen_message_id = message.id notify( session, - user_id=host_request.surfer_user_id, + user_id=host_request.initiator_user_id, topic_action=NotificationTopicAction.host_request__message, key=str(host_request.conversation_id), data=notification_data_pb2.HostRequestMessage( host_request=host_request_to_pb(host_request, session, context), - user=user_model_to_pb(host_request.host, session, context), + user=user_model_to_pb(host_request.recipient, session, context), text=request.text, am_host=False, ), @@ -808,9 +813,9 @@ def SendHostRequestMessage( "host_request.message_sent", { "host_request_id": host_request.conversation_id, - "surfer_id": host_request.surfer_user_id, - "host_id": host_request.host_user_id, - "role": "host" if context.user_id == host_request.host_user_id else "surfer", + "surfer_id": host_request.initiator_user_id, + "host_id": host_request.recipient_user_id, + "role": "host" if context.user_id == host_request.recipient_user_id else "surfer", "host_city": host_request.hosting_city, }, ) @@ -846,12 +851,12 @@ def GetHostRequestUpdates( ) if request.only_sent: - statement = statement.where(HostRequest.surfer_user_id == context.user_id) + statement = statement.where(HostRequest.initiator_user_id == context.user_id) elif request.only_received: - statement = statement.where(HostRequest.host_user_id == context.user_id) + statement = statement.where(HostRequest.recipient_user_id == context.user_id) else: statement = statement.where( - or_(HostRequest.host_user_id == context.user_id, HostRequest.surfer_user_id == context.user_id) + or_(HostRequest.recipient_user_id == context.user_id, HostRequest.initiator_user_id == context.user_id) ) statement = statement.order_by(Message.id.asc()).limit(pagination + 1) @@ -885,17 +890,17 @@ def MarkLastSeenHostRequest( if not host_request: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if host_request.surfer_user_id != context.user_id and host_request.host_user_id != context.user_id: + if host_request.initiator_user_id != context.user_id and host_request.recipient_user_id != context.user_id: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if host_request.surfer_user_id == context.user_id: - if not host_request.surfer_last_seen_message_id <= request.last_seen_message_id: + if host_request.initiator_user_id == context.user_id: + if not host_request.initiator_last_seen_message_id <= request.last_seen_message_id: context.abort_with_error_code(grpc.StatusCode.FAILED_PRECONDITION, "cant_unsee_messages") - host_request.surfer_last_seen_message_id = request.last_seen_message_id + host_request.initiator_last_seen_message_id = request.last_seen_message_id else: - if not host_request.host_last_seen_message_id <= request.last_seen_message_id: + if not host_request.recipient_last_seen_message_id <= request.last_seen_message_id: context.abort_with_error_code(grpc.StatusCode.FAILED_PRECONDITION, "cant_unsee_messages") - host_request.host_last_seen_message_id = request.last_seen_message_id + host_request.recipient_last_seen_message_id = request.last_seen_message_id session.commit() return empty_pb2.Empty() @@ -906,16 +911,18 @@ def SetHostRequestArchiveStatus( host_request = session.execute( where_moderated_content_visible(select(HostRequest), context, HostRequest, is_list_operation=False) .where(HostRequest.conversation_id == request.host_request_id) - .where(or_(HostRequest.surfer_user_id == context.user_id, HostRequest.host_user_id == context.user_id)) + .where( + or_(HostRequest.initiator_user_id == context.user_id, HostRequest.recipient_user_id == context.user_id) + ) ).scalar_one_or_none() if not host_request: context.abort_with_error_code(grpc.StatusCode.NOT_FOUND, "host_request_not_found") - if context.user_id == host_request.surfer_user_id: - host_request.is_surfer_archived = request.is_archived + if context.user_id == host_request.initiator_user_id: + host_request.is_initiator_archived = request.is_archived else: - host_request.is_host_archived = request.is_archived + host_request.is_recipient_archived = request.is_archived return requests_pb2.SetHostRequestArchiveStatusRes( host_request_id=host_request.conversation_id, @@ -945,7 +952,7 @@ def SendHostRequestFeedback( host_request = session.execute( where_moderated_content_visible(select(HostRequest), context, HostRequest, is_list_operation=False) .where(HostRequest.conversation_id == request.host_request_id) - .where(HostRequest.host_user_id == context.user_id) + .where(HostRequest.recipient_user_id == context.user_id) ).scalar_one_or_none() if not host_request: @@ -963,8 +970,8 @@ def SendHostRequestFeedback( session.add( HostRequestFeedback( host_request_id=host_request.conversation_id, - from_user_id=host_request.host_user_id, - to_user_id=host_request.surfer_user_id, + from_user_id=host_request.recipient_user_id, + to_user_id=host_request.initiator_user_id, request_quality=hostrequestquality2sql.get(request.host_request_quality), decline_reason=request.decline_reason, ) @@ -976,8 +983,8 @@ def SendHostRequestFeedback( "host_request.feedback_submitted", { "host_request_id": host_request.conversation_id, - "surfer_id": host_request.surfer_user_id, - "host_id": host_request.host_user_id, + "surfer_id": host_request.initiator_user_id, + "host_id": host_request.recipient_user_id, "request_quality": quality.name if quality else None, "has_decline_reason": bool(request.decline_reason), "host_city": host_request.hosting_city, diff --git a/app/backend/src/tests/test_account.py b/app/backend/src/tests/test_account.py index d66d7a8a01..5392e84192 100644 --- a/app/backend/src/tests/test_account.py +++ b/app/backend/src/tests/test_account.py @@ -1020,7 +1020,7 @@ def test_reminders(db, moderator): with requests_session(req_user_token1) as api: host_request1_id = api.CreateHostRequest( requests_pb2.CreateHostRequestReq( - host_user_id=user.id, + recipient_user_id=user.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text("Test request 1"), @@ -1041,7 +1041,7 @@ def test_reminders(db, moderator): with requests_session(req_user_token2) as api: host_request2_id = api.CreateHostRequest( requests_pb2.CreateHostRequestReq( - host_user_id=user.id, + recipient_user_id=user.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text("Test request 2"), @@ -1066,7 +1066,7 @@ def test_reminders(db, moderator): with requests_session(req_user_token1) as api: host_request3_id = api.CreateHostRequest( requests_pb2.CreateHostRequestReq( - host_user_id=user.id, + recipient_user_id=user.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text("Test request 3"), diff --git a/app/backend/src/tests/test_bg_jobs.py b/app/backend/src/tests/test_bg_jobs.py index 4ea922f26f..fb2558e924 100644 --- a/app/backend/src/tests/test_bg_jobs.py +++ b/app/backend/src/tests/test_bg_jobs.py @@ -660,7 +660,7 @@ def test_send_request_notifications_host_request(db, moderator): with requests_session(token1) as requests: host_request_id = requests.CreateHostRequest( requests_pb2.CreateHostRequestReq( - host_user_id=user2.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text() + recipient_user_id=user2.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text() ) ).host_request_id moderator.approve_host_request(host_request_id) @@ -910,7 +910,7 @@ def test_send_reference_reminders(db): hr5 = create_host_request(session, user9.id, user10.id, timedelta(days=7)) # case 6: neither left ref, surfer indicated they didn't meet up, (host still needs an email) - hr6 = create_host_request(session, user12.id, user11.id, timedelta(days=6), surfer_reason_didnt_meetup="") + hr6 = create_host_request(session, user12.id, user11.id, timedelta(days=6), initiator_reason_didnt_meetup="") expected_emails = [ ( @@ -985,84 +985,84 @@ def test_send_host_request_reminders(db, moderator): # case 1: pending, future, interval elapsed => notify hr1 = create_host_request_by_date( session=session, - surfer_user_id=user1.id, - host_user_id=user2.id, + initiator_user_id=user1.id, + recipient_user_id=user2.id, from_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=1), to_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=2), status=HostRequestStatus.pending, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) # case 2: max reminders reached => do not notify hr2 = create_host_request_by_date( session=session, - surfer_user_id=user3.id, - host_user_id=user4.id, + initiator_user_id=user3.id, + recipient_user_id=user4.id, from_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=1), to_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=2), status=HostRequestStatus.pending, - host_sent_request_reminders=HOST_REQUEST_MAX_REMINDERS, + recipient_sent_request_reminders=HOST_REQUEST_MAX_REMINDERS, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) # case 3: interval not yet elapsed => do not notify hr3 = create_host_request_by_date( session=session, - surfer_user_id=user5.id, - host_user_id=user6.id, + initiator_user_id=user5.id, + recipient_user_id=user6.id, from_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=1), to_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=2), status=HostRequestStatus.pending, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL + timedelta(hours=1), ) # case 4: start date is today => do not notify hr4 = create_host_request_by_date( session=session, - surfer_user_id=user7.id, - host_user_id=user8.id, + initiator_user_id=user7.id, + recipient_user_id=user8.id, from_date=today(), to_date=today() + timedelta(days=2), status=HostRequestStatus.pending, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) # case 5: from_date in the past => do not notify hr5 = create_host_request_by_date( session=session, - surfer_user_id=user9.id, - host_user_id=user10.id, + initiator_user_id=user9.id, + recipient_user_id=user10.id, from_date=today() - timedelta(days=1), to_date=today() + timedelta(days=1), status=HostRequestStatus.pending, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) # case 6: non-pending status => do not notify hr6 = create_host_request_by_date( session=session, - surfer_user_id=user11.id, - host_user_id=user12.id, + initiator_user_id=user11.id, + recipient_user_id=user12.id, from_date=today() + timedelta(days=3), to_date=today() + timedelta(days=4), status=HostRequestStatus.accepted, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) # case 7: host already sent a message => do not notify hr7 = create_host_request_by_date( session=session, - surfer_user_id=user13.id, - host_user_id=user14.id, + initiator_user_id=user13.id, + recipient_user_id=user14.id, from_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=1), to_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=2), status=HostRequestStatus.pending, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) @@ -1258,7 +1258,7 @@ def test_send_request_notifications_blocked_users_no_notification(db, moderator) with requests_session(token1) as requests: host_request_id = requests.CreateHostRequest( requests_pb2.CreateHostRequestReq( - host_user_id=user2.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text() + recipient_user_id=user2.id, from_date=today_plus_2, to_date=today_plus_3, text=valid_request_text() ) ).host_request_id moderator.approve_host_request(host_request_id) @@ -1333,12 +1333,12 @@ def test_send_host_request_reminders_blocked_users_no_notification(db, moderator # Create a pending host request where the host has not replied hr = create_host_request_by_date( session=session, - surfer_user_id=user1.id, - host_user_id=user2.id, + initiator_user_id=user1.id, + recipient_user_id=user2.id, from_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=1), to_date=today() + HOST_REQUEST_REMINDER_INTERVAL + timedelta(days=2), status=HostRequestStatus.pending, - host_sent_request_reminders=0, + recipient_sent_request_reminders=0, last_sent_request_reminder_time=now() - HOST_REQUEST_REMINDER_INTERVAL, ) @@ -1361,7 +1361,7 @@ def test_send_host_request_reminders_blocked_users_no_notification(db, moderator # Reset the reminder counter so we can test again host_request = session.execute(select(HostRequest).where(HostRequest.conversation_id == hr)).scalar_one() - host_request.host_sent_request_reminders = 0 + host_request.recipient_sent_request_reminders = 0 host_request.last_sent_request_reminder_time = now() - HOST_REQUEST_REMINDER_INTERVAL # Now have the host block the surfer