mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
reaction: Add user object back in reaction events.
The deprecated `user` object was removed from message objects and reaction events in #32701. This commit restores the `user` object in reaction events to maintain compatibility with mobile clients.
This commit is contained in:
@@ -20,6 +20,14 @@ format used by the Zulip server that they are interacting with.
|
|||||||
|
|
||||||
## Changes in Zulip 10.0
|
## Changes in Zulip 10.0
|
||||||
|
|
||||||
|
**Feature level 339**
|
||||||
|
|
||||||
|
* [`GET /events`](/api/get-events): Added `user` field back in
|
||||||
|
`reaction` events, reverting part of the [feature level 328
|
||||||
|
changes](#feature-level-328). Note that this field was only restored
|
||||||
|
in the events API, and remains deprecated, pending core clients
|
||||||
|
fully migrating away from accessing it.
|
||||||
|
|
||||||
**Feature level 338**
|
**Feature level 338**
|
||||||
|
|
||||||
* [`POST /register`](/api/register-queue): Added `password_max_length`
|
* [`POST /register`](/api/register-queue): Added `password_max_length`
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ DESKTOP_WARNING_VERSION = "5.9.3"
|
|||||||
# new level means in api_docs/changelog.md, as well as "**Changes**"
|
# new level means in api_docs/changelog.md, as well as "**Changes**"
|
||||||
# entries in the endpoint's documentation in `zulip.yaml`.
|
# entries in the endpoint's documentation in `zulip.yaml`.
|
||||||
|
|
||||||
API_FEATURE_LEVEL = 338 # Last bumped for adding password_max_length.
|
API_FEATURE_LEVEL = 339 # Last bumped for reaction events.
|
||||||
|
|
||||||
# Bump the minor PROVISION_VERSION to indicate that folks should provision
|
# Bump the minor PROVISION_VERSION to indicate that folks should provision
|
||||||
# only when going from an old version of the code to a newer version. Bump
|
# only when going from an old version of the code to a newer version. Bump
|
||||||
|
|||||||
@@ -238,6 +238,11 @@ exports.fixtures = {
|
|||||||
emoji_name: "airplane",
|
emoji_name: "airplane",
|
||||||
emoji_code: "2708",
|
emoji_code: "2708",
|
||||||
user_id: test_user.user_id,
|
user_id: test_user.user_id,
|
||||||
|
user: {
|
||||||
|
email: test_user.email,
|
||||||
|
full_name: test_user.full_name,
|
||||||
|
user_id: test_user.user_id,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
reaction__remove: {
|
reaction__remove: {
|
||||||
@@ -248,6 +253,11 @@ exports.fixtures = {
|
|||||||
emoji_name: "8ball",
|
emoji_name: "8ball",
|
||||||
emoji_code: "1f3b1",
|
emoji_code: "1f3b1",
|
||||||
user_id: test_user.user_id,
|
user_id: test_user.user_id,
|
||||||
|
user: {
|
||||||
|
email: test_user.email,
|
||||||
|
full_name: test_user.full_name,
|
||||||
|
user_id: test_user.user_id,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
realm__deactivated: {
|
realm__deactivated: {
|
||||||
|
|||||||
@@ -20,10 +20,20 @@ from zerver.tornado.django_api import send_event_on_commit
|
|||||||
def notify_reaction_update(
|
def notify_reaction_update(
|
||||||
user_profile: UserProfile, message: Message, reaction: Reaction, op: str
|
user_profile: UserProfile, message: Message, reaction: Reaction, op: str
|
||||||
) -> None:
|
) -> None:
|
||||||
|
user_dict = {
|
||||||
|
"user_id": user_profile.id,
|
||||||
|
"email": user_profile.email,
|
||||||
|
"full_name": user_profile.full_name,
|
||||||
|
}
|
||||||
|
|
||||||
event: dict[str, Any] = {
|
event: dict[str, Any] = {
|
||||||
"type": "reaction",
|
"type": "reaction",
|
||||||
"op": op,
|
"op": op,
|
||||||
"user_id": user_profile.id,
|
"user_id": user_profile.id,
|
||||||
|
# TODO: We plan to remove this redundant user_dict object once
|
||||||
|
# clients are updated to support accessing use user_id. See
|
||||||
|
# https://github.com/zulip/zulip/pull/14711 for details.
|
||||||
|
"user": user_dict,
|
||||||
"message_id": message.id,
|
"message_id": message.id,
|
||||||
"emoji_name": reaction.emoji_name,
|
"emoji_name": reaction.emoji_name,
|
||||||
"emoji_code": reaction.emoji_code,
|
"emoji_code": reaction.emoji_code,
|
||||||
|
|||||||
@@ -288,6 +288,15 @@ class EventPresence(EventPresenceCore):
|
|||||||
email: str | None = None
|
email: str | None = None
|
||||||
|
|
||||||
|
|
||||||
|
# Type for the legacy user field; the `user_id` field is intended to
|
||||||
|
# replace this and we expect to remove this once clients have migrated
|
||||||
|
# to support the modern API.
|
||||||
|
class ReactionLegacyUserType(BaseModel):
|
||||||
|
email: str
|
||||||
|
full_name: str
|
||||||
|
user_id: int
|
||||||
|
|
||||||
|
|
||||||
class EventReactionAdd(BaseModel):
|
class EventReactionAdd(BaseModel):
|
||||||
type: Literal["reaction"]
|
type: Literal["reaction"]
|
||||||
op: Literal["add"]
|
op: Literal["add"]
|
||||||
@@ -296,6 +305,7 @@ class EventReactionAdd(BaseModel):
|
|||||||
emoji_code: str
|
emoji_code: str
|
||||||
reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
|
reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
|
||||||
user_id: int
|
user_id: int
|
||||||
|
user: ReactionLegacyUserType
|
||||||
id: int
|
id: int
|
||||||
|
|
||||||
|
|
||||||
@@ -307,6 +317,7 @@ class EventReactionRemove(BaseModel):
|
|||||||
emoji_code: str
|
emoji_code: str
|
||||||
reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
|
reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
|
||||||
user_id: int
|
user_id: int
|
||||||
|
user: ReactionLegacyUserType
|
||||||
id: int
|
id: int
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1564,11 +1564,18 @@ paths:
|
|||||||
emoji_name: {}
|
emoji_name: {}
|
||||||
reaction_type: {}
|
reaction_type: {}
|
||||||
user_id: {}
|
user_id: {}
|
||||||
|
user: {}
|
||||||
example:
|
example:
|
||||||
{
|
{
|
||||||
"type": "reaction",
|
"type": "reaction",
|
||||||
"op": "add",
|
"op": "add",
|
||||||
"user_id": 10,
|
"user_id": 10,
|
||||||
|
"user":
|
||||||
|
{
|
||||||
|
"user_id": 10,
|
||||||
|
"email": "user10@zulip.testserver",
|
||||||
|
"full_name": "King Hamlet",
|
||||||
|
},
|
||||||
"message_id": 32,
|
"message_id": 32,
|
||||||
"emoji_name": "tada",
|
"emoji_name": "tada",
|
||||||
"emoji_code": "1f389",
|
"emoji_code": "1f389",
|
||||||
@@ -1603,11 +1610,18 @@ paths:
|
|||||||
emoji_name: {}
|
emoji_name: {}
|
||||||
reaction_type: {}
|
reaction_type: {}
|
||||||
user_id: {}
|
user_id: {}
|
||||||
|
user: {}
|
||||||
example:
|
example:
|
||||||
{
|
{
|
||||||
"type": "reaction",
|
"type": "reaction",
|
||||||
"op": "remove",
|
"op": "remove",
|
||||||
"user_id": 10,
|
"user_id": 10,
|
||||||
|
"user":
|
||||||
|
{
|
||||||
|
"user_id": 10,
|
||||||
|
"email": "user10@zulip.testserver",
|
||||||
|
"full_name": "King Hamlet",
|
||||||
|
},
|
||||||
"message_id": 52,
|
"message_id": 52,
|
||||||
"emoji_name": "tada",
|
"emoji_name": "tada",
|
||||||
"emoji_code": "1f389",
|
"emoji_code": "1f389",
|
||||||
@@ -23415,10 +23429,43 @@ components:
|
|||||||
|
|
||||||
**Changes**: New in Zulip 3.0 (feature level 2). The `user`
|
**Changes**: New in Zulip 3.0 (feature level 2). The `user`
|
||||||
object is deprecated and will be removed in the future.
|
object is deprecated and will be removed in the future.
|
||||||
|
user:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
deprecated: true
|
||||||
|
description: |
|
||||||
|
Dictionary with data on the user who added the
|
||||||
|
reaction, including the user ID as the `user_id`
|
||||||
|
field.
|
||||||
|
|
||||||
In Zulip 10.0 (feature level 328), the deprecated `user` object
|
**Changes**: This field was re-added in Zulip 10.0 (feature
|
||||||
was removed which contained the following properties: `user_id`,
|
level 339) after having been removed in Zulip 10.0 (feature
|
||||||
`email`, `full_name` and `is_mirror_dummy`.
|
level 328). It remains deprecated; it was re-added because the
|
||||||
|
React Native mobile app was still using it.
|
||||||
|
|
||||||
|
Deprecated and to be removed in a future release once core
|
||||||
|
clients have migrated to use the adjacent `user_id` field, which
|
||||||
|
was introduced in Zulip 3.0 (feature level 2). Clients
|
||||||
|
supporting older Zulip server versions should use the user ID
|
||||||
|
mentioned in the description above as they would the `user_id`
|
||||||
|
field.
|
||||||
|
properties:
|
||||||
|
user_id:
|
||||||
|
type: integer
|
||||||
|
description: |
|
||||||
|
ID of the user.
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Zulip API email of the user.
|
||||||
|
full_name:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Full name of the user.
|
||||||
|
is_mirror_dummy:
|
||||||
|
type: boolean
|
||||||
|
description: |
|
||||||
|
Whether the user is a mirror dummy.
|
||||||
MessagesEvent:
|
MessagesEvent:
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "#/components/schemas/MessagesBase"
|
- $ref: "#/components/schemas/MessagesBase"
|
||||||
|
|||||||
@@ -441,6 +441,7 @@ class ReactionEventTest(ZulipTestCase):
|
|||||||
event_user_ids = set(events[0]["users"])
|
event_user_ids = set(events[0]["users"])
|
||||||
|
|
||||||
self.assertEqual(expected_recipient_ids, event_user_ids)
|
self.assertEqual(expected_recipient_ids, event_user_ids)
|
||||||
|
self.assertEqual(event["user"]["email"], reaction_sender.email)
|
||||||
self.assertEqual(event["type"], "reaction")
|
self.assertEqual(event["type"], "reaction")
|
||||||
self.assertEqual(event["op"], "add")
|
self.assertEqual(event["op"], "add")
|
||||||
self.assertEqual(event["emoji_name"], "smile")
|
self.assertEqual(event["emoji_name"], "smile")
|
||||||
@@ -1060,6 +1061,9 @@ class ReactionAPIEventTest(EmojiReactionBase):
|
|||||||
event_user_ids = set(events[0]["users"])
|
event_user_ids = set(events[0]["users"])
|
||||||
|
|
||||||
self.assertEqual(expected_recipient_ids, event_user_ids)
|
self.assertEqual(expected_recipient_ids, event_user_ids)
|
||||||
|
self.assertEqual(event["user"]["user_id"], reaction_sender.id)
|
||||||
|
self.assertEqual(event["user"]["email"], reaction_sender.email)
|
||||||
|
self.assertEqual(event["user"]["full_name"], reaction_sender.full_name)
|
||||||
self.assertEqual(event["type"], "reaction")
|
self.assertEqual(event["type"], "reaction")
|
||||||
self.assertEqual(event["op"], "add")
|
self.assertEqual(event["op"], "add")
|
||||||
self.assertEqual(event["message_id"], pm_id)
|
self.assertEqual(event["message_id"], pm_id)
|
||||||
@@ -1102,6 +1106,9 @@ class ReactionAPIEventTest(EmojiReactionBase):
|
|||||||
event_user_ids = set(events[0]["users"])
|
event_user_ids = set(events[0]["users"])
|
||||||
|
|
||||||
self.assertEqual(expected_recipient_ids, event_user_ids)
|
self.assertEqual(expected_recipient_ids, event_user_ids)
|
||||||
|
self.assertEqual(event["user"]["user_id"], reaction_sender.id)
|
||||||
|
self.assertEqual(event["user"]["email"], reaction_sender.email)
|
||||||
|
self.assertEqual(event["user"]["full_name"], reaction_sender.full_name)
|
||||||
self.assertEqual(event["type"], "reaction")
|
self.assertEqual(event["type"], "reaction")
|
||||||
self.assertEqual(event["op"], "remove")
|
self.assertEqual(event["op"], "remove")
|
||||||
self.assertEqual(event["message_id"], pm_id)
|
self.assertEqual(event["message_id"], pm_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user