@messenger-box/platform-server 10.0.3-alpha.50 → 10.0.3-alpha.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/lib/containers/containers.js.map +1 -1
  2. package/lib/graphql/resolvers/channel-member.d.ts +2 -1
  3. package/lib/graphql/resolvers/channel-member.js +13 -3
  4. package/lib/graphql/resolvers/channel-member.js.map +1 -1
  5. package/lib/graphql/resolvers/channel.d.ts +2 -1
  6. package/lib/graphql/resolvers/channel.js +260 -126
  7. package/lib/graphql/resolvers/channel.js.map +1 -1
  8. package/lib/graphql/resolvers/extended-token-account.d.ts +2 -1
  9. package/lib/graphql/resolvers/extended-token-account.js +90 -23
  10. package/lib/graphql/resolvers/extended-token-account.js.map +1 -1
  11. package/lib/graphql/resolvers/post-thread.js +285 -179
  12. package/lib/graphql/resolvers/post-thread.js.map +1 -1
  13. package/lib/graphql/resolvers/post.js +669 -242
  14. package/lib/graphql/resolvers/post.js.map +1 -1
  15. package/lib/graphql/resolvers/reaction.d.ts +2 -1
  16. package/lib/graphql/resolvers/reaction.js +96 -14
  17. package/lib/graphql/resolvers/reaction.js.map +1 -1
  18. package/lib/graphql/schema/channel.graphql +331 -39
  19. package/lib/graphql/schema/channel.graphql.js +1 -1
  20. package/lib/graphql/schema/post-thread.graphql +157 -21
  21. package/lib/graphql/schema/post-thread.graphql.js +1 -1
  22. package/lib/graphql/schema/post.graphql +265 -40
  23. package/lib/graphql/schema/post.graphql.js +1 -1
  24. package/lib/graphql/schema/reaction.graphql +71 -13
  25. package/lib/graphql/schema/reaction.graphql.js +1 -1
  26. package/lib/graphql/schema/users.graphql +76 -13
  27. package/lib/graphql/schema/users.graphql.js +1 -1
  28. package/lib/plugins/channel-moleculer-service.d.ts +21 -1
  29. package/lib/plugins/channel-moleculer-service.js +417 -115
  30. package/lib/plugins/channel-moleculer-service.js.map +1 -1
  31. package/lib/plugins/extended-token-account-moleculer-service.d.ts +25 -1
  32. package/lib/plugins/extended-token-account-moleculer-service.js +348 -22
  33. package/lib/plugins/extended-token-account-moleculer-service.js.map +1 -1
  34. package/lib/plugins/messenger-notification-moleculer-service.d.ts +26 -3
  35. package/lib/plugins/messenger-notification-moleculer-service.js +403 -57
  36. package/lib/plugins/messenger-notification-moleculer-service.js.map +1 -1
  37. package/lib/plugins/post-moleculer-service.d.ts +84 -20
  38. package/lib/plugins/post-moleculer-service.js +891 -259
  39. package/lib/plugins/post-moleculer-service.js.map +1 -1
  40. package/lib/plugins/post-thread-moleculer-service.d.ts +33 -1
  41. package/lib/plugins/post-thread-moleculer-service.js +320 -13
  42. package/lib/plugins/post-thread-moleculer-service.js.map +1 -1
  43. package/lib/services/channel-service.d.ts +185 -33
  44. package/lib/services/channel-service.js +767 -282
  45. package/lib/services/channel-service.js.map +1 -1
  46. package/lib/services/extended-token-account-service.d.ts +127 -14
  47. package/lib/services/extended-token-account-service.js +459 -52
  48. package/lib/services/extended-token-account-service.js.map +1 -1
  49. package/lib/services/messenger-notification-service.d.ts +106 -13
  50. package/lib/services/messenger-notification-service.js +824 -442
  51. package/lib/services/messenger-notification-service.js.map +1 -1
  52. package/lib/services/post-service.d.ts +176 -16
  53. package/lib/services/post-service.js +553 -119
  54. package/lib/services/post-service.js.map +1 -1
  55. package/lib/services/post-thread-service.d.ts +114 -6
  56. package/lib/services/post-thread-service.js +397 -18
  57. package/lib/services/post-thread-service.js.map +1 -1
  58. package/lib/services/proxy-services/channel-microservice.d.ts +4 -3
  59. package/lib/services/proxy-services/channel-microservice.js +12 -9
  60. package/lib/services/proxy-services/channel-microservice.js.map +1 -1
  61. package/lib/services/proxy-services/messenger-notification-microservice.d.ts +128 -8
  62. package/lib/services/proxy-services/messenger-notification-microservice.js +324 -29
  63. package/lib/services/proxy-services/messenger-notification-microservice.js.map +1 -1
  64. package/lib/services/proxy-services/post-microservice.d.ts +186 -13
  65. package/lib/services/proxy-services/post-microservice.js +543 -59
  66. package/lib/services/proxy-services/post-microservice.js.map +1 -1
  67. package/lib/services/proxy-services/post-thread-microservice.d.ts +134 -4
  68. package/lib/services/proxy-services/post-thread-microservice.js +387 -10
  69. package/lib/services/proxy-services/post-thread-microservice.js.map +1 -1
  70. package/lib/services/proxy-services/reaction-microservice.d.ts +161 -3
  71. package/lib/services/proxy-services/reaction-microservice.js +474 -2
  72. package/lib/services/proxy-services/reaction-microservice.js.map +1 -1
  73. package/lib/services/reaction-service.d.ts +124 -4
  74. package/lib/services/reaction-service.js +415 -3
  75. package/lib/services/reaction-service.js.map +1 -1
  76. package/lib/store/models/channel.d.ts +2 -3
  77. package/lib/store/models/channel.js +169 -71
  78. package/lib/store/models/channel.js.map +1 -1
  79. package/lib/store/models/post-thread.d.ts +3 -3
  80. package/lib/store/models/post-thread.js +96 -14
  81. package/lib/store/models/post-thread.js.map +1 -1
  82. package/lib/store/models/post.d.ts +2 -3
  83. package/lib/store/models/post.js +85 -18
  84. package/lib/store/models/post.js.map +1 -1
  85. package/lib/store/models/reaction.d.ts +2 -3
  86. package/lib/store/models/reaction.js +67 -8
  87. package/lib/store/models/reaction.js.map +1 -1
  88. package/lib/store/repositories/channel-repository.d.ts +6 -6
  89. package/lib/store/repositories/channel-repository.js +5 -2
  90. package/lib/store/repositories/channel-repository.js.map +1 -1
  91. package/lib/store/repositories/post-repository.d.ts +6 -6
  92. package/lib/store/repositories/post-repository.js +5 -2
  93. package/lib/store/repositories/post-repository.js.map +1 -1
  94. package/lib/store/repositories/post-thread-repository.d.ts +6 -6
  95. package/lib/store/repositories/post-thread-repository.js +5 -2
  96. package/lib/store/repositories/post-thread-repository.js.map +1 -1
  97. package/lib/store/repositories/reaction-repository.d.ts +6 -6
  98. package/lib/store/repositories/reaction-repository.js +5 -2
  99. package/lib/store/repositories/reaction-repository.js.map +1 -1
  100. package/lib/templates/repositories/ChannelRepository.ts.template +3 -3
  101. package/lib/templates/repositories/PostRepository.ts.template +3 -3
  102. package/lib/templates/repositories/PostThreadRepository.ts.template +3 -3
  103. package/lib/templates/repositories/ReactionRepository.ts.template +3 -4
  104. package/lib/templates/services/ChannelService.ts.template +277 -38
  105. package/lib/templates/services/ExtendedTokenAccountService.ts.template +93 -8
  106. package/lib/templates/services/PostService.ts.template +182 -20
  107. package/lib/templates/services/PostThreadService.ts.template +100 -5
  108. package/lib/templates/services/ReactionService.ts.template +129 -2
  109. package/package.json +3 -3
  110. package/lib/store/models/common-options.js +0 -20
  111. package/lib/store/models/common-options.js.map +0 -1
@@ -1,81 +1,488 @@
1
- import {__decorate,__param,__metadata}from'tslib';import {injectable,inject}from'inversify';import {CommonType}from'@common-stack/core';import {ServiceBroker}from'moleculer';import {MoleculerServiceName,AccountServiceAction,TokenTypesEnum,AuthStrategy}from'common/server';let ExtendedTokenAccountService = class ExtendedTokenAccountService {
1
+ import {__decorate,__param,__metadata}from'tslib';import {injectable,inject}from'inversify';import {CommonType}from'@common-stack/core';import {ServiceBroker}from'moleculer';import'@cdm-logger/core';import {DisposableCollection}from'@adminide-stack/core';import {MoleculerServiceName,AccountServiceAction,TokenTypesEnum,AuthStrategy}from'common/server';/**
2
+ * Extended Token Account Service Implementation
3
+ *
4
+ * This service handles comprehensive device token management and account operations
5
+ * within the messenger platform, providing advanced token lifecycle management
6
+ * and user account integration capabilities.
7
+ *
8
+ * Key capabilities:
9
+ * - Device token management (add, remove, retrieve)
10
+ * - Expo notification token handling
11
+ * - Auth0 integration and user lookup
12
+ * - Token lifecycle tracking (refresh count, usage count)
13
+ * - Bulk token operations and cleanup
14
+ * - Account service integration through Moleculer broker
15
+ * - Cross-platform token synchronization
16
+ * - Token validation and verification
17
+ * - User context and authentication strategy handling
18
+ * - Comprehensive error handling and logging
19
+ *
20
+ * The service integrates with the account microservice through Moleculer broker
21
+ * and provides robust token management for mobile and web applications,
22
+ * ensuring reliable push notification delivery and user authentication flows.
23
+ */
24
+ let ExtendedTokenAccountService = class ExtendedTokenAccountService {
2
25
  broker;
3
- constructor(broker) {
26
+ toDispose = new DisposableCollection();
27
+ logger;
28
+ constructor(broker, logger) {
4
29
  this.broker = broker;
30
+ this.logger = logger?.child({
31
+ className: 'ExtendedTokenAccountService'
32
+ }) || console;
5
33
  }
6
34
  /**
35
+ * Disposes of resources used by the service
36
+ */
37
+ dispose() {
38
+ this.toDispose.dispose();
39
+ }
40
+ /**
41
+ * Retrieves device tokens for a specific account
7
42
  *
8
- * @param deviceToken
9
- * @param accountId
43
+ * @description Fetches the complete user account with all associated device tokens
44
+ * for notification delivery and device management purposes
10
45
  *
11
- * tokens: [{
12
- * type: 'MOBILE_DEVICE_PUSH',
13
- * token: 'deviceName:xdfjdljfdljfllk',
14
- * }]
46
+ * @param {string} accountId - The account ID to retrieve tokens for
47
+ * @returns {Promise<IUserAccount | Error>} - User account with tokens or error
15
48
  */
16
49
  async getDeviceToken(accountId) {
17
- return this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.FindAccountById}`, {
18
- id: accountId
19
- });
50
+ try {
51
+ if (!accountId) {
52
+ return new Error('Account ID is required');
53
+ }
54
+ this.logger.debug('Retrieving device tokens for account', {
55
+ accountId
56
+ });
57
+ const user = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.FindAccountById}`, {
58
+ id: accountId
59
+ });
60
+ if (!user) {
61
+ return new Error(`Account not found for ID: ${accountId}`);
62
+ }
63
+ this.logger.debug('Device tokens retrieved successfully', {
64
+ accountId,
65
+ tokenCount: user.tokens?.length || 0
66
+ });
67
+ return user;
68
+ } catch (error) {
69
+ this.logger.error('Error retrieving device tokens: %o', error);
70
+ return error instanceof Error ? error : new Error('Unknown error occurred while retrieving device tokens');
71
+ }
20
72
  }
73
+ /**
74
+ * Sets or updates a device token for an account
75
+ *
76
+ * @description Adds a new Expo notification token to the user's account
77
+ * for push notification delivery, with tracking metadata
78
+ *
79
+ * @param {string} deviceToken - The device token to add
80
+ * @param {string} accountId - The account ID to add the token to
81
+ * @returns {Promise<IUserAccount | Error>} - Updated user account or error
82
+ */
21
83
  async setDeviceToken(deviceToken, accountId) {
22
- const mobileToken = {
23
- type: TokenTypesEnum.ExpoNotificationToken,
24
- token: deviceToken,
25
- refreshedCount: 0,
26
- usedCount: 0
27
- };
28
- return this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.AddUserToken}`, {
29
- userId: accountId,
30
- token: mobileToken
31
- });
84
+ try {
85
+ if (!deviceToken) {
86
+ return new Error('Device token is required');
87
+ }
88
+ if (!accountId) {
89
+ return new Error('Account ID is required');
90
+ }
91
+ this.logger.debug('Setting device token for account', {
92
+ accountId,
93
+ tokenLength: deviceToken.length
94
+ });
95
+ const mobileToken = {
96
+ type: TokenTypesEnum.ExpoNotificationToken,
97
+ token: deviceToken,
98
+ refreshedCount: 0,
99
+ usedCount: 0,
100
+ createdAt: new Date(),
101
+ lastUsedAt: null
102
+ };
103
+ const result = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.AddUserToken}`, {
104
+ userId: accountId,
105
+ token: mobileToken
106
+ });
107
+ if (!result) {
108
+ return new Error('Failed to add device token');
109
+ }
110
+ this.logger.debug('Device token added successfully', {
111
+ accountId,
112
+ tokenType: mobileToken.type
113
+ });
114
+ return result;
115
+ } catch (error) {
116
+ this.logger.error('Error setting device token: %o', error);
117
+ return error instanceof Error ? error : new Error('Unknown error occurred while setting device token');
118
+ }
32
119
  }
120
+ /**
121
+ * Removes a device token from an account
122
+ *
123
+ * @description Removes the specified Expo notification token from the user's account
124
+ * to stop push notifications to that device
125
+ *
126
+ * @param {string} deviceToken - The device token to remove
127
+ * @param {string} accountId - The account ID to remove the token from
128
+ * @returns {Promise<IUserAccount | Error>} - Updated user account or error
129
+ */
33
130
  async removeDeviceToken(deviceToken, accountId) {
34
- const mobileToken = {
35
- type: TokenTypesEnum.ExpoNotificationToken,
36
- token: deviceToken,
37
- refreshedCount: 0,
38
- usedCount: 0
39
- };
40
- return this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.RemoveUserToken}`, {
41
- userId: accountId,
42
- token: mobileToken
43
- });
44
- //this.accountService.removeUserToken(accountId, mobileToken);
45
- // return this.accountService.findAccountById(accountId);
131
+ try {
132
+ if (!deviceToken) {
133
+ return new Error('Device token is required');
134
+ }
135
+ if (!accountId) {
136
+ return new Error('Account ID is required');
137
+ }
138
+ this.logger.debug('Removing device token from account', {
139
+ accountId,
140
+ tokenLength: deviceToken.length
141
+ });
142
+ const mobileToken = {
143
+ type: TokenTypesEnum.ExpoNotificationToken,
144
+ token: deviceToken,
145
+ refreshedCount: 0,
146
+ usedCount: 0
147
+ };
148
+ const result = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.RemoveUserToken}`, {
149
+ userId: accountId,
150
+ token: mobileToken
151
+ });
152
+ if (!result) {
153
+ return new Error('Failed to remove device token');
154
+ }
155
+ this.logger.debug('Device token removed successfully', {
156
+ accountId,
157
+ tokenType: mobileToken.type
158
+ });
159
+ return result;
160
+ } catch (error) {
161
+ this.logger.error('Error removing device token: %o', error);
162
+ return error instanceof Error ? error : new Error('Unknown error occurred while removing device token');
163
+ }
46
164
  }
165
+ /**
166
+ * Retrieves an account by Auth0 ID
167
+ *
168
+ * @description Finds a user account using Auth0 authentication ID
169
+ * with proper authentication strategy context
170
+ *
171
+ * @param {string} auth0Id - The Auth0 user ID
172
+ * @param {IAccountServiceContext} context - Optional account service context
173
+ * @returns {Promise<IUserAccount | Error>} - User account or error
174
+ */
175
+ // @ts-ignore - Type compatibility issue between IUserAccount and AsDomainType<IUserAccountModel>
47
176
  async getAccountByAuth0Id(auth0Id, context) {
48
- return this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.FindAccountByUser}`, {
49
- id: auth0Id,
50
- context: context || {
51
- authStrategy: AuthStrategy.Auth0 // should be replaced with sessioin context
177
+ try {
178
+ if (!auth0Id) {
179
+ return new Error('Auth0 ID is required');
52
180
  }
53
- });
181
+ this.logger.debug('Retrieving account by Auth0 ID', {
182
+ auth0Id
183
+ });
184
+ const serviceContext = context || {
185
+ authStrategy: AuthStrategy.Auth0
186
+ };
187
+ const user = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.FindAccountByUser}`, {
188
+ id: auth0Id,
189
+ context: serviceContext
190
+ });
191
+ if (!user) {
192
+ return new Error(`Account not found for Auth0 ID: ${auth0Id}`);
193
+ }
194
+ this.logger.debug('Account retrieved successfully by Auth0 ID', {
195
+ auth0Id,
196
+ accountId: user.id,
197
+ authStrategy: serviceContext.authStrategy
198
+ });
199
+ return user;
200
+ } catch (error) {
201
+ this.logger.error('Error retrieving account by Auth0 ID: %o', error);
202
+ return error instanceof Error ? error : new Error('Unknown error occurred while retrieving account by Auth0 ID');
203
+ }
54
204
  }
205
+ /**
206
+ * Removes all Expo notification tokens for a user by Auth0 ID
207
+ *
208
+ * @description Cleans up all Expo notification tokens associated with a user account
209
+ * identified by Auth0 ID, typically used during logout or account deactivation
210
+ *
211
+ * @param {string} auth0Id - The Auth0 user ID
212
+ * @param {IAccountServiceContext} context - Optional account service context
213
+ * @returns {Promise<boolean | Error>} - Success status or error
214
+ */
215
+ // @ts-ignore - Type compatibility issue between boolean and void return types
55
216
  async removeUserExpoTokenByAuth0Id(auth0Id, context) {
56
- const user = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.FindAccountByUser}`, {
57
- id: auth0Id,
58
- context: context || {
59
- authStrategy: AuthStrategy.Auth0 // should be replaced with sessioin context
60
- }
61
- });
62
- if (user) {
63
- const expoTokens = user?.tokens?.filter(t => t?.type === 'EXPO_NOTIFICATION_TOKEN');
64
- if (expoTokens && expoTokens?.length > 0) {
65
- expoTokens.forEach(async t => {
217
+ try {
218
+ if (!auth0Id) {
219
+ return new Error('Auth0 ID is required');
220
+ }
221
+ this.logger.debug('Removing Expo tokens for Auth0 user', {
222
+ auth0Id
223
+ });
224
+ const serviceContext = context || {
225
+ authStrategy: AuthStrategy.Auth0
226
+ };
227
+ const user = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.FindAccountByUser}`, {
228
+ id: auth0Id,
229
+ context: serviceContext
230
+ });
231
+ if (!user) {
232
+ return new Error(`Account not found for Auth0 ID: ${auth0Id}`);
233
+ }
234
+ const expoTokens = user?.tokens?.filter(t => t?.type === 'EXPO_NOTIFICATION_TOKEN') || [];
235
+ if (expoTokens.length === 0) {
236
+ this.logger.debug('No Expo tokens found to remove', {
237
+ auth0Id
238
+ });
239
+ return true;
240
+ }
241
+ this.logger.debug('Found Expo tokens to remove', {
242
+ auth0Id,
243
+ tokenCount: expoTokens.length
244
+ });
245
+ // Process token removals in parallel for better performance
246
+ const removalPromises = expoTokens.map(async token => {
247
+ try {
66
248
  const mobileToken = {
67
249
  type: TokenTypesEnum.ExpoNotificationToken,
68
- token: t?.token,
250
+ token: token?.token,
69
251
  refreshedCount: 0,
70
252
  usedCount: 0
71
253
  };
72
- this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.RemoveUserToken}`, {
73
- userId: user?.id,
254
+ await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.RemoveUserToken}`, {
255
+ userId: user.id,
74
256
  token: mobileToken
75
257
  });
258
+ return true;
259
+ } catch (error) {
260
+ this.logger.error('Error removing individual token: %o', error);
261
+ return false;
262
+ }
263
+ });
264
+ const results = await Promise.all(removalPromises);
265
+ const successCount = results.filter(Boolean).length;
266
+ const failureCount = results.length - successCount;
267
+ if (failureCount > 0) {
268
+ this.logger.warn('Some token removals failed', {
269
+ auth0Id,
270
+ successCount,
271
+ failureCount
76
272
  });
77
273
  }
274
+ this.logger.debug('Expo token removal completed', {
275
+ auth0Id,
276
+ totalTokens: expoTokens.length,
277
+ successfulRemovals: successCount,
278
+ failedRemovals: failureCount
279
+ });
280
+ return failureCount === 0;
281
+ } catch (error) {
282
+ this.logger.error('Error removing user Expo tokens by Auth0 ID: %o', error);
283
+ return error instanceof Error ? error : new Error('Unknown error occurred while removing user Expo tokens');
284
+ }
285
+ }
286
+ /**
287
+ * Retrieves device tokens for multiple users
288
+ *
289
+ * @description Fetches device tokens for a list of user accounts
290
+ * for bulk notification operations
291
+ *
292
+ * @param {string[]} userIds - Array of user IDs to get tokens for
293
+ * @returns {Promise<Record<string, IUserAccount> | Error>} - Map of user ID to account or error
294
+ */
295
+ async getAllDeviceToken(userIds) {
296
+ try {
297
+ if (!userIds || userIds.length === 0) {
298
+ return new Error('User IDs array is required and cannot be empty');
299
+ }
300
+ this.logger.debug('Retrieving device tokens for multiple users', {
301
+ userCount: userIds.length
302
+ });
303
+ // Process user lookups in parallel for better performance
304
+ const userPromises = userIds.map(async userId => {
305
+ try {
306
+ const user = await this.getDeviceToken(userId);
307
+ return {
308
+ userId,
309
+ user
310
+ };
311
+ } catch (error) {
312
+ this.logger.warn('Failed to get tokens for user', {
313
+ userId,
314
+ error
315
+ });
316
+ return {
317
+ userId,
318
+ user: null
319
+ };
320
+ }
321
+ });
322
+ const results = await Promise.all(userPromises);
323
+ // Filter out failed requests and build result map
324
+ const userMap = {};
325
+ let successCount = 0;
326
+ results.forEach(({
327
+ userId,
328
+ user
329
+ }) => {
330
+ if (user && !(user instanceof Error)) {
331
+ userMap[userId] = user;
332
+ successCount++;
333
+ }
334
+ });
335
+ this.logger.debug('Bulk device token retrieval completed', {
336
+ totalRequested: userIds.length,
337
+ successfulRetrievals: successCount,
338
+ failedRetrievals: userIds.length - successCount
339
+ });
340
+ return userMap;
341
+ } catch (error) {
342
+ this.logger.error('Error retrieving device tokens for multiple users: %o', error);
343
+ return error instanceof Error ? error : new Error('Unknown error occurred while retrieving device tokens for multiple users');
344
+ }
345
+ }
346
+ /**
347
+ * Retrieves device tokens for multiple users by their account IDs
348
+ *
349
+ * @description Alternative method for bulk token retrieval using account IDs
350
+ * with enhanced filtering and validation
351
+ *
352
+ * @param {string[]} accountIds - Array of account IDs to get tokens for
353
+ * @returns {Promise<Array<{ accountId: string; tokens: any[] }> | Error>} - Array of account tokens or error
354
+ */
355
+ async getAllDeviceTokenById(accountIds) {
356
+ try {
357
+ if (!accountIds || accountIds.length === 0) {
358
+ return new Error('Account IDs array is required and cannot be empty');
359
+ }
360
+ this.logger.debug('Retrieving device tokens by account IDs', {
361
+ accountCount: accountIds.length
362
+ });
363
+ const tokenResults = [];
364
+ // Process each account to extract tokens
365
+ for (const accountId of accountIds) {
366
+ try {
367
+ const userResult = await this.getDeviceToken(accountId);
368
+ if (userResult instanceof Error) {
369
+ this.logger.warn('Failed to get account data', {
370
+ accountId,
371
+ error: userResult.message
372
+ });
373
+ continue;
374
+ }
375
+ const tokens = userResult.tokens?.filter(t => t?.type === TokenTypesEnum.ExpoNotificationToken && t?.token) || [];
376
+ tokenResults.push({
377
+ accountId,
378
+ tokens: tokens.map(t => ({
379
+ token: t.token,
380
+ type: t.type,
381
+ refreshedCount: t.refreshedCount || 0,
382
+ usedCount: t.usedCount || 0,
383
+ createdAt: t.createdAt,
384
+ lastUsedAt: t.lastUsedAt
385
+ }))
386
+ });
387
+ } catch (error) {
388
+ this.logger.warn('Error processing account for token retrieval', {
389
+ accountId,
390
+ error
391
+ });
392
+ }
393
+ }
394
+ this.logger.debug('Bulk token retrieval by ID completed', {
395
+ totalRequested: accountIds.length,
396
+ successfulRetrievals: tokenResults.length,
397
+ totalTokens: tokenResults.reduce((sum, result) => sum + result.tokens.length, 0)
398
+ });
399
+ return tokenResults;
400
+ } catch (error) {
401
+ this.logger.error('Error retrieving device tokens by account IDs: %o', error);
402
+ return error instanceof Error ? error : new Error('Unknown error occurred while retrieving device tokens by account IDs');
403
+ }
404
+ }
405
+ /**
406
+ * Validates if a device token is active and valid
407
+ *
408
+ * @description Checks if a device token exists and is active for an account
409
+ *
410
+ * @param {string} deviceToken - The device token to validate
411
+ * @param {string} accountId - The account ID to check against
412
+ * @returns {Promise<boolean | Error>} - Validation result or error
413
+ */
414
+ async validateDeviceToken(deviceToken, accountId) {
415
+ try {
416
+ if (!deviceToken || !accountId) {
417
+ return new Error('Device token and account ID are required');
418
+ }
419
+ this.logger.debug('Validating device token', {
420
+ accountId,
421
+ tokenLength: deviceToken.length
422
+ });
423
+ const userResult = await this.getDeviceToken(accountId);
424
+ if (userResult instanceof Error) {
425
+ return userResult;
426
+ }
427
+ const hasValidToken = userResult.tokens?.some(t => t?.type === TokenTypesEnum.ExpoNotificationToken && t?.token === deviceToken) || false;
428
+ this.logger.debug('Device token validation completed', {
429
+ accountId,
430
+ isValid: hasValidToken
431
+ });
432
+ return hasValidToken;
433
+ } catch (error) {
434
+ this.logger.error('Error validating device token: %o', error);
435
+ return error instanceof Error ? error : new Error('Unknown error occurred while validating device token');
436
+ }
437
+ }
438
+ /**
439
+ * Updates token usage statistics
440
+ *
441
+ * @description Increments usage count for a device token
442
+ *
443
+ * @param {string} deviceToken - The device token to update
444
+ * @param {string} accountId - The account ID the token belongs to
445
+ * @returns {Promise<boolean | Error>} - Update result or error
446
+ */
447
+ async updateTokenUsage(deviceToken, accountId) {
448
+ try {
449
+ if (!deviceToken || !accountId) {
450
+ return new Error('Device token and account ID are required');
451
+ }
452
+ this.logger.debug('Updating token usage statistics', {
453
+ accountId
454
+ });
455
+ // First remove the old token
456
+ const removeResult = await this.removeDeviceToken(deviceToken, accountId);
457
+ if (removeResult instanceof Error) {
458
+ return removeResult;
459
+ }
460
+ // Then add it back with updated usage count
461
+ // Note: This is a simplified approach. In a real implementation,
462
+ // you might want to have a dedicated endpoint for updating token metadata
463
+ const updatedToken = {
464
+ type: TokenTypesEnum.ExpoNotificationToken,
465
+ token: deviceToken,
466
+ refreshedCount: 0,
467
+ usedCount: 1,
468
+ // Increment usage
469
+ lastUsedAt: new Date()
470
+ };
471
+ const addResult = await this.broker.call(`${MoleculerServiceName.AccountUser}.${AccountServiceAction.AddUserToken}`, {
472
+ userId: accountId,
473
+ token: updatedToken
474
+ });
475
+ if (!addResult) {
476
+ return new Error('Failed to update token usage');
477
+ }
478
+ this.logger.debug('Token usage updated successfully', {
479
+ accountId
480
+ });
481
+ return true;
482
+ } catch (error) {
483
+ this.logger.error('Error updating token usage: %o', error);
484
+ return error instanceof Error ? error : new Error('Unknown error occurred while updating token usage');
78
485
  }
79
486
  }
80
487
  };
81
- ExtendedTokenAccountService = __decorate([injectable(), __param(0, inject(CommonType.MOLECULER_BROKER)), __metadata("design:paramtypes", [ServiceBroker])], ExtendedTokenAccountService);export{ExtendedTokenAccountService};//# sourceMappingURL=extended-token-account-service.js.map
488
+ ExtendedTokenAccountService = __decorate([injectable(), __param(0, inject(CommonType.MOLECULER_BROKER)), __param(1, inject('Logger')), __metadata("design:paramtypes", [ServiceBroker, Object])], ExtendedTokenAccountService);export{ExtendedTokenAccountService};//# sourceMappingURL=extended-token-account-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extended-token-account-service.js","sources":["../../src/services/extended-token-account-service.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extended-token-account-service.js","sources":["../../src/services/extended-token-account-service.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}