From 2d49b35f612cdbb79938fce68071debcf5eeec85 Mon Sep 17 00:00:00 2001 From: Philip Arndt Date: Thu, 22 Aug 2019 11:56:49 +1200 Subject: [PATCH 1/4] Allow `fcmOptions` in payload keys In #597 support was added for `fcmOptions` for specifying the analytics label for notifications. Unfortunately, the allowable list of keys wasn't updated to support it. --- src/messaging/messaging.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/messaging/messaging.ts b/src/messaging/messaging.ts index 6dc0e26006..c229c5a393 100644 --- a/src/messaging/messaging.ts +++ b/src/messaging/messaging.ts @@ -735,7 +735,7 @@ export class Messaging implements FirebaseServiceInterface { const payloadCopy: MessagingPayload = deepCopy(payload); const payloadKeys = Object.keys(payloadCopy); - const validPayloadKeys = ['data', 'notification']; + const validPayloadKeys = ['data', 'fcmOptions', 'notification']; let containsDataOrNotificationKey = false; payloadKeys.forEach((payloadKey) => { From 6946fb77a331f22c77ad4aa00d2f011261906ef7 Mon Sep 17 00:00:00 2001 From: Philip Arndt Date: Thu, 22 Aug 2019 12:03:23 +1200 Subject: [PATCH 2/4] add fcmOptions key to INVALID_PAYLOAD message --- src/messaging/messaging.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/messaging/messaging.ts b/src/messaging/messaging.ts index c229c5a393..086e050366 100644 --- a/src/messaging/messaging.ts +++ b/src/messaging/messaging.ts @@ -744,7 +744,7 @@ export class Messaging implements FirebaseServiceInterface { throw new FirebaseMessagingError( MessagingClientErrorCode.INVALID_PAYLOAD, `Messaging payload contains an invalid "${ payloadKey }" property. Valid properties are ` + - `"data" and "notification".`, + `"data", "fcmOptions", and "notification".`, ); } else { containsDataOrNotificationKey = true; From 9bcb1c314b0240169b509cdf92d3dd7047308ee1 Mon Sep 17 00:00:00 2001 From: Philip Arndt Date: Thu, 22 Aug 2019 12:29:40 +1200 Subject: [PATCH 3/4] Add specs to ensure fcmOptions is a valid key --- src/messaging/messaging-types.ts | 8 +++++++- test/resources/mocks.ts | 14 +++++++++++--- test/unit/messaging/messaging.spec.ts | 10 ++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/messaging/messaging-types.ts b/src/messaging/messaging-types.ts index c6958cefe9..298aff653b 100644 --- a/src/messaging/messaging-types.ts +++ b/src/messaging/messaging-types.ts @@ -179,6 +179,11 @@ export interface DataMessagePayload { [key: string]: string; } +/* Payload for fcmOptions messages */ +export interface FcmOptionsPayload { + analyticsLabel?: string; +} + /* Payload for notification messages */ export interface NotificationMessagePayload { tag?: string; @@ -196,9 +201,10 @@ export interface NotificationMessagePayload { [other: string]: string; } -/* Composite messaging payload (data and notification payloads are both optional) */ +/* Composite messaging payload (data, fcmOptions, and notification payloads are all optional) */ export interface MessagingPayload { data?: DataMessagePayload; + fcmOptions?: FcmOptionsPayload; notification?: NotificationMessagePayload; } diff --git a/test/resources/mocks.ts b/test/resources/mocks.ts index 822cd68ff0..20e9e6ffe7 100644 --- a/test/resources/mocks.ts +++ b/test/resources/mocks.ts @@ -258,6 +258,11 @@ const mockPayloadNotificationValue = { body: 'Mock body.', }; +const payload = { + data: mockPayloadDataValue, + notification: mockPayloadNotificationValue, +}; + export const messaging = { topic: 'mock-topic', topicWithPrefix: '/topics/mock-topic', @@ -273,9 +278,12 @@ export const messaging = { payloadNotificationOnly: { notification: mockPayloadNotificationValue, }, - payload: { - data: mockPayloadDataValue, - notification: mockPayloadNotificationValue, + payload, + payloadWithFcmOptions: { + ...payload, + fcmOptions: { + analyticsLabel: 'test.analytics', + }, }, options: { collapseKey: 'foo', diff --git a/test/unit/messaging/messaging.spec.ts b/test/unit/messaging/messaging.spec.ts index ef8ffa29b4..1c917ce0c1 100644 --- a/test/unit/messaging/messaging.spec.ts +++ b/test/unit/messaging/messaging.spec.ts @@ -2710,6 +2710,16 @@ describe('Messaging', () => { ); }); + it('should be fulfilled given an options object containing only whitelisted properties with fcmOptions', () => { + mockedRequests.push(mockSendToDeviceStringRequest()); + + return messaging.sendToTopic( + mocks.messaging.topic, + mocks.messaging.payloadWithFcmOptions, + mocks.messaging.options, + ); + }); + it('should be fulfilled given an options object containing non-whitelisted properties', () => { mockedRequests.push(mockSendToDeviceStringRequest()); From 570b7c809e9873054a490fbd6d905223e7bd6d5a Mon Sep 17 00:00:00 2001 From: Philip Arndt Date: Thu, 22 Aug 2019 15:10:24 +1200 Subject: [PATCH 4/4] Conform to index signature --- src/messaging/messaging-types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/messaging/messaging-types.ts b/src/messaging/messaging-types.ts index 298aff653b..a848969a16 100644 --- a/src/messaging/messaging-types.ts +++ b/src/messaging/messaging-types.ts @@ -182,6 +182,7 @@ export interface DataMessagePayload { /* Payload for fcmOptions messages */ export interface FcmOptionsPayload { analyticsLabel?: string; + [key: string]: string; } /* Payload for notification messages */