-
Notifications
You must be signed in to change notification settings - Fork 351
feat(fcm): Enable fid and deprecate token for Send API
#951
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
64e98d1
92fa458
f384d6e
0509f0a
5c68f2a
f258b3f
e808deb
1831f6a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,6 +19,7 @@ | |
| import math | ||
| import numbers | ||
| import re | ||
| import warnings | ||
|
|
||
| from firebase_admin import _messaging_utils | ||
|
|
||
|
|
@@ -27,7 +28,7 @@ class Message: | |
| """A message that can be sent via Firebase Cloud Messaging. | ||
|
|
||
| Contains payload information as well as recipient information. In particular, the message must | ||
| contain exactly one of token, topic or condition fields. | ||
| contain exactly one of fid, token, topic or condition fields. | ||
|
|
||
| Args: | ||
| data: A dictionary of data fields (optional). All keys and values in the dictionary must be | ||
|
|
@@ -37,20 +38,29 @@ class Message: | |
| webpush: An instance of ``messaging.WebpushConfig`` (optional). | ||
| apns: An instance of ``messaging.ApnsConfig`` (optional). | ||
| fcm_options: An instance of ``messaging.FCMOptions`` (optional). | ||
| token: The registration token of the device to which the message should be sent (optional). | ||
| fid: The Firebase installation ID of an FCM registered app instance to which the | ||
| message should be sent (optional). | ||
| token: Deprecated. Use ``fid`` instead. | ||
| topic: Name of the FCM topic to which the message should be sent (optional). Topic name | ||
| may contain the ``/topics/`` prefix. | ||
| condition: The FCM condition to which the message should be sent (optional). | ||
| """ | ||
|
|
||
| def __init__(self, data=None, notification=None, android=None, webpush=None, apns=None, | ||
| fcm_options=None, token=None, topic=None, condition=None): | ||
| fcm_options=None, token=None, topic=None, condition=None, fid=None): | ||
| if token is not None: | ||
| warnings.warn( | ||
| "Message.token is deprecated. Use fid instead.", | ||
| DeprecationWarning, | ||
| stacklevel=2 | ||
| ) | ||
| self.data = data | ||
| self.notification = notification | ||
| self.android = android | ||
| self.webpush = webpush | ||
| self.apns = apns | ||
| self.fcm_options = fcm_options | ||
| self.fid = fid | ||
| self.token = token | ||
| self.topic = topic | ||
| self.condition = condition | ||
|
|
@@ -60,10 +70,11 @@ def __str__(self): | |
|
|
||
|
|
||
| class MulticastMessage: | ||
| """A message that can be sent to multiple tokens via Firebase Cloud Messaging. | ||
| """A message that can be sent to multiple tokens or fids via Firebase Cloud Messaging. | ||
|
|
||
| Args: | ||
| tokens: A list of registration tokens of targeted devices. | ||
| fids: A list of Firebase Installation IDs of targeted app instances (optional). | ||
| tokens: Deprecated. Use ``fids`` instead (optional). | ||
| data: A dictionary of data fields (optional). All keys and values in the dictionary must be | ||
| strings. | ||
| notification: An instance of ``messaging.Notification`` (optional). | ||
|
|
@@ -72,12 +83,32 @@ class MulticastMessage: | |
| apns: An instance of ``messaging.ApnsConfig`` (optional). | ||
| fcm_options: An instance of ``messaging.FCMOptions`` (optional). | ||
| """ | ||
| def __init__(self, tokens, data=None, notification=None, android=None, webpush=None, apns=None, | ||
| fcm_options=None): | ||
| _Validators.check_string_list('MulticastMessage.tokens', tokens) | ||
| if len(tokens) > 500: | ||
| raise ValueError('MulticastMessage.tokens must not contain more than 500 tokens.') | ||
| self.tokens = tokens | ||
| def __init__( | ||
| self, tokens=None, fids=None, data=None, notification=None, android=None, | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does |
||
| webpush=None, apns=None, fcm_options=None): | ||
| if tokens is not None: | ||
| warnings.warn( | ||
| "MulticastMessage.tokens is deprecated. Use fids instead.", | ||
| DeprecationWarning, | ||
| stacklevel=2 | ||
| ) | ||
|
|
||
| if (tokens is None and fids is None) or (tokens is not None and fids is not None): | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it possible to support the case where the tokens is not None and fids is not None? We can raise an error if Supporting this case will allow people to start using With that being said, this is just a nice-to-have. It's unnecessary if it requires too many changes. |
||
| raise ValueError("Must specify either 'tokens' or 'fids'.") | ||
|
|
||
| if tokens is not None: | ||
| _Validators.check_string_list('MulticastMessage.tokens', tokens) | ||
| if len(tokens) > 500: | ||
| raise ValueError('MulticastMessage.tokens must not contain more than 500 tokens.') | ||
| self.tokens = tokens | ||
| self.fids = None | ||
| else: | ||
| _Validators.check_string_list('MulticastMessage.fids', fids) | ||
| if len(fids) > 500: | ||
| raise ValueError('MulticastMessage.fids must not contain more than 500 fids.') | ||
| self.fids = fids | ||
| self.tokens = None | ||
|
|
||
| self.data = data | ||
| self.notification = notification | ||
| self.android = android | ||
|
|
@@ -695,16 +726,17 @@ def default(self, o): # pylint: disable=method-hidden | |
| 'Message.condition', o.condition, non_empty=True), | ||
| 'data': _Validators.check_string_dict('Message.data', o.data), | ||
| 'notification': MessageEncoder.encode_notification(o.notification), | ||
| 'fid': _Validators.check_string('Message.fid', o.fid, non_empty=True), | ||
| 'token': _Validators.check_string('Message.token', o.token, non_empty=True), | ||
| 'topic': _Validators.check_string('Message.topic', o.topic, non_empty=True), | ||
| 'webpush': MessageEncoder.encode_webpush(o.webpush), | ||
| 'fcm_options': MessageEncoder.encode_fcm_options(o.fcm_options), | ||
| } | ||
| result['topic'] = MessageEncoder.sanitize_topic_name(result.get('topic')) | ||
| result = MessageEncoder.remove_null_values(result) | ||
| target_count = sum(t in result for t in ['token', 'topic', 'condition']) | ||
| target_count = sum(t in result for t in ['fid', 'token', 'topic', 'condition']) | ||
| if target_count != 1: | ||
| raise ValueError('Exactly one of token, topic or condition must be specified.') | ||
| raise ValueError('Exactly one of fid, token, topic or condition must be specified.') | ||
| return result | ||
|
|
||
| @classmethod | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Should it be
Message.fidto be aligned withMessage.token?