mirror of https://github.com/zulip/zulip.git
push_notification: Send data to notification bouncer.
This commit is contained in:
parent
4e2a6834d8
commit
4a864c7515
|
@ -2,7 +2,7 @@ from __future__ import absolute_import
|
||||||
|
|
||||||
import random
|
import random
|
||||||
import requests
|
import requests
|
||||||
from typing import Any, Dict, List, Optional, SupportsInt, Text
|
from typing import Any, Dict, List, Optional, SupportsInt, Text, Union
|
||||||
|
|
||||||
from version import ZULIP_VERSION
|
from version import ZULIP_VERSION
|
||||||
from zerver.models import PushDeviceToken, Message, Recipient, UserProfile, \
|
from zerver.models import PushDeviceToken, Message, Recipient, UserProfile, \
|
||||||
|
@ -341,15 +341,21 @@ def handle_push_notification(user_profile_id, missed_message):
|
||||||
if umessage.flags.read:
|
if umessage.flags.read:
|
||||||
return
|
return
|
||||||
|
|
||||||
android_devices = [device for device in
|
|
||||||
PushDeviceToken.objects.filter(user=user_profile,
|
|
||||||
kind=PushDeviceToken.GCM)]
|
|
||||||
apple_devices = list(PushDeviceToken.objects.filter(user=user_profile,
|
|
||||||
kind=PushDeviceToken.APNS))
|
|
||||||
|
|
||||||
apns_payload = get_apns_payload(message)
|
apns_payload = get_apns_payload(message)
|
||||||
gcm_payload = get_gcm_payload(user_profile, message)
|
gcm_payload = get_gcm_payload(user_profile, message)
|
||||||
|
|
||||||
|
if uses_notification_bouncer():
|
||||||
|
send_notifications_to_bouncer(user_profile_id,
|
||||||
|
apns_payload,
|
||||||
|
gcm_payload)
|
||||||
|
return
|
||||||
|
|
||||||
|
android_devices = list(PushDeviceToken.objects.filter(user=user_profile,
|
||||||
|
kind=PushDeviceToken.GCM))
|
||||||
|
|
||||||
|
apple_devices = list(PushDeviceToken.objects.filter(user=user_profile,
|
||||||
|
kind=PushDeviceToken.APNS))
|
||||||
|
|
||||||
if apple_devices or android_devices:
|
if apple_devices or android_devices:
|
||||||
# TODO: set badge count in a better way
|
# TODO: set badge count in a better way
|
||||||
if apple_devices:
|
if apple_devices:
|
||||||
|
@ -362,6 +368,15 @@ def handle_push_notification(user_profile_id, missed_message):
|
||||||
except UserMessage.DoesNotExist:
|
except UserMessage.DoesNotExist:
|
||||||
logging.error("Could not find UserMessage with message_id %s" % (missed_message['message_id'],))
|
logging.error("Could not find UserMessage with message_id %s" % (missed_message['message_id'],))
|
||||||
|
|
||||||
|
def send_notifications_to_bouncer(user_profile_id, apns_payload, gcm_payload):
|
||||||
|
# type: (int, Dict[str, Any], Dict[str, Any]) -> None
|
||||||
|
post_data = {
|
||||||
|
'user_id': user_profile_id,
|
||||||
|
'apns_payload': apns_payload,
|
||||||
|
'gcm_payload': gcm_payload,
|
||||||
|
}
|
||||||
|
send_json_to_push_bouncer('POST', 'notify', post_data)
|
||||||
|
|
||||||
def add_push_device_token(user_profile, token_str, kind, ios_app_id=None):
|
def add_push_device_token(user_profile, token_str, kind, ios_app_id=None):
|
||||||
# type: (UserProfile, str, int, Optional[str]) -> None
|
# type: (UserProfile, str, int, Optional[str]) -> None
|
||||||
|
|
||||||
|
@ -417,21 +432,33 @@ def remove_push_device_token(user_profile, token_str, kind):
|
||||||
except PushDeviceToken.DoesNotExist:
|
except PushDeviceToken.DoesNotExist:
|
||||||
raise JsonableError(_("Token does not exist"))
|
raise JsonableError(_("Token does not exist"))
|
||||||
|
|
||||||
|
def send_json_to_push_bouncer(method, endpoint, post_data):
|
||||||
def send_to_push_bouncer(method, endpoint, post_data):
|
|
||||||
# type: (str, str, Dict[str, Any]) -> None
|
# type: (str, str, Dict[str, Any]) -> None
|
||||||
|
send_to_push_bouncer(
|
||||||
|
method,
|
||||||
|
endpoint,
|
||||||
|
ujson.dumps(post_data),
|
||||||
|
extra_headers={"Content-type": "application/json"},
|
||||||
|
)
|
||||||
|
|
||||||
|
def send_to_push_bouncer(method, endpoint, post_data, extra_headers=None):
|
||||||
|
# type: (str, str, Union[Text, Dict[str, Any]], Optional[Dict[str, Any]]) -> None
|
||||||
url = urllib.parse.urljoin(settings.PUSH_NOTIFICATION_BOUNCER_URL,
|
url = urllib.parse.urljoin(settings.PUSH_NOTIFICATION_BOUNCER_URL,
|
||||||
'/api/v1/remotes/push/' + endpoint)
|
'/api/v1/remotes/push/' + endpoint)
|
||||||
api_auth = requests.auth.HTTPBasicAuth(settings.ZULIP_ORG_ID,
|
api_auth = requests.auth.HTTPBasicAuth(settings.ZULIP_ORG_ID,
|
||||||
settings.ZULIP_ORG_KEY)
|
settings.ZULIP_ORG_KEY)
|
||||||
|
|
||||||
|
headers = {"User-agent": "ZulipServer/%s" % (ZULIP_VERSION,)}
|
||||||
|
if extra_headers is not None:
|
||||||
|
headers.update(extra_headers)
|
||||||
|
|
||||||
res = requests.request(method,
|
res = requests.request(method,
|
||||||
url,
|
url,
|
||||||
data=ujson.dumps(post_data),
|
data=post_data,
|
||||||
auth=api_auth,
|
auth=api_auth,
|
||||||
timeout=30,
|
timeout=30,
|
||||||
verify=True,
|
verify=True,
|
||||||
headers={"User-agent": "ZulipServer/%s" % (ZULIP_VERSION,)})
|
headers=headers)
|
||||||
|
|
||||||
# TODO: Think more carefully about how this error hanlding should work.
|
# TODO: Think more carefully about how this error hanlding should work.
|
||||||
if res.status_code >= 500:
|
if res.status_code >= 500:
|
||||||
|
|
|
@ -16,6 +16,8 @@ v1_api_and_json_patterns = [
|
||||||
{'POST': 'zilencer.views.remote_server_register_push'}),
|
{'POST': 'zilencer.views.remote_server_register_push'}),
|
||||||
url('^remotes/push/unregister$', rest_dispatch,
|
url('^remotes/push/unregister$', rest_dispatch,
|
||||||
{'POST': 'zilencer.views.remote_server_unregister_push'}),
|
{'POST': 'zilencer.views.remote_server_unregister_push'}),
|
||||||
|
url('^remotes/push/notify$', rest_dispatch,
|
||||||
|
{'POST': 'zilencer.views.remote_server_notify_push'}),
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
|
@ -71,3 +71,12 @@ def remote_server_unregister_push(request, entity, token=REQ(),
|
||||||
return json_error(_("Token does not exist"))
|
return json_error(_("Token does not exist"))
|
||||||
|
|
||||||
return json_success()
|
return json_success()
|
||||||
|
|
||||||
|
@has_request_variables
|
||||||
|
def remote_server_notify_push(request, # type: HttpRequest
|
||||||
|
entity, # type: Union[UserProfile, RemoteZulipServer]
|
||||||
|
payload=REQ(argument_type='body') # type: Dict[str, Any]
|
||||||
|
):
|
||||||
|
# type: (...) -> HttpResponse
|
||||||
|
validate_entity(entity)
|
||||||
|
return json_success()
|
||||||
|
|
Loading…
Reference in New Issue