@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
@@ -3,26 +3,47 @@ import {SortEnum}from'common/server';import {isEmpty}from'lodash-es';const postT
3
3
  channel(src, args, {
4
4
  channelService
5
5
  }) {
6
- return src?.channel?.toString() ? channelService.get(src.channel.toString()) : null;
6
+ options.logger.trace('(PostThread.channel) src.channel [%s]', src?.channel);
7
+ // Check if channel exists and is not null/undefined before calling service
8
+ if (!src?.channel || src.channel === null || src.channel === undefined) {
9
+ return null;
10
+ }
11
+ return channelService.get(src.channel.toString());
7
12
  },
8
13
  post(src, args, {
9
14
  postService
10
15
  }) {
11
- return src?.post?.toString() ? postService.get(src.post.toString()) : null;
16
+ options.logger.trace('(PostThread.post) src.post [%s]', src?.post);
17
+ // Check if post exists and is not null/undefined before calling service
18
+ if (!src?.post || src.post === null || src.post === undefined) {
19
+ return null;
20
+ }
21
+ return postService.get(src.post.toString());
12
22
  },
13
23
  participants(src, args, {
14
24
  accountService
15
25
  }) {
16
- // return src?.participants
17
- // ?.filter((participant: any) => participant)
18
- // ?.map((u: any) => accountService.findAccountById(u.toString()) as any);
19
- return src?.participants?.filter(participant => participant)?.map(u => {
20
- const participant = {
21
- ...u
22
- };
23
- participant.user = accountService.findAccountById(u?.user.toString());
24
- return participant;
25
- });
26
+ options.logger.trace('(PostThread.participants) participants count [%d]', src?.participants?.length || 0);
27
+ try {
28
+ if (!src?.participants || !Array.isArray(src.participants)) {
29
+ return [];
30
+ }
31
+ return src.participants.filter(participant => participant && participant.user).map(u => {
32
+ try {
33
+ const participant = {
34
+ ...u
35
+ };
36
+ participant.user = accountService.findAccountById(u?.user.toString());
37
+ return participant;
38
+ } catch (error) {
39
+ options.logger.warn('Error loading participant user: %o', error);
40
+ return null;
41
+ }
42
+ }).filter(Boolean); // Remove null entries
43
+ } catch (error) {
44
+ options.logger.error('Error loading participants: %o', error);
45
+ return [];
46
+ }
26
47
  },
27
48
  replies(src, {
28
49
  skip,
@@ -31,20 +52,30 @@ import {SortEnum}from'common/server';import {isEmpty}from'lodash-es';const postT
31
52
  }, {
32
53
  postService
33
54
  }) {
34
- const sortValue = sort ? sort?.value == 'ASC' ? SortEnum.Asc : sort?.value == 'DESC' ? SortEnum.Desc : SortEnum.Desc : SortEnum.Desc;
35
- const replies = src?.channel?.toString() || src?.post?.toString() ? postService?.getAll({
36
- criteria: {
37
- parentId: src?.post?.toString(),
38
- channel: src?.channel?.toString()
39
- },
40
- limit: limit || 20,
41
- skip,
42
- sort: {
43
- key: sort?.key || 'createdAt',
44
- value: sortValue
55
+ options.logger.trace('(PostThread.replies) src.post [%s], limit [%d], skip [%d]', src?.post, limit || 20, skip || 0);
56
+ try {
57
+ if (!src?.channel?.toString() && !src?.post?.toString()) {
58
+ options.logger.debug('No channel or post ID available for replies');
59
+ return [];
45
60
  }
46
- }) ?? [] : [];
47
- return replies;
61
+ const sortValue = sort ? sort?.value == 'ASC' ? SortEnum.Asc : sort?.value == 'DESC' ? SortEnum.Desc : SortEnum.Desc : SortEnum.Desc;
62
+ const replies = postService?.getAll({
63
+ criteria: {
64
+ parentId: src?.post?.toString(),
65
+ channel: src?.channel?.toString()
66
+ },
67
+ limit: limit || 20,
68
+ skip: skip || 0,
69
+ sort: {
70
+ key: sort?.key || 'createdAt',
71
+ value: sortValue
72
+ }
73
+ }) ?? [];
74
+ return replies;
75
+ } catch (error) {
76
+ options.logger.error('Error loading replies: %o', error);
77
+ return [];
78
+ }
48
79
  }
49
80
  },
50
81
  Query: {
@@ -62,52 +93,61 @@ import {SortEnum}from'common/server';import {isEmpty}from'lodash-es';const postT
62
93
  postService,
63
94
  userContext
64
95
  }) {
65
- const {
66
- accountId,
67
- orgId
68
- } = userContext;
69
- const parentId = postParentId;
70
- const {
71
- data,
72
- totalCount
73
- } = await postThreadService.getAllWithCount({
74
- criteria: {
75
- channel: channelId,
76
- // participants: {
77
- // // $eq: accountId,
78
- // $eq: participantsIds && participantsIds?.length > 0 ? participantsIds : accountId,
79
- // },
80
- post: parentId == 0 ? null : parentId,
81
- // orgName: orgId,
82
- participants: {
83
- $elemMatch: {
84
- // user: {$eq: participantsIds && participantsIds?.length > 0 ? participantsIds : accountId},
85
- // user: accountId,
86
- ...(isServiceThreads ? {} : {
87
- user: accountId
88
- }),
89
- ...(role ? {
90
- roles: role
91
- } : {}),
92
- ...(orgId ? {
93
- orgName: orgId
94
- } : {})
96
+ options.logger.trace('(Query.threadMessages) channelId [%s], postParentId [%s], role [%s]', channelId, postParentId, role);
97
+ try {
98
+ if (!userContext?.accountId) {
99
+ options.logger.warn('Missing accountId in user context');
100
+ return {
101
+ totalCount: 0,
102
+ data: []
103
+ };
104
+ }
105
+ const {
106
+ accountId,
107
+ orgId
108
+ } = userContext;
109
+ const parentId = postParentId;
110
+ const {
111
+ data,
112
+ totalCount
113
+ } = await postThreadService.getAllWithCount({
114
+ criteria: {
115
+ channel: channelId,
116
+ post: parentId == 0 ? null : parentId,
117
+ participants: {
118
+ $elemMatch: {
119
+ ...(isServiceThreads ? {} : {
120
+ user: accountId
121
+ }),
122
+ ...(role ? {
123
+ roles: role
124
+ } : {}),
125
+ ...(orgId ? {
126
+ orgName: orgId
127
+ } : {})
128
+ }
95
129
  }
130
+ },
131
+ selectedFields,
132
+ limit: limit || 20,
133
+ skip: skip || 0,
134
+ sort: {
135
+ key: 'updatedAt',
136
+ value: SortEnum.Desc
96
137
  }
97
- },
98
- selectedFields,
99
- limit,
100
- skip,
101
- sort: {
102
- key: 'updatedAt',
103
- value: SortEnum.Desc
104
- }
105
- });
106
- // const threadMessages: any = parentId && parentId == 0 ? [] : data;
107
- return {
108
- totalCount,
109
- data
110
- };
138
+ });
139
+ options.logger.debug('Retrieved %d thread messages (total: %d)', data?.length || 0, totalCount);
140
+ return {
141
+ totalCount,
142
+ data
143
+ };
144
+ } catch (error) {
145
+ options.logger.error('Error getting thread messages: %o', error);
146
+ return {
147
+ totalCount: 0,
148
+ data: []
149
+ };
150
+ }
111
151
  },
112
152
  async getPostThread(src, {
113
153
  postThreadId,
@@ -122,39 +162,55 @@ import {SortEnum}from'common/server';import {isEmpty}from'lodash-es';const postT
122
162
  postService,
123
163
  userContext
124
164
  }) {
125
- const {
126
- accountId,
127
- orgId
128
- } = userContext;
129
- const _id = postThreadId || null;
130
- const parentId = postParentId;
131
- const remaining = {
132
- channel: channelId?.toString(),
133
- post: parentId == 0 ? null : parentId,
134
- participants: {
135
- $elemMatch: {
136
- // user: {$eq: participantsIds && participantsIds?.length > 0 ? participantsIds : accountId},
137
- // user: accountId,
138
- ...(isServiceThreads ? {} : {
139
- user: accountId
140
- }),
141
- ...(role ? {
142
- roles: role
143
- } : {}),
144
- ...(orgId ? {
145
- orgName: orgId
146
- } : {})
165
+ options.logger.trace('(Query.getPostThread) postThreadId [%s], channelId [%s], postParentId [%s]', postThreadId, channelId, postParentId);
166
+ try {
167
+ if (!userContext?.accountId) {
168
+ options.logger.warn('Missing accountId in user context');
169
+ return null;
170
+ }
171
+ const {
172
+ accountId,
173
+ orgId
174
+ } = userContext;
175
+ const _id = postThreadId || null;
176
+ const parentId = postParentId;
177
+ const remaining = {
178
+ channel: channelId?.toString(),
179
+ post: parentId == 0 ? null : parentId,
180
+ participants: {
181
+ $elemMatch: {
182
+ ...(isServiceThreads ? {} : {
183
+ user: accountId
184
+ }),
185
+ ...(role ? {
186
+ roles: role
187
+ } : {}),
188
+ ...(orgId ? {
189
+ orgName: orgId
190
+ } : {})
191
+ }
147
192
  }
193
+ };
194
+ const postThreadArguments = {
195
+ ...(_id ? {
196
+ _id
197
+ } : {}),
198
+ ...remaining
199
+ };
200
+ if (isEmpty(postThreadArguments)) {
201
+ options.logger.debug('No valid arguments provided for getPostThread');
202
+ return null;
148
203
  }
149
- };
150
- const postThreadArguments = {
151
- ...(_id ? {
152
- _id
153
- } : {}),
154
- ...remaining
155
- };
156
- const postThread = !isEmpty(postThreadArguments) ? await postThreadService.getPostThread(postThreadArguments) : null;
157
- return postThread;
204
+ const postThread = await postThreadService.getPostThread(postThreadArguments);
205
+ if (postThread instanceof Error) {
206
+ options.logger.error('Error from postThreadService.getPostThread: %o', postThread);
207
+ return null;
208
+ }
209
+ return postThread;
210
+ } catch (error) {
211
+ options.logger.error('Error getting post thread: %o', error);
212
+ return null;
213
+ }
158
214
  },
159
215
  async threadMessagesCount(src, {
160
216
  channelId,
@@ -168,49 +224,40 @@ import {SortEnum}from'common/server';import {isEmpty}from'lodash-es';const postT
168
224
  postService,
169
225
  userContext
170
226
  }) {
171
- const {
172
- accountId,
173
- orgId
174
- } = userContext;
175
- console.log('channelId___', channelId);
176
- console.log('orgId___', orgId);
177
- console.log('accountId___', accountId);
178
- console.log('postParentId___', postParentId);
179
- console.log('role___', role);
180
- console.log('selectedFields___', selectedFields);
181
- console.log('participantsIds___', participantsIds);
182
- console.log('isServiceThreads___', isServiceThreads);
183
- const parentId = postParentId;
184
- const threadsData = {};
185
- const participantConditions = {};
186
- if (channelId) {
187
- threadsData.channel = channelId;
188
- threadsData.post = parentId == 0 ? null : parentId;
189
- }
190
- if (parentId) {
191
- threadsData.post = parentId == 0 ? null : parentId;
192
- }
193
- if (orgId !== undefined && orgId !== null) {
194
- participantConditions.orgName = orgId;
195
- }
196
- if (Object.keys(participantConditions).length > 0) {
197
- threadsData.participants = participantConditions;
227
+ options.logger.trace('(Query.threadMessagesCount) channelId [%s], postParentId [%s]', channelId, postParentId);
228
+ try {
229
+ if (!userContext?.accountId) {
230
+ options.logger.warn('Missing accountId in user context');
231
+ return 0;
232
+ }
233
+ const {
234
+ accountId,
235
+ orgId
236
+ } = userContext;
237
+ const parentId = postParentId;
238
+ const threadsData = {};
239
+ const participantConditions = {};
240
+ if (channelId) {
241
+ threadsData.channel = channelId;
242
+ threadsData.post = parentId == 0 ? null : parentId;
243
+ }
244
+ if (parentId) {
245
+ threadsData.post = parentId == 0 ? null : parentId;
246
+ }
247
+ if (orgId !== undefined && orgId !== null) {
248
+ participantConditions.orgName = orgId;
249
+ }
250
+ if (Object.keys(participantConditions).length > 0) {
251
+ threadsData.participants = participantConditions;
252
+ }
253
+ const query = threadsData;
254
+ const count = await postThreadService.getPostThreadCount(query);
255
+ options.logger.debug('Thread messages count: %d', count);
256
+ return typeof count === 'number' ? count : count?.valueOf() || 0;
257
+ } catch (error) {
258
+ options.logger.error('Error getting thread messages count: %o', error);
259
+ return 0;
198
260
  }
199
- const query = threadsData;
200
- // const query = {
201
- // channel: channelId,
202
- // post: parentId == 0 ? null : parentId,
203
- // participants: {
204
- // $elemMatch: {
205
- // // ...(isServiceThreads ? {} : { user: accountId }),
206
- // // ...(role ? { roles: role || null } : null), // use $in if roles is an array
207
- // ...(orgId !== undefined ? { orgName: orgId?.toString() } : {}),
208
- // },
209
- // },
210
- // };
211
- const count = await postThreadService.getPostThreadCount(query);
212
- console.log('count___', count);
213
- return typeof count === 'number' ? count : count.valueOf();
214
261
  }
215
262
  },
216
263
  Mutation: {
@@ -218,60 +265,119 @@ import {SortEnum}from'common/server';import {isEmpty}from'lodash-es';const postT
218
265
  postService,
219
266
  userContext
220
267
  }) {
221
- const {
222
- accountId,
223
- orgId
224
- } = userContext;
225
- const {
226
- post,
227
- postThread
228
- } = await postService.createPostWithPostThread({
229
- ...args,
230
- accountId
231
- });
232
- return {
233
- lastMessage: post,
234
- data: postThread
235
- };
268
+ options.logger.trace('(Mutation.sendThreadMessage) args [%j]', args);
269
+ try {
270
+ if (!userContext?.accountId) {
271
+ options.logger.warn('Missing accountId in user context');
272
+ throw new Error('User not authenticated');
273
+ }
274
+ const {
275
+ accountId,
276
+ orgId
277
+ } = userContext;
278
+ const result = await postService.createPostWithPostThread({
279
+ ...args,
280
+ accountId
281
+ });
282
+ if (result instanceof Error) {
283
+ options.logger.error('Error from postService.createPostWithPostThread: %o', result);
284
+ throw result;
285
+ }
286
+ const {
287
+ post,
288
+ postThread
289
+ } = result;
290
+ return {
291
+ lastMessage: post,
292
+ data: postThread
293
+ };
294
+ } catch (error) {
295
+ options.logger.error('Error sending thread message: %o', error);
296
+ throw error;
297
+ }
236
298
  },
237
299
  async createPostThread(src, args, {
238
300
  postService,
239
301
  userContext
240
302
  }) {
241
- const {
242
- accountId,
243
- orgId
244
- } = userContext;
245
- const {
246
- post,
247
- postThread
248
- } = await postService.createPostWithPostThread({
249
- ...args,
250
- orgId,
251
- accountId
252
- });
253
- return {
254
- lastMessage: post,
255
- data: postThread
256
- };
303
+ options.logger.trace('(Mutation.createPostThread) args [%j]', args);
304
+ try {
305
+ if (!userContext?.accountId) {
306
+ options.logger.warn('Missing accountId in user context');
307
+ throw new Error('User not authenticated');
308
+ }
309
+ const {
310
+ accountId,
311
+ orgId
312
+ } = userContext;
313
+ const result = await postService.createPostWithPostThread({
314
+ ...args,
315
+ orgId,
316
+ accountId
317
+ });
318
+ if (result instanceof Error) {
319
+ options.logger.error('Error from postService.createPostWithPostThread: %o', result);
320
+ throw result;
321
+ }
322
+ const {
323
+ post,
324
+ postThread
325
+ } = result;
326
+ return {
327
+ lastMessage: post,
328
+ data: postThread
329
+ };
330
+ } catch (error) {
331
+ options.logger.error('Error creating post thread: %o', error);
332
+ throw error;
333
+ }
257
334
  }
258
335
  },
259
336
  Subscription: {
260
337
  threadChatMessageAdded: {
261
- // More on pubsub below
262
338
  subscribe: (_, {
263
339
  channelId,
264
340
  postParentId
265
- }) => options.pubsub.asyncIterator([`THREAD_POST_CREATED_${channelId}_${postParentId}`]),
266
- resolve: payload => payload
341
+ }) => {
342
+ options.logger.trace('(Subscription.threadChatMessageAdded) channelId [%s], postParentId [%s]', channelId, postParentId);
343
+ try {
344
+ if (!options.pubsub) {
345
+ options.logger.error('PubSub not available for subscription');
346
+ throw new Error('PubSub not configured');
347
+ }
348
+ return options.pubsub.asyncIterator([`THREAD_POST_CREATED_${channelId}_${postParentId}`]);
349
+ } catch (error) {
350
+ options.logger.error('Error setting up threadChatMessageAdded subscription: %o', error);
351
+ throw error;
352
+ }
353
+ },
354
+ resolve: payload => {
355
+ options.logger.trace('(Subscription.threadChatMessageAdded.resolve) payload type [%s]', typeof payload);
356
+ return payload;
357
+ }
267
358
  },
268
359
  threadCreatedUpdated: {
269
- // More on pubsub below
270
360
  subscribe: (_, {
271
361
  channelId,
272
362
  postParentId
273
- }) => options.pubsub.asyncIterator([`THREAD_CREATED_UPDATED${channelId ? `_${channelId}` : ''}${postParentId ? `_${postParentId}` : ''}`]),
274
- resolve: payload => payload
363
+ }) => {
364
+ options.logger.trace('(Subscription.threadCreatedUpdated) channelId [%s], postParentId [%s]', channelId, postParentId);
365
+ try {
366
+ if (!options.pubsub) {
367
+ options.logger.error('PubSub not available for subscription');
368
+ throw new Error('PubSub not configured');
369
+ }
370
+ const subscriptionKey = `THREAD_CREATED_UPDATED${channelId ? `_${channelId}` : ''}${postParentId ? `_${postParentId}` : ''}`;
371
+ return options.pubsub.asyncIterator([subscriptionKey]);
372
+ } catch (error) {
373
+ options.logger.error('Error setting up threadCreatedUpdated subscription: %o', error);
374
+ throw error;
375
+ }
376
+ },
377
+ resolve: payload => {
378
+ options.logger.trace('(Subscription.threadCreatedUpdated.resolve) payload type [%s]', typeof payload);
379
+ return payload;
380
+ }
275
381
  }
276
382
  }
277
383
  });export{postThreadResolvers};//# sourceMappingURL=post-thread.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"post-thread.js","sources":["../../../src/graphql/resolvers/post-thread.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post-thread.js","sources":["../../../src/graphql/resolvers/post-thread.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}