notifications: Add user_id in the GCM & APNS payload.

This makes it easy to uniquely identify the user account associated
with a notification by, for example, the (realm_uri, user_id) pair.

This helps improve notifications in the mobile apps.
See https://github.com/zulip/zulip-mobile/pull/3407#discussion_r266196616

Fixes #11961.
This commit is contained in:
Vishwesh Jainkuniya
2019-04-20 20:51:26 +05:30
committed by Tim Abbott
parent 2eb713552f
commit 4f7c463257
2 changed files with 19 additions and 9 deletions

View File

@@ -26,7 +26,7 @@ from zerver.lib.message import access_message, \
from zerver.lib.queue import retry_event
from zerver.lib.remote_server import send_to_push_bouncer, send_json_to_push_bouncer
from zerver.lib.timestamp import datetime_to_timestamp
from zerver.models import PushDeviceToken, Message, Realm, Recipient, \
from zerver.models import PushDeviceToken, Message, Recipient, \
UserMessage, UserProfile, \
get_display_recipient, receives_offline_push_notifications, \
receives_online_notifications, get_user_profile_by_id, \
@@ -513,20 +513,21 @@ def truncate_content(content: str) -> Tuple[str, bool]:
return content, False
return content[:200] + "", True
def get_base_payload(realm: Realm) -> Dict[str, Any]:
def get_base_payload(user_profile: UserProfile) -> Dict[str, Any]:
'''Common fields for all notification payloads.'''
data = {} # type: Dict[str, Any]
# These will let the app support logging into multiple realms and servers.
data['server'] = settings.EXTERNAL_HOST
data['realm_id'] = realm.id
data['realm_uri'] = realm.uri
data['realm_id'] = user_profile.realm.id
data['realm_uri'] = user_profile.realm.uri
data['user_id'] = user_profile.id
return data
def get_message_payload(message: Message) -> Dict[str, Any]:
def get_message_payload(user_profile: UserProfile, message: Message) -> Dict[str, Any]:
'''Common fields for `message` payloads, for all platforms.'''
data = get_base_payload(message.sender.realm)
data = get_base_payload(user_profile)
# `sender_id` is preferred, but some existing versions use `sender_email`.
data['sender_id'] = message.sender.id
@@ -569,7 +570,7 @@ def get_apns_alert_subtitle(message: Message) -> str:
def get_message_payload_apns(user_profile: UserProfile, message: Message) -> Dict[str, Any]:
'''A `message` payload for iOS, via APNs.'''
zulip_data = get_message_payload(message)
zulip_data = get_message_payload(user_profile, message)
zulip_data.update({
'message_ids': [message.id],
})
@@ -591,7 +592,7 @@ def get_message_payload_gcm(
user_profile: UserProfile, message: Message,
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
'''A `message` payload + options, for Android via GCM/FCM.'''
data = get_message_payload(message)
data = get_message_payload(user_profile, message)
content, truncated = truncate_content(get_mobile_push_content(message.rendered_content))
data.update({
'user': user_profile.email,
@@ -611,7 +612,7 @@ def get_remove_payload_gcm(
user_profile: UserProfile, message_ids: List[int],
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
'''A `remove` payload + options, for Android via GCM/FCM.'''
gcm_payload = get_base_payload(user_profile.realm)
gcm_payload = get_base_payload(user_profile)
gcm_payload.update({
'event': 'remove',
'zulip_message_ids': ','.join(str(id) for id in message_ids),

View File

@@ -979,6 +979,7 @@ class TestGetAPNsPayload(PushNotificationTest):
'server': settings.EXTERNAL_HOST,
'realm_id': message.sender.realm.id,
'realm_uri': message.sender.realm.uri,
"user_id": user_profile.id,
}
}
}
@@ -1014,6 +1015,7 @@ class TestGetAPNsPayload(PushNotificationTest):
'server': settings.EXTERNAL_HOST,
'realm_id': message.sender.realm.id,
'realm_uri': message.sender.realm.uri,
"user_id": user_profile.id,
}
}
}
@@ -1047,6 +1049,7 @@ class TestGetAPNsPayload(PushNotificationTest):
'server': settings.EXTERNAL_HOST,
'realm_id': message.sender.realm.id,
'realm_uri': message.sender.realm.uri,
"user_id": user_profile.id,
}
}
}
@@ -1079,6 +1082,7 @@ class TestGetAPNsPayload(PushNotificationTest):
'server': settings.EXTERNAL_HOST,
'realm_id': message.sender.realm.id,
'realm_uri': message.sender.realm.uri,
"user_id": user_profile.id,
}
}
}
@@ -1114,6 +1118,7 @@ class TestGetAPNsPayload(PushNotificationTest):
'server': settings.EXTERNAL_HOST,
'realm_id': message.sender.realm.id,
'realm_uri': message.sender.realm.uri,
"user_id": user_profile.id,
}
}
}
@@ -1132,6 +1137,7 @@ class TestGetGCMPayload(PushNotificationTest):
payload, gcm_options = get_message_payload_gcm(user_profile, message)
self.assertDictEqual(payload, {
"user": user_profile.email,
"user_id": user_profile.id,
"event": "message",
"alert": "New mention from King Hamlet",
"zulip_message_id": message.id,
@@ -1160,6 +1166,7 @@ class TestGetGCMPayload(PushNotificationTest):
payload, gcm_options = get_message_payload_gcm(user_profile, message)
self.assertDictEqual(payload, {
"user": user_profile.email,
"user_id": user_profile.id,
"event": "message",
"alert": "New private message from King Hamlet",
"zulip_message_id": message.id,
@@ -1187,6 +1194,7 @@ class TestGetGCMPayload(PushNotificationTest):
payload, gcm_options = get_message_payload_gcm(user_profile, message)
self.assertDictEqual(payload, {
"user": user_profile.email,
"user_id": user_profile.id,
"event": "message",
"alert": "New stream message from King Hamlet in Denmark",
"zulip_message_id": message.id,
@@ -1217,6 +1225,7 @@ class TestGetGCMPayload(PushNotificationTest):
payload, gcm_options = get_message_payload_gcm(user_profile, message)
self.assertDictEqual(payload, {
"user": user_profile.email,
"user_id": user_profile.id,
"event": "message",
"alert": "New stream message from King Hamlet in Denmark",
"zulip_message_id": message.id,