Skip to content

Commit 3b928be

Browse files
authored
feat(condo): DOMA-5258 add cancel type to voip push message (#5850)
* feat(condo): DOMA-5258 add cancel type to voip push message * feat(condo): DOMA-5258 changed push type from VoIP push to regular push * feat(condo): DOMA-5258 proof of work new message type * feat(condo): DOMA-5258 remove unnecessary code * feat(condo): DOMA-5258 rename field in delivery options * feat(condo): DOMA-5258 comments after review have been corrected * feat(condo): DOMA-5258 add tests for new type message * feat(condo): DOMA-5258 add defaultValue to getPreferredPushTypeByMessageType utils
1 parent ea3693e commit 3b928be

File tree

17 files changed

+319
-95
lines changed

17 files changed

+319
-95
lines changed

apps/condo/domains/miniapp/schema/SendB2CAppPushMessageService.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ const { AppMessageSetting } = require('@condo/domains/miniapp/utils/serverSchema
1919
const { B2CApp } = require('@condo/domains/miniapp/utils/serverSchema')
2020
const {
2121
VOIP_INCOMING_CALL_MESSAGE_TYPE,
22+
CANCELED_CALL_MESSAGE_PUSH_TYPE,
2223
B2C_APP_MESSAGE_PUSH_TYPE,
2324
} = require('@condo/domains/notification/constants/constants')
2425
const { sendMessage } = require('@condo/domains/notification/utils/serverSchema')
2526
const { Resident } = require('@condo/domains/resident/utils/serverSchema')
2627
const { User } = require('@condo/domains/user/utils/serverSchema')
2728
const { RedisGuard } = require('@condo/domains/user/utils/serverSchema/guards')
2829

29-
3030
const CACHE_TTL = {
3131
DEFAULT: DEFAULT_NOTIFICATION_WINDOW_DURATION_IN_SECONDS,
3232
VOIP_INCOMING_CALL_MESSAGE: 2,
@@ -90,7 +90,7 @@ const SendB2CAppPushMessageService = new GQLCustomSchema('SendB2CAppPushMessageS
9090
types: [
9191
{
9292
access: true,
93-
type: `enum SendB2CAppPushMessageType { ${VOIP_INCOMING_CALL_MESSAGE_TYPE} ${B2C_APP_MESSAGE_PUSH_TYPE} }`,
93+
type: `enum SendB2CAppPushMessageType { ${VOIP_INCOMING_CALL_MESSAGE_TYPE} ${CANCELED_CALL_MESSAGE_PUSH_TYPE} ${B2C_APP_MESSAGE_PUSH_TYPE} }`,
9494
},
9595
{
9696
access: true,

apps/condo/domains/miniapp/schema/SendB2CAppPushMessageService.test.js

+28
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ const {
2020
} = require('@condo/domains/miniapp/utils/testSchema')
2121
const {
2222
B2C_APP_MESSAGE_PUSH_TYPE,
23+
CANCELED_CALL_MESSAGE_PUSH_TYPE,
2324
VOIP_INCOMING_CALL_MESSAGE_TYPE,
25+
B2B_APP_MESSAGE_PUSH_TYPE,
26+
MESSAGE_SENDING_STATUS,
2427
APPLE_CONFIG_TEST_VOIP_PUSHTOKEN_ENV,
2528
DEVICE_PLATFORM_IOS, APP_RESIDENT_ID_IOS,
2629
PUSH_TRANSPORT_APPLE,
@@ -328,6 +331,31 @@ describe('SendB2CAppPushMessageService', () => {
328331
})
329332
})
330333

334+
describe('Checking the sending of available push types in SendB2CAppPushMessageService', () => {
335+
test('Push with type CANCELED_CALL_MESSAGE_PUSH_TYPE is being sent', async () => {
336+
const [message] = await sendB2CAppPushMessageByTestClient(admin, {
337+
...appAttrs,
338+
type: CANCELED_CALL_MESSAGE_PUSH_TYPE,
339+
})
340+
expect(message.id).toMatch(UUID_RE)
341+
expect(message.status).toMatch(MESSAGE_SENDING_STATUS)
342+
})
343+
344+
test('Push with type B2B_APP_MESSAGE_PUSH_TYPE is not sent', async () => {
345+
const expectedErrorMessage = 'Variable "$data" got invalid value "B2B_APP_MESSAGE_PUSH" at "data.type"; Value "B2B_APP_MESSAGE_PUSH" does not exist in "SendB2CAppPushMessageType" enum. Did you mean the enum value "B2C_APP_MESSAGE_PUSH"?'
346+
347+
await expectToThrowGraphQLRequestError(
348+
async () => {
349+
await sendB2CAppPushMessageByTestClient(admin, {
350+
...appAttrs,
351+
type: B2B_APP_MESSAGE_PUSH_TYPE,
352+
})
353+
},
354+
expectedErrorMessage,
355+
)
356+
})
357+
})
358+
331359
/**
332360
* This test is needed only for local debugging
333361
*/

apps/condo/domains/notification/constants/constants.js

+116-92
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ const MOBILE_APP_UPDATE_AVAILABLE_MESSAGE_PUSH_TYPE = 'MOBILE_APP_UPDATE_AVAILAB
6060
const CUSTOM_CONTENT_MESSAGE_EMAIL_TYPE = 'CUSTOM_CONTENT_MESSAGE_EMAIL'
6161
const CUSTOM_CONTENT_MESSAGE_SMS_TYPE = 'CUSTOM_CONTENT_MESSAGE_SMS'
6262
const VOIP_INCOMING_CALL_MESSAGE_TYPE = 'VOIP_INCOMING_CALL_MESSAGE'
63+
const CANCELED_CALL_MESSAGE_PUSH_TYPE = 'CANCELED_CALL_MESSAGE_PUSH'
6364
const RECURRENT_PAYMENT_PROCEEDING_SUCCESS_RESULT_MESSAGE_TYPE = 'RECURRENT_PAYMENT_PROCEEDING_SUCCESS_RESULT_MESSAGE'
6465
const RECURRENT_PAYMENT_PROCEEDING_UNKNOWN_ERROR_MESSAGE_TYPE = 'RECURRENT_PAYMENT_PROCEEDING_UNKNOWN_ERROR_MESSAGE'
6566
const RECURRENT_PAYMENT_PROCEEDING_ACQUIRING_PAYMENT_PROCEED_ERROR_MESSAGE_TYPE = 'RECURRENT_PAYMENT_PROCEEDING_ACQUIRING_PAYMENT_PROCEED_ERROR_MESSAGE'
@@ -89,6 +90,101 @@ const SEND_DAILY_STATISTICS_MESSAGE_TYPE = 'SEND_DAILY_STATISTICS'
8990
const B2B_APP_MESSAGE_PUSH_TYPE = 'B2B_APP_MESSAGE_PUSH'
9091
const PASS_TICKET_CREATED_MESSAGE_TYPE = 'PASS_TICKET_CREATED'
9192

93+
94+
const MESSAGE_SENDING_STATUS = 'sending'
95+
const MESSAGE_RESENDING_STATUS = 'resending'
96+
const MESSAGE_PROCESSING_STATUS = 'processing'
97+
const MESSAGE_ERROR_STATUS = 'error'
98+
const MESSAGE_BLACKLISTED_STATUS = 'blacklisted'
99+
const MESSAGE_DELIVERED_STATUS = 'delivered'
100+
const MESSAGE_CANCELED_STATUS = 'canceled'
101+
const MESSAGE_SENT_STATUS = 'sent'
102+
const MESSAGE_READ_STATUS = 'read'
103+
const MESSAGE_DISABLED_BY_USER_STATUS = 'disabledByUser'
104+
const MESSAGE_THROTTLED_STATUS = 'throttled'
105+
const MESSAGE_STATUSES = [
106+
MESSAGE_SENDING_STATUS,
107+
MESSAGE_RESENDING_STATUS,
108+
MESSAGE_PROCESSING_STATUS,
109+
MESSAGE_ERROR_STATUS,
110+
MESSAGE_BLACKLISTED_STATUS,
111+
MESSAGE_SENT_STATUS,
112+
MESSAGE_DELIVERED_STATUS,
113+
MESSAGE_READ_STATUS,
114+
MESSAGE_CANCELED_STATUS,
115+
MESSAGE_DISABLED_BY_USER_STATUS,
116+
MESSAGE_THROTTLED_STATUS,
117+
]
118+
119+
const MESSAGE_BATCH_CREATED_STATUS = 'created'
120+
const MESSAGE_BATCH_PROCESSING_STATUS = 'processing'
121+
const MESSAGE_BATCH_FAILED_STATUS = 'failed'
122+
const MESSAGE_BATCH_DONE_STATUS = 'done'
123+
const MESSAGE_BATCH_STATUSES = [MESSAGE_BATCH_CREATED_STATUS, MESSAGE_BATCH_PROCESSING_STATUS, MESSAGE_BATCH_FAILED_STATUS, MESSAGE_BATCH_DONE_STATUS]
124+
const MESSAGE_BATCH_TYPE_OPTIONS = [CUSTOM_CONTENT_MESSAGE_TYPE, MOBILE_APP_UPDATE_AVAILABLE_MESSAGE_PUSH_TYPE, CUSTOM_CONTENT_MESSAGE_PUSH_TYPE, CUSTOM_CONTENT_MESSAGE_EMAIL_TYPE, CUSTOM_CONTENT_MESSAGE_SMS_TYPE]
125+
126+
const DEVICE_PLATFORM_ANDROID = 'android'
127+
const DEVICE_PLATFORM_IOS = 'ios'
128+
const DEVICE_PLATFORM_WEB = 'web'
129+
const DEVICE_PLATFORM_TYPES = [DEVICE_PLATFORM_ANDROID, DEVICE_PLATFORM_IOS, DEVICE_PLATFORM_WEB]
130+
131+
const PUSH_TYPE_DEFAULT = 'default'
132+
const PUSH_TYPE_SILENT_DATA = 'silent_data'
133+
const PUSH_TYPES = [PUSH_TYPE_DEFAULT, PUSH_TYPE_SILENT_DATA]
134+
135+
const PUSH_TRANSPORT_FIREBASE = 'firebase'
136+
const PUSH_TRANSPORT_REDSTORE = 'redstore'
137+
const PUSH_TRANSPORT_APPLE = 'apple'
138+
const PUSH_TRANSPORT_HUAWEI = 'huawei'
139+
const PUSH_TRANSPORT_TYPES = [PUSH_TRANSPORT_FIREBASE, PUSH_TRANSPORT_APPLE, PUSH_TRANSPORT_HUAWEI, PUSH_TRANSPORT_REDSTORE]
140+
const PUSH_FAKE_TOKEN_SUCCESS = 'PUSH_FAKE_TOKEN_SUCCESS'
141+
const PUSH_FAKE_TOKEN_FAIL = 'PUSH_FAKE_TOKEN_FAIL'
142+
143+
const FIREBASE_CONFIG_ENV = 'FIREBASE_CONFIG_JSON'
144+
const FIREBASE_CONFIG_TEST_PUSHTOKEN_ENV = 'FIREBASE_PUSH_TOKEN_TEST'
145+
146+
const REDSTORE_CONFIG_ENV = 'REDSTORE_CONFIG_JSON'
147+
const REDSTORE_CONFIG_TEST_PUSHTOKEN_ENV = 'REDSTORE_PUSH_TOKEN_TEST'
148+
149+
const HCM_CONFIG_ENV = 'HCM_CONFIG_JSON'
150+
const HCM_CONFIG_TEST_PUSHTOKEN_ENV_RESIDENT = 'HCM_PUSH_TOKEN_TEST_RESIDENT'
151+
const HCM_CONFIG_TEST_PUSHTOKEN_ENV_MASTER = 'HCM_PUSH_TOKEN_TEST_MASTER'
152+
153+
const APPLE_CONFIG_ENV = 'APPLE_CONFIG_JSON'
154+
const APPLE_CONFIG_TEST_PUSHTOKEN_ENV = 'APPLE_PUSH_TOKEN_TEST'
155+
const APPLE_CONFIG_TEST_VOIP_PUSHTOKEN_ENV = 'APPLE_VOIP_PUSH_TOKEN_TEST'
156+
157+
const APPS_WITH_DISABLED_NOTIFICATIONS_ENV = 'APPS_WITH_DISABLED_NOTIFICATIONS'
158+
/**
159+
* Each account in Huawei is capable to send push-notifications to only one corresponding mobile app
160+
* These constants represent app type (master/resident) and connect app types to appIds (remoteClient schema)
161+
*/
162+
const APP_MASTER_KEY = 'master'
163+
const APP_RESIDENT_KEY = 'resident'
164+
const APP_CONFIG_KEY_ENV = 'MOBILE_APP_IDS'
165+
166+
const APP_IDS = JSON.parse(get(conf, APP_CONFIG_KEY_ENV, '{}'))
167+
const APP_RESIDENT_ID_ANDROID = get(APP_IDS, [APP_RESIDENT_KEY, DEVICE_PLATFORM_ANDROID]) || 'ai.doma.client'
168+
const APP_RESIDENT_ID_IOS = get(APP_IDS, [APP_RESIDENT_KEY, DEVICE_PLATFORM_IOS]) || 'ai.doma.clients'
169+
const APP_MASTER_ID_ANDROID = get(APP_IDS, [APP_MASTER_KEY, DEVICE_PLATFORM_ANDROID]) || 'ai.doma.master'
170+
const APP_MASTER_ID_IOS = get(APP_IDS, [APP_MASTER_KEY, DEVICE_PLATFORM_IOS]) || 'ai.doma.master'
171+
172+
const HUAWEI_SUPPORTED_APP_NAMES = [APP_RESIDENT_ID_ANDROID, APP_RESIDENT_ID_IOS, APP_MASTER_ID_ANDROID]
173+
const HUAWEI_APP_TYPE_BY_APP_ID = {
174+
[APP_RESIDENT_ID_ANDROID]: APP_RESIDENT_KEY,
175+
[APP_RESIDENT_ID_IOS]: APP_RESIDENT_KEY,
176+
[APP_MASTER_ID_ANDROID]: APP_MASTER_KEY,
177+
}
178+
179+
const DEFAULT_TEMPLATE_FILE_EXTENSION = 'njk'
180+
const DEFAULT_TEMPLATE_FILE_NAME = `default.${DEFAULT_TEMPLATE_FILE_EXTENSION}`
181+
182+
const DIRECTLY_AVAILABLE_TYPES = [
183+
B2C_APP_MESSAGE_PUSH_TYPE,
184+
VOIP_INCOMING_CALL_MESSAGE_TYPE,
185+
CANCELED_CALL_MESSAGE_PUSH_TYPE,
186+
]
187+
92188
const SMS_FORBIDDEN_SYMBOLS_REGEXP = /[&#|«»]+/gim
93189

94190
const newsItemMessageMeta = {
@@ -516,6 +612,18 @@ const MESSAGE_META = {
516612
voipDtfmCommand: { required: false },
517613
},
518614
},
615+
[CANCELED_CALL_MESSAGE_PUSH_TYPE]: {
616+
dv: { required: true },
617+
title: { required: false },
618+
body: { required: true },
619+
data: {
620+
B2CAppId: { required: true },
621+
B2CAppContext: { required: false },
622+
B2CAppName: { required: true },
623+
residentId: { required: true },
624+
callId: { required: false },
625+
},
626+
},
519627
[B2C_APP_MESSAGE_PUSH_TYPE]: {
520628
dv: { required: true },
521629
title: { required: false },
@@ -819,6 +927,13 @@ const MESSAGE_DELIVERY_OPTIONS = {
819927
isAllowedToChangeDefaultTransport: false,
820928
isVoIP: true,
821929
},
930+
[CANCELED_CALL_MESSAGE_PUSH_TYPE]: {
931+
priority: MESSAGE_DELIVERY_FAST_PRIORITY,
932+
allowedTransports: [PUSH_TRANSPORT],
933+
defaultTransports: [PUSH_TRANSPORT],
934+
isAllowedToChangeDefaultTransport: false,
935+
preferredPushType: PUSH_TYPE_SILENT_DATA,
936+
},
822937
[B2C_APP_MESSAGE_PUSH_TYPE]: {
823938
allowedTransports: [PUSH_TRANSPORT],
824939
defaultTransports: [PUSH_TRANSPORT],
@@ -948,98 +1063,6 @@ const MESSAGE_DELIVERY_OPTIONS = {
9481063
},
9491064
}
9501065

951-
const MESSAGE_SENDING_STATUS = 'sending'
952-
const MESSAGE_RESENDING_STATUS = 'resending'
953-
const MESSAGE_PROCESSING_STATUS = 'processing'
954-
const MESSAGE_ERROR_STATUS = 'error'
955-
const MESSAGE_BLACKLISTED_STATUS = 'blacklisted'
956-
const MESSAGE_DELIVERED_STATUS = 'delivered'
957-
const MESSAGE_CANCELED_STATUS = 'canceled'
958-
const MESSAGE_SENT_STATUS = 'sent'
959-
const MESSAGE_READ_STATUS = 'read'
960-
const MESSAGE_DISABLED_BY_USER_STATUS = 'disabledByUser'
961-
const MESSAGE_THROTTLED_STATUS = 'throttled'
962-
const MESSAGE_STATUSES = [
963-
MESSAGE_SENDING_STATUS,
964-
MESSAGE_RESENDING_STATUS,
965-
MESSAGE_PROCESSING_STATUS,
966-
MESSAGE_ERROR_STATUS,
967-
MESSAGE_BLACKLISTED_STATUS,
968-
MESSAGE_SENT_STATUS,
969-
MESSAGE_DELIVERED_STATUS,
970-
MESSAGE_READ_STATUS,
971-
MESSAGE_CANCELED_STATUS,
972-
MESSAGE_DISABLED_BY_USER_STATUS,
973-
MESSAGE_THROTTLED_STATUS,
974-
]
975-
976-
const MESSAGE_BATCH_CREATED_STATUS = 'created'
977-
const MESSAGE_BATCH_PROCESSING_STATUS = 'processing'
978-
const MESSAGE_BATCH_FAILED_STATUS = 'failed'
979-
const MESSAGE_BATCH_DONE_STATUS = 'done'
980-
const MESSAGE_BATCH_STATUSES = [MESSAGE_BATCH_CREATED_STATUS, MESSAGE_BATCH_PROCESSING_STATUS, MESSAGE_BATCH_FAILED_STATUS, MESSAGE_BATCH_DONE_STATUS]
981-
const MESSAGE_BATCH_TYPE_OPTIONS = [CUSTOM_CONTENT_MESSAGE_TYPE, MOBILE_APP_UPDATE_AVAILABLE_MESSAGE_PUSH_TYPE, CUSTOM_CONTENT_MESSAGE_PUSH_TYPE, CUSTOM_CONTENT_MESSAGE_EMAIL_TYPE, CUSTOM_CONTENT_MESSAGE_SMS_TYPE]
982-
983-
const DEVICE_PLATFORM_ANDROID = 'android'
984-
const DEVICE_PLATFORM_IOS = 'ios'
985-
const DEVICE_PLATFORM_WEB = 'web'
986-
const DEVICE_PLATFORM_TYPES = [DEVICE_PLATFORM_ANDROID, DEVICE_PLATFORM_IOS, DEVICE_PLATFORM_WEB]
987-
988-
const PUSH_TYPE_DEFAULT = 'default'
989-
const PUSH_TYPE_SILENT_DATA = 'silent_data'
990-
const PUSH_TYPES = [PUSH_TYPE_DEFAULT, PUSH_TYPE_SILENT_DATA]
991-
992-
const PUSH_TRANSPORT_FIREBASE = 'firebase'
993-
const PUSH_TRANSPORT_REDSTORE = 'redstore'
994-
const PUSH_TRANSPORT_APPLE = 'apple'
995-
const PUSH_TRANSPORT_HUAWEI = 'huawei'
996-
const PUSH_TRANSPORT_TYPES = [PUSH_TRANSPORT_FIREBASE, PUSH_TRANSPORT_APPLE, PUSH_TRANSPORT_HUAWEI, PUSH_TRANSPORT_REDSTORE]
997-
const PUSH_FAKE_TOKEN_SUCCESS = 'PUSH_FAKE_TOKEN_SUCCESS'
998-
const PUSH_FAKE_TOKEN_FAIL = 'PUSH_FAKE_TOKEN_FAIL'
999-
1000-
const FIREBASE_CONFIG_ENV = 'FIREBASE_CONFIG_JSON'
1001-
const FIREBASE_CONFIG_TEST_PUSHTOKEN_ENV = 'FIREBASE_PUSH_TOKEN_TEST'
1002-
1003-
const REDSTORE_CONFIG_ENV = 'REDSTORE_CONFIG_JSON'
1004-
const REDSTORE_CONFIG_TEST_PUSHTOKEN_ENV = 'REDSTORE_PUSH_TOKEN_TEST'
1005-
1006-
const HCM_CONFIG_ENV = 'HCM_CONFIG_JSON'
1007-
const HCM_CONFIG_TEST_PUSHTOKEN_ENV_RESIDENT = 'HCM_PUSH_TOKEN_TEST_RESIDENT'
1008-
const HCM_CONFIG_TEST_PUSHTOKEN_ENV_MASTER = 'HCM_PUSH_TOKEN_TEST_MASTER'
1009-
1010-
const APPLE_CONFIG_ENV = 'APPLE_CONFIG_JSON'
1011-
const APPLE_CONFIG_TEST_PUSHTOKEN_ENV = 'APPLE_PUSH_TOKEN_TEST'
1012-
const APPLE_CONFIG_TEST_VOIP_PUSHTOKEN_ENV = 'APPLE_VOIP_PUSH_TOKEN_TEST'
1013-
1014-
const APPS_WITH_DISABLED_NOTIFICATIONS_ENV = 'APPS_WITH_DISABLED_NOTIFICATIONS'
1015-
/**
1016-
* Each account in Huawei is capable to send push-notifications to only one corresponding mobile app
1017-
* These constants represent app type (master/resident) and connect app types to appIds (remoteClient schema)
1018-
*/
1019-
const APP_MASTER_KEY = 'master'
1020-
const APP_RESIDENT_KEY = 'resident'
1021-
const APP_CONFIG_KEY_ENV = 'MOBILE_APP_IDS'
1022-
1023-
const APP_IDS = JSON.parse(get(conf, APP_CONFIG_KEY_ENV, '{}'))
1024-
const APP_RESIDENT_ID_ANDROID = get(APP_IDS, [APP_RESIDENT_KEY, DEVICE_PLATFORM_ANDROID]) || 'ai.doma.client'
1025-
const APP_RESIDENT_ID_IOS = get(APP_IDS, [APP_RESIDENT_KEY, DEVICE_PLATFORM_IOS]) || 'ai.doma.clients'
1026-
const APP_MASTER_ID_ANDROID = get(APP_IDS, [APP_MASTER_KEY, DEVICE_PLATFORM_ANDROID]) || 'ai.doma.master'
1027-
const APP_MASTER_ID_IOS = get(APP_IDS, [APP_MASTER_KEY, DEVICE_PLATFORM_IOS]) || 'ai.doma.master'
1028-
1029-
const HUAWEI_SUPPORTED_APP_NAMES = [APP_RESIDENT_ID_ANDROID, APP_RESIDENT_ID_IOS, APP_MASTER_ID_ANDROID]
1030-
const HUAWEI_APP_TYPE_BY_APP_ID = {
1031-
[APP_RESIDENT_ID_ANDROID]: APP_RESIDENT_KEY,
1032-
[APP_RESIDENT_ID_IOS]: APP_RESIDENT_KEY,
1033-
[APP_MASTER_ID_ANDROID]: APP_MASTER_KEY,
1034-
}
1035-
1036-
const DEFAULT_TEMPLATE_FILE_EXTENSION = 'njk'
1037-
const DEFAULT_TEMPLATE_FILE_NAME = `default.${DEFAULT_TEMPLATE_FILE_EXTENSION}`
1038-
1039-
const DIRECTLY_AVAILABLE_TYPES = [
1040-
B2C_APP_MESSAGE_PUSH_TYPE,
1041-
VOIP_INCOMING_CALL_MESSAGE_TYPE,
1042-
]
10431066

10441067
module.exports = {
10451068
JSON_NO_REQUIRED_ATTR_ERROR,
@@ -1149,6 +1172,7 @@ module.exports = {
11491172
MESSAGE_DELIVERY_FAST_PRIORITY,
11501173
MESSAGE_DELIVERY_PRIORITY_TO_TASK_QUEUE_MAP,
11511174
VOIP_INCOMING_CALL_MESSAGE_TYPE,
1175+
CANCELED_CALL_MESSAGE_PUSH_TYPE,
11521176
B2C_APP_MESSAGE_PUSH_TYPE,
11531177
APPLE_CONFIG_ENV,
11541178
APPLE_CONFIG_TEST_PUSHTOKEN_ENV,

0 commit comments

Comments
 (0)