@messenger-box/platform-server 10.0.3-alpha.7 → 10.0.3-alpha.74

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 (202) hide show
  1. package/lib/config/env-config.d.ts +7 -0
  2. package/lib/config/env-config.js +20 -0
  3. package/lib/config/env-config.js.map +1 -1
  4. package/lib/containers/containers.js +9 -1
  5. package/lib/containers/containers.js.map +1 -1
  6. package/lib/containers/context-services-from-container.d.ts +1 -1
  7. package/lib/containers/context-services-from-container.js +4 -2
  8. package/lib/containers/context-services-from-container.js.map +1 -1
  9. package/lib/graphql/resolvers/ai-fragment.d.ts +3 -0
  10. package/lib/graphql/resolvers/ai-fragment.js +276 -0
  11. package/lib/graphql/resolvers/ai-fragment.js.map +1 -0
  12. package/lib/graphql/resolvers/channel-member.d.ts +3 -2
  13. package/lib/graphql/resolvers/channel-member.js +30 -5
  14. package/lib/graphql/resolvers/channel-member.js.map +1 -1
  15. package/lib/graphql/resolvers/channel.d.ts +3 -2
  16. package/lib/graphql/resolvers/channel.js +308 -53
  17. package/lib/graphql/resolvers/channel.js.map +1 -1
  18. package/lib/graphql/resolvers/extended-token-account.d.ts +3 -2
  19. package/lib/graphql/resolvers/extended-token-account.js +90 -23
  20. package/lib/graphql/resolvers/extended-token-account.js.map +1 -1
  21. package/lib/graphql/resolvers/index.d.ts +1 -1
  22. package/lib/graphql/resolvers/index.js +1 -1
  23. package/lib/graphql/resolvers/index.js.map +1 -1
  24. package/lib/graphql/resolvers/post-thread.d.ts +1 -1
  25. package/lib/graphql/resolvers/post-thread.js +294 -132
  26. package/lib/graphql/resolvers/post-thread.js.map +1 -1
  27. package/lib/graphql/resolvers/post.d.ts +2 -3
  28. package/lib/graphql/resolvers/post.js +874 -239
  29. package/lib/graphql/resolvers/post.js.map +1 -1
  30. package/lib/graphql/resolvers/reaction.d.ts +3 -2
  31. package/lib/graphql/resolvers/reaction.js +96 -14
  32. package/lib/graphql/resolvers/reaction.js.map +1 -1
  33. package/lib/graphql/schema/ai-fragment.graphql +311 -0
  34. package/lib/graphql/schema/ai-fragment.graphql.js +1 -0
  35. package/lib/graphql/schema/ai-fragment.graphql.js.map +1 -0
  36. package/lib/graphql/schema/channel-member.graphql +110 -21
  37. package/lib/graphql/schema/channel-member.graphql.js +1 -1
  38. package/lib/graphql/schema/channel.graphql +356 -38
  39. package/lib/graphql/schema/channel.graphql.js +1 -1
  40. package/lib/graphql/schema/index.js +2 -2
  41. package/lib/graphql/schema/index.js.map +1 -1
  42. package/lib/graphql/schema/post-thread.graphql +167 -21
  43. package/lib/graphql/schema/post-thread.graphql.js +1 -1
  44. package/lib/graphql/schema/post.graphql +360 -40
  45. package/lib/graphql/schema/post.graphql.js +1 -1
  46. package/lib/graphql/schema/reaction.graphql +71 -13
  47. package/lib/graphql/schema/reaction.graphql.js +1 -1
  48. package/lib/graphql/schema/services.graphql +21 -0
  49. package/lib/graphql/schema/users.graphql +76 -13
  50. package/lib/graphql/schema/users.graphql.js +1 -1
  51. package/lib/index.js +1 -1
  52. package/lib/index.js.map +1 -1
  53. package/lib/inngest/factory.d.ts +20 -0
  54. package/lib/inngest/factory.js +4 -0
  55. package/lib/inngest/factory.js.map +1 -0
  56. package/lib/inngest/functions.d.ts +235 -0
  57. package/lib/inngest/functions.js +1385 -0
  58. package/lib/inngest/functions.js.map +1 -0
  59. package/lib/inngest/index.d.ts +3 -0
  60. package/lib/inngest/prompt.d.ts +6 -0
  61. package/lib/inngest/prompt.js +871 -0
  62. package/lib/inngest/prompt.js.map +1 -0
  63. package/lib/inngest/utils.d.ts +5 -0
  64. package/lib/inngest/utils.js +32 -0
  65. package/lib/inngest/utils.js.map +1 -0
  66. package/lib/interfaces/index.d.ts +0 -1
  67. package/lib/interfaces/services.d.ts +1 -1
  68. package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.d.ts +17 -0
  69. package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.js +44 -0
  70. package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.js.map +1 -0
  71. package/lib/migrations/dbMigrations/index.d.ts +1 -0
  72. package/lib/migrations/index.d.ts +1 -0
  73. package/lib/migrations/mail-template-migration.js +1 -1
  74. package/lib/migrations/message-notification-template-migration.d.ts +1 -1
  75. package/lib/migrations/message-notification-template-migration.js +1 -1
  76. package/lib/module.js +10 -3
  77. package/lib/module.js.map +1 -1
  78. package/lib/plugins/ai-fragment-moleculer-service.d.ts +29 -0
  79. package/lib/plugins/ai-fragment-moleculer-service.js +516 -0
  80. package/lib/plugins/ai-fragment-moleculer-service.js.map +1 -0
  81. package/lib/plugins/channel-moleculer-service.d.ts +21 -1
  82. package/lib/plugins/channel-moleculer-service.js +426 -115
  83. package/lib/plugins/channel-moleculer-service.js.map +1 -1
  84. package/lib/plugins/extended-token-account-moleculer-service.d.ts +25 -1
  85. package/lib/plugins/extended-token-account-moleculer-service.js +348 -22
  86. package/lib/plugins/extended-token-account-moleculer-service.js.map +1 -1
  87. package/lib/plugins/index.d.ts +1 -0
  88. package/lib/plugins/messenger-notification-moleculer-service.d.ts +27 -3
  89. package/lib/plugins/messenger-notification-moleculer-service.js +404 -58
  90. package/lib/plugins/messenger-notification-moleculer-service.js.map +1 -1
  91. package/lib/plugins/post-moleculer-service.d.ts +85 -21
  92. package/lib/plugins/post-moleculer-service.js +1102 -256
  93. package/lib/plugins/post-moleculer-service.js.map +1 -1
  94. package/lib/plugins/post-thread-moleculer-service.d.ts +33 -1
  95. package/lib/plugins/post-thread-moleculer-service.js +326 -8
  96. package/lib/plugins/post-thread-moleculer-service.js.map +1 -1
  97. package/lib/plugins/reaction-moleculer-service.js +1 -1
  98. package/lib/plugins/reaction-moleculer-service.js.map +1 -1
  99. package/lib/preferences/settings/post-settings.d.ts +2 -0
  100. package/lib/preferences/settings/post-settings.js +47 -9
  101. package/lib/preferences/settings/post-settings.js.map +1 -1
  102. package/lib/services/ai-fragment-service.d.ts +195 -0
  103. package/lib/services/ai-fragment-service.js +631 -0
  104. package/lib/services/ai-fragment-service.js.map +1 -0
  105. package/lib/services/channel-service.d.ts +181 -33
  106. package/lib/services/channel-service.js +842 -273
  107. package/lib/services/channel-service.js.map +1 -1
  108. package/lib/services/extended-token-account-service.d.ts +130 -14
  109. package/lib/services/extended-token-account-service.js +462 -52
  110. package/lib/services/extended-token-account-service.js.map +1 -1
  111. package/lib/services/index.d.ts +3 -0
  112. package/lib/services/messenger-notification-service.d.ts +106 -13
  113. package/lib/services/messenger-notification-service.js +824 -442
  114. package/lib/services/messenger-notification-service.js.map +1 -1
  115. package/lib/services/post-service.d.ts +189 -16
  116. package/lib/services/post-service.js +949 -113
  117. package/lib/services/post-service.js.map +1 -1
  118. package/lib/services/post-thread-service.d.ts +114 -5
  119. package/lib/services/post-thread-service.js +400 -13
  120. package/lib/services/post-thread-service.js.map +1 -1
  121. package/lib/services/proxy-services/ai-fragment-microservice.d.ts +23 -0
  122. package/lib/services/proxy-services/ai-fragment-microservice.js +78 -0
  123. package/lib/services/proxy-services/ai-fragment-microservice.js.map +1 -0
  124. package/lib/services/proxy-services/channel-microservice.d.ts +6 -3
  125. package/lib/services/proxy-services/channel-microservice.js +25 -10
  126. package/lib/services/proxy-services/channel-microservice.js.map +1 -1
  127. package/lib/services/proxy-services/index.d.ts +1 -0
  128. package/lib/services/proxy-services/messenger-notification-microservice.d.ts +128 -8
  129. package/lib/services/proxy-services/messenger-notification-microservice.js +324 -29
  130. package/lib/services/proxy-services/messenger-notification-microservice.js.map +1 -1
  131. package/lib/services/proxy-services/post-microservice.d.ts +207 -12
  132. package/lib/services/proxy-services/post-microservice.js +623 -54
  133. package/lib/services/proxy-services/post-microservice.js.map +1 -1
  134. package/lib/services/proxy-services/post-thread-microservice.d.ts +134 -3
  135. package/lib/services/proxy-services/post-thread-microservice.js +388 -6
  136. package/lib/services/proxy-services/post-thread-microservice.js.map +1 -1
  137. package/lib/services/proxy-services/reaction-microservice.d.ts +161 -3
  138. package/lib/services/proxy-services/reaction-microservice.js +474 -2
  139. package/lib/services/proxy-services/reaction-microservice.js.map +1 -1
  140. package/lib/services/reaction-service.d.ts +124 -4
  141. package/lib/services/reaction-service.js +415 -3
  142. package/lib/services/reaction-service.js.map +1 -1
  143. package/lib/services/redis-cache-manager.d.ts +18 -0
  144. package/lib/services/redis-cache-manager.js +83 -0
  145. package/lib/services/redis-cache-manager.js.map +1 -0
  146. package/lib/services/sandbox-error-service.d.ts +23 -0
  147. package/lib/services/sandbox-error-service.js +422 -0
  148. package/lib/services/sandbox-error-service.js.map +1 -0
  149. package/lib/store/models/account-token-store.d.ts +1 -1
  150. package/lib/store/models/account-token-store.js.map +1 -1
  151. package/lib/store/models/ai-fragment.d.ts +4 -0
  152. package/lib/store/models/ai-fragment.js +125 -0
  153. package/lib/store/models/ai-fragment.js.map +1 -0
  154. package/lib/store/models/channel.d.ts +2 -3
  155. package/lib/store/models/channel.js +185 -71
  156. package/lib/store/models/channel.js.map +1 -1
  157. package/lib/store/models/index.d.ts +1 -0
  158. package/lib/store/models/post-thread.d.ts +3 -3
  159. package/lib/store/models/post-thread.js +96 -14
  160. package/lib/store/models/post-thread.js.map +1 -1
  161. package/lib/store/models/post.d.ts +2 -3
  162. package/lib/store/models/post.js +143 -23
  163. package/lib/store/models/post.js.map +1 -1
  164. package/lib/store/models/reaction.d.ts +2 -3
  165. package/lib/store/models/reaction.js +67 -8
  166. package/lib/store/models/reaction.js.map +1 -1
  167. package/lib/store/repositories/__tests__/__fixtures__/team-repository.d.ts +3 -3
  168. package/lib/store/repositories/ai-fragment-repository.d.ts +15 -0
  169. package/lib/store/repositories/ai-fragment-repository.js +69 -0
  170. package/lib/store/repositories/ai-fragment-repository.js.map +1 -0
  171. package/lib/store/repositories/channel-repository.d.ts +6 -6
  172. package/lib/store/repositories/channel-repository.js +5 -2
  173. package/lib/store/repositories/channel-repository.js.map +1 -1
  174. package/lib/store/repositories/index.d.ts +1 -0
  175. package/lib/store/repositories/post-repository.d.ts +6 -6
  176. package/lib/store/repositories/post-repository.js +5 -2
  177. package/lib/store/repositories/post-repository.js.map +1 -1
  178. package/lib/store/repositories/post-thread-repository.d.ts +6 -6
  179. package/lib/store/repositories/post-thread-repository.js +5 -2
  180. package/lib/store/repositories/post-thread-repository.js.map +1 -1
  181. package/lib/store/repositories/reaction-repository.d.ts +6 -6
  182. package/lib/store/repositories/reaction-repository.js +5 -2
  183. package/lib/store/repositories/reaction-repository.js.map +1 -1
  184. package/lib/templates/constants/SERVER_TYPES.ts.template +4 -4
  185. package/lib/templates/repositories/AiFragmentRepository.ts.template +4 -0
  186. package/lib/templates/repositories/ChannelRepository.ts.template +3 -3
  187. package/lib/templates/repositories/PostRepository.ts.template +3 -3
  188. package/lib/templates/repositories/PostThreadRepository.ts.template +3 -3
  189. package/lib/templates/repositories/ReactionRepository.ts.template +3 -4
  190. package/lib/templates/services/AiFragmentService.ts.template +123 -0
  191. package/lib/templates/services/ChannelService.ts.template +290 -39
  192. package/lib/templates/services/ExtendedTokenAccountService.ts.template +104 -9
  193. package/lib/templates/services/MessengerNotificationService.ts.template +94 -19
  194. package/lib/templates/services/PostService.ts.template +265 -20
  195. package/lib/templates/services/PostThreadService.ts.template +151 -6
  196. package/lib/templates/services/ReactionService.ts.template +129 -3
  197. package/lib/templates/services/RedisCacheManager.ts.template +22 -0
  198. package/lib/templates/services/SandboxErrorService.ts.template +125 -0
  199. package/package.json +14 -7
  200. package/lib/interfaces/context.d.ts +0 -14
  201. package/lib/store/models/common-options.js +0 -20
  202. package/lib/store/models/common-options.js.map +0 -1
@@ -1,9 +1,24 @@
1
- import {RoomType}from'common';const channelResolvers = () => ({
1
+ import {RoomType}from'common/server';const channelResolvers = options => ({
2
2
  Channel: {
3
3
  creator(src, args, {
4
4
  accountService
5
5
  }) {
6
+ options.logger.trace('(Channel.creator) src.creator [%s]', src.creator);
7
+ // Check if creator exists and is not null/undefined before calling service
8
+ if (!src.creator || src.creator === null || src.creator === undefined) {
9
+ return null;
10
+ }
6
11
  return accountService.findAccountById(src.creator.toString());
12
+ },
13
+ lastMessage(src, args, {
14
+ postService
15
+ }) {
16
+ options.logger.trace('(Channel.lastMessage) src.id [%s]', src.id);
17
+ // Check if src.id exists before calling service
18
+ if (!src.id || src.id === null || src.id === undefined) {
19
+ return null;
20
+ }
21
+ return postService.getLastMessage(src.id);
7
22
  }
8
23
  },
9
24
  Query: {
@@ -13,27 +28,47 @@ import {RoomType}from'common';const channelResolvers = () => ({
13
28
  channelService,
14
29
  userContext
15
30
  }) {
31
+ options.logger.trace('(Query.channelByName) name [%s]', name);
32
+ if (!name) {
33
+ options.logger.warn('Missing channel name');
34
+ return null;
35
+ }
16
36
  return channelService.getByName(name);
17
- // return channelService.getByName(userContext.teamId, name) as Promise<IChannel>;
37
+ // return channelService.getByName(userContext.teamId, name) as unknown as Promise<IChannel>;
18
38
  },
19
39
  channels(src, _, {
20
40
  channelService,
21
41
  userContext
22
42
  }) {
43
+ options.logger.trace('(Query.channels) userContext [%j]', {
44
+ accountId: userContext.accountId,
45
+ teamId: userContext.teamId,
46
+ orgId: userContext.orgId
47
+ });
23
48
  const {
24
49
  accountId,
25
50
  teamId,
26
51
  orgId
27
52
  } = userContext;
53
+ if (!accountId || !teamId) {
54
+ options.logger.warn('Missing required user context');
55
+ return [];
56
+ }
28
57
  return channelService.getChannels(teamId, accountId, false, new Date().getTime(), orgId);
29
58
  },
30
- channelsByUser(src, args, {
59
+ async channelsByUser(src, args, {
31
60
  channelService,
32
61
  userContext
33
62
  }) {
63
+ options.logger.trace('(Query.channelsByUser) args [%j]', args);
34
64
  const {
35
65
  accountId
36
66
  } = userContext;
67
+ console.log('accountId__channelsByUser', accountId);
68
+ if (!accountId) {
69
+ options.logger.warn('Missing accountId in user context');
70
+ return [];
71
+ }
37
72
  const {
38
73
  criteria,
39
74
  role,
@@ -41,25 +76,113 @@ import {RoomType}from'common';const channelResolvers = () => ({
41
76
  } = args || {
42
77
  criteria: {}
43
78
  };
44
- return channelService.getAll({
45
- ...rest,
46
- criteria: {
47
- ...criteria,
48
- members: criteria?.members ?? {
49
- $elemMatch: {
50
- user: accountId,
51
- ...(role ? {
52
- roles: role
53
- } : {})
79
+ console.log('criteria', criteria);
80
+ console.log('role', role);
81
+ try {
82
+ // Check if Service type is included in the query
83
+ const includesService = criteria?.type === RoomType.Service || Array.isArray(criteria?.type) && criteria.type.includes(RoomType.Service) || criteria?.type?.$in && criteria.type.$in.includes(RoomType.Service);
84
+ if (includesService) {
85
+ // If Service type is included, fetch SERVICE and non-SERVICE channels separately
86
+ const {
87
+ type,
88
+ ...restCriteria
89
+ } = criteria;
90
+ // Build non-service types from original query
91
+ let nonServiceTypes;
92
+ if (Array.isArray(type)) {
93
+ nonServiceTypes = type.filter(t => t !== RoomType.Service);
94
+ } else if (type?.$in) {
95
+ nonServiceTypes = type.$in.filter(t => t !== RoomType.Service);
96
+ } else {
97
+ // Single type that's not Service (shouldn't happen in this branch but for safety)
98
+ nonServiceTypes = type !== RoomType.Service ? [type] : [];
99
+ }
100
+ // Fetch SERVICE channels separately (no orgName restriction)
101
+ const serviceChannels = await channelService.getAll({
102
+ ...rest,
103
+ criteria: {
104
+ type: RoomType.Service
54
105
  }
106
+ });
107
+ // Fetch non-SERVICE channels separately (with orgName and member restrictions)
108
+ let otherChannels = [];
109
+ if (nonServiceTypes.length > 0) {
110
+ otherChannels = await channelService.getAll({
111
+ ...rest,
112
+ criteria: {
113
+ ...restCriteria,
114
+ type: nonServiceTypes.length === 1 ? nonServiceTypes[0] : {
115
+ $in: nonServiceTypes
116
+ },
117
+ members: criteria?.members ?? {
118
+ $elemMatch: {
119
+ user: accountId,
120
+ ...(role ? {
121
+ roles: role
122
+ } : {})
123
+ }
124
+ }
125
+ }
126
+ });
127
+ }
128
+ // Sort each group separately
129
+ const sortedServiceChannels = serviceChannels.sort((a, b) => (a.title || '').localeCompare(b.title || ''));
130
+ const sortedOtherChannels = otherChannels.sort((a, b) => {
131
+ const aTime = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;
132
+ const bTime = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;
133
+ return bTime - aTime;
134
+ });
135
+ options.logger.trace('SERVICE channels count: %d', sortedServiceChannels.length);
136
+ options.logger.trace('Other channels count: %d', sortedOtherChannels.length);
137
+ if (sortedServiceChannels.length > 0) {
138
+ options.logger.trace('First SERVICE channel: %s', sortedServiceChannels[0].title);
55
139
  }
140
+ // GUARANTEE: SERVICE channels first, then others
141
+ const finalResult = [...sortedServiceChannels, ...sortedOtherChannels];
142
+ options.logger.trace('Final result order: %j', finalResult.map(ch => `${ch.type}: ${ch.title}`));
143
+ return finalResult;
144
+ } else {
145
+ // No Service type - apply member filter to all channels
146
+ const querycriteria = {
147
+ ...criteria,
148
+ members: criteria?.members ?? {
149
+ $elemMatch: {
150
+ user: accountId,
151
+ ...(role ? {
152
+ roles: role
153
+ } : {})
154
+ }
155
+ }
156
+ };
157
+ const results = await channelService.getAll({
158
+ ...rest,
159
+ criteria: querycriteria
160
+ });
161
+ // Sort results to put SERVICE channels first
162
+ return results.sort((a, b) => {
163
+ // SERVICE channels always come first
164
+ if (a.type === RoomType.Service && b.type !== RoomType.Service) return -1;
165
+ if (a.type !== RoomType.Service && b.type === RoomType.Service) return 1;
166
+ // If both are SERVICE channels, sort by title/name
167
+ if (a.type === RoomType.Service && b.type === RoomType.Service) {
168
+ return (a.title || '').localeCompare(b.title || '');
169
+ }
170
+ // For non-SERVICE channels, sort by updatedAt (most recent first)
171
+ const aTime = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;
172
+ const bTime = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;
173
+ return bTime - aTime;
174
+ });
56
175
  }
57
- });
176
+ } catch (error) {
177
+ options.logger.error('Error in channelsByUser: %o', error);
178
+ return [];
179
+ }
58
180
  },
59
181
  supportServiceChannels(src, args, {
60
182
  channelService,
61
183
  userContext
62
184
  }) {
185
+ options.logger.trace('(Query.supportServiceChannels) args [%j]', args);
63
186
  const {
64
187
  accountId
65
188
  } = userContext;
@@ -70,12 +193,17 @@ import {RoomType}from'common';const channelResolvers = () => ({
70
193
  } = args || {
71
194
  criteria: {}
72
195
  };
73
- return channelService.getAll({
74
- ...rest,
75
- criteria: {
76
- ...criteria
77
- }
78
- });
196
+ try {
197
+ return channelService.getAll({
198
+ ...rest,
199
+ criteria: {
200
+ ...criteria
201
+ }
202
+ });
203
+ } catch (error) {
204
+ options.logger.error('Error in supportServiceChannels: %o', error);
205
+ return [];
206
+ }
79
207
  },
80
208
  directChannel(src, {
81
209
  id
@@ -83,6 +211,15 @@ import {RoomType}from'common';const channelResolvers = () => ({
83
211
  channelService,
84
212
  userContext
85
213
  }) {
214
+ options.logger.trace('(Query.directChannel) id [%s]', id);
215
+ if (!id) {
216
+ options.logger.warn('Missing channel id');
217
+ return null;
218
+ }
219
+ if (!userContext.accountId) {
220
+ options.logger.warn('Missing accountId in user context');
221
+ return null;
222
+ }
86
223
  return channelService.get({
87
224
  criteria: {
88
225
  id,
@@ -97,6 +234,11 @@ import {RoomType}from'common';const channelResolvers = () => ({
97
234
  channelService,
98
235
  userContext
99
236
  }) {
237
+ options.logger.trace('(Query.viewChannelDetail) id [%s]', id);
238
+ if (!id) {
239
+ options.logger.warn('Missing channel id');
240
+ return null;
241
+ }
100
242
  return channelService.get(id);
101
243
  }
102
244
  },
@@ -110,27 +252,52 @@ import {RoomType}from'common';const channelResolvers = () => ({
110
252
  channelService,
111
253
  userContext
112
254
  }) {
113
- const {
114
- accountId,
115
- teamId,
116
- orgId
117
- } = userContext;
118
- const formatedName = name[0].toUpperCase() + name.slice(1).toLowerCase();
119
- const title = formatedName?.replace(/-/g, ' ') ?? '';
120
- // const channelDetail = await channelService.getByName(userContext.teamId, title);
121
- const channelDetail = await channelService.getByName(title);
122
- if (channelDetail) return;
123
- const channel = channelService.saveChannel({
124
- type: type || RoomType.Channel,
125
- orgName: orgId,
126
- creator: accountId,
127
- title: title,
128
- displayName: name?.toLowerCase(),
129
- topic: name?.toLowerCase(),
130
- team: team || teamId,
131
- description
255
+ options.logger.trace('(Mutation.createChannel) args [%j]', {
256
+ name,
257
+ description,
258
+ type,
259
+ team
132
260
  });
133
- return channel;
261
+ try {
262
+ if (!name) {
263
+ options.logger.warn('Missing channel name');
264
+ throw new Error('Channel name is required');
265
+ }
266
+ if (!userContext.accountId) {
267
+ options.logger.warn('Missing accountId in user context');
268
+ throw new Error('User not authenticated');
269
+ }
270
+ const {
271
+ accountId,
272
+ teamId,
273
+ orgId
274
+ } = userContext;
275
+ const formatedName = name[0].toUpperCase() + name.slice(1).toLowerCase();
276
+ const title = formatedName?.replace(/-/g, ' ') ?? '';
277
+ // const channelDetail = await channelService.getByName(userContext.teamId, title);
278
+ const channelDetail = await channelService.getByName(title);
279
+ if (channelDetail) {
280
+ options.logger.warn('Channel already exists with name: %s', title);
281
+ return null;
282
+ }
283
+ const orgName = orgId || '';
284
+ const organization = orgId || '';
285
+ const channel = channelService.saveChannel({
286
+ type: type || RoomType.Channel,
287
+ orgName,
288
+ organization,
289
+ creator: accountId,
290
+ title: title,
291
+ displayName: name?.toLowerCase(),
292
+ topic: name?.toLowerCase(),
293
+ team: team || teamId,
294
+ description
295
+ });
296
+ return channel;
297
+ } catch (error) {
298
+ options.logger.error('Error creating channel: %o', error);
299
+ throw error;
300
+ }
134
301
  },
135
302
  addMemberToChannel(src, {
136
303
  channelId,
@@ -139,6 +306,11 @@ import {RoomType}from'common';const channelResolvers = () => ({
139
306
  channelService,
140
307
  userContext
141
308
  }) {
309
+ options.logger.trace('(Mutation.addMemberToChannel) channelId [%s], memberId [%s]', channelId, memberId);
310
+ if (!channelId || !memberId) {
311
+ options.logger.warn('Missing channelId or memberId');
312
+ throw new Error('Channel ID and Member ID are required');
313
+ }
142
314
  return channelService.addMemberToChannel(channelId, memberId);
143
315
  },
144
316
  saveMembersToChannel(src, {
@@ -148,6 +320,11 @@ import {RoomType}from'common';const channelResolvers = () => ({
148
320
  channelService,
149
321
  userContext
150
322
  }) {
323
+ options.logger.trace('(Mutation.saveMembersToChannel) channelId [%s], membersIds [%j]', channelId, membersIds);
324
+ if (!channelId || !membersIds) {
325
+ options.logger.warn('Missing channelId or membersIds');
326
+ throw new Error('Channel ID and Members IDs are required');
327
+ }
151
328
  return channelService.saveMembersToChannel({
152
329
  membersIds,
153
330
  channelId
@@ -161,23 +338,43 @@ import {RoomType}from'common';const channelResolvers = () => ({
161
338
  channelService,
162
339
  userContext
163
340
  }) {
164
- const {
165
- accountId,
166
- orgId
167
- } = userContext;
168
- return channelService.createDirectChannel({
169
- sender: accountId,
170
- receiver: receiver,
171
- displayName,
172
- orgName: orgId,
173
- channelOptions
174
- });
341
+ options.logger.trace('(Mutation.createDirectChannel) receiver [%s], displayName [%s]', receiver, displayName);
342
+ try {
343
+ if (!receiver || !displayName) {
344
+ options.logger.warn('Missing receiver or displayName');
345
+ throw new Error('Receiver and display name are required');
346
+ }
347
+ if (!userContext.accountId || !userContext.orgId) {
348
+ options.logger.warn('Missing user context');
349
+ throw new Error('User context required');
350
+ }
351
+ const {
352
+ accountId,
353
+ orgId
354
+ } = userContext;
355
+ return channelService.createDirectChannel({
356
+ sender: accountId,
357
+ receiver: receiver,
358
+ displayName,
359
+ orgName: orgId,
360
+ organization: orgId,
361
+ channelOptions
362
+ });
363
+ } catch (error) {
364
+ options.logger.error('Error creating direct channel: %o', error);
365
+ throw error;
366
+ }
175
367
  },
176
368
  hideChannel(src, {
177
369
  id
178
370
  }, {
179
371
  channelService
180
372
  }) {
373
+ options.logger.trace('(Mutation.hideChannel) id [%s]', id);
374
+ if (!id) {
375
+ options.logger.warn('Missing channel id');
376
+ throw new Error('Channel ID is required');
377
+ }
181
378
  return channelService.hideChannel(id);
182
379
  },
183
380
  leaveChannel(src, {
@@ -185,6 +382,11 @@ import {RoomType}from'common';const channelResolvers = () => ({
185
382
  }, {
186
383
  channelService
187
384
  }) {
385
+ options.logger.trace('(Mutation.leaveChannel) id [%s]', id);
386
+ if (!id) {
387
+ options.logger.warn('Missing channel id');
388
+ throw new Error('Channel ID is required');
389
+ }
188
390
  return channelService.leaveChannel(id);
189
391
  },
190
392
  deleteChannel(src, {
@@ -192,6 +394,11 @@ import {RoomType}from'common';const channelResolvers = () => ({
192
394
  }, {
193
395
  channelService
194
396
  }) {
397
+ options.logger.trace('(Mutation.deleteChannel) id [%s]', id);
398
+ if (!id) {
399
+ options.logger.warn('Missing channel id');
400
+ throw new Error('Channel ID is required');
401
+ }
195
402
  return channelService.deleteChannel(id);
196
403
  },
197
404
  viewChannel(src, {
@@ -200,6 +407,15 @@ import {RoomType}from'common';const channelResolvers = () => ({
200
407
  userContext,
201
408
  channelService
202
409
  }) {
410
+ options.logger.trace('(Mutation.viewChannel) id [%s], accountId [%s]', id, userContext.accountId);
411
+ if (!id) {
412
+ options.logger.warn('Missing channel id');
413
+ throw new Error('Channel ID is required');
414
+ }
415
+ if (!userContext.accountId) {
416
+ options.logger.warn('Missing accountId in user context');
417
+ throw new Error('User context required');
418
+ }
203
419
  return channelService.viewChannel(id, userContext.accountId);
204
420
  },
205
421
  async sendNotificationOfUnreadMessages(src, {
@@ -208,8 +424,47 @@ import {RoomType}from'common';const channelResolvers = () => ({
208
424
  }, {
209
425
  messengerNotificationService
210
426
  }) {
211
- await messengerNotificationService.sendNotificationOfUnreadMessages(unit, value);
212
- return true;
427
+ options.logger.trace('(Mutation.sendNotificationOfUnreadMessages) unit [%s], value [%s]', unit, value);
428
+ try {
429
+ if (!unit || value === undefined || value === null) {
430
+ options.logger.warn('Missing unit or value');
431
+ throw new Error('Unit and value are required');
432
+ }
433
+ await messengerNotificationService.sendNotificationOfUnreadMessages(unit, value);
434
+ return true;
435
+ } catch (error) {
436
+ options.logger.error('Error sending notification: %o', error);
437
+ return false;
438
+ }
439
+ },
440
+ async createChannelWithProjectId(src, {
441
+ projectId,
442
+ channelInput
443
+ }, {
444
+ channelService,
445
+ userContext
446
+ }) {
447
+ options.logger.trace('(Mutation.createChannelWithProjectId) projectId [%s], channelInput [%j]', projectId, channelInput);
448
+ const {
449
+ accountId,
450
+ teamId,
451
+ orgId
452
+ } = userContext;
453
+ // channelInput.createdBy = channelInput.createdBy || accountId;
454
+ // channelInput.orgName = orgId;
455
+ // channelInput.organization = orgId;
456
+ // channelInput.team = teamId;
457
+ const channelInputData = {
458
+ ...channelInput,
459
+ createdBy: accountId,
460
+ orgName: orgId,
461
+ organization: orgId,
462
+ team: teamId,
463
+ accountId: accountId,
464
+ teamId: teamId,
465
+ orgId: orgId
466
+ };
467
+ return await channelService.createChannelWithProjectId(projectId, channelInputData);
213
468
  }
214
469
  }
215
470
  });export{channelResolvers};//# sourceMappingURL=channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sources":["../../../src/graphql/resolvers/channel.ts"],"sourcesContent":[null],"names":[],"mappings":"8BAEa,MAAA,gBAAgB,GAAG,OAAmB;AAC/C,EAAA,OAAA,EAAO;AACH,IAAA,OAAA,CAAA,GAAO,EAAI,IAAE;;;AAGhB,MAAA,OAAA,cAAA,CAAA,eAAA,CAAA,GAAA,CAAA,OAAA,CAAA,QAAA,EAAA,CAAA;AACD;;AAEQ,EAAA,KAAA,EAAA;iBACkF,CAAA,GAAA,EAAA;;;oBAG1E;AACR,MAAA;;aAIU,cAAM,CAAA,SAAQ,CAAA,IAAA,CAAA;AACxB;AACA,KAAA;YACA,CAAO,GAAA,EAAA,CAAA,EAAA;AACH,MAAA,cAAgB;AAChB,MAAA;AACI,KAAA,EAAA;AACA,MAAA,MAAA;AACI,QAAA,SAAA;AACI,QAAA,MAAA;AACA,QAAA;AACH,OAAA,GAAA,WAAA;AACJ,MAAA,OAAA,cAAA,CAAA,WAAA,CAAA,MAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,IAAA,EAAA,CAAA,OAAA,EAAA,EAAA,KAAA,CAAA;AACJ,KAAA;AACJ,IAAA,cAAyB,CAAA,GAAA,EAAA,IAAA,EAAA;oBAC7B;;AAEG,KAAA,EAAA;AACA,MAAA,MAAA;;AAEI,OAAA,GAAA,WAAgB;AAChB,MAAA,MAAA;AACI,QAAA,QAAA;AACH,QAAA,IAAA;AACJ,QAAA,GAAA;UACJ,IAAA,IAAA;QACD,QAAa,EAAA;;AAEL,MAAA,OAAA,cAAU,CAAA,MAAA,CAAA;;;qBAGF;AACP,UAAA,OAAA,EAAA,QAAA,EAAA,OAAA,IAAA;AACJ,YAAA,UAAuB,EAAA;cAC3B,IAAA,EAAA,SAAA;cACgB,IAAA,IAAA,GAAA;AACb,gBAAA;eACH,GAAA,EAAA;AACJ;AACD;AACI;;AAEI,KAAA;AACA,IAAA,sBAAc,CAAY,GAAA,EAAA,IAAA,EAAA;oBACyD;;AAEnF,KAAA,EAAA;;AACA,QAAA;AACI,OAAA,GAAA,WAAM;AACN,MAAA,MAAA;AACA,QAAA,QAAA;AACA,QAAA,IAAA;AACA,QAAA,GAAA;AACA,OAAA,GAAA,IAAA,IAAA;gBACA,EAAI;;AAEP,MAAA,OAAA,cAAE,CAAA,MAAA,CAAA;AACH,QAAA,GAAA,IAAA;QACJ,QAAC,EAAA;AAED,UAAA,GAAA;;QAEA;AAEA,KAAA;iBACW,CAAA,GAAA,EAAA;;AAGX,KAAA,EAAA;AACI,MAAA,cAAQ;;AAEJ,KAAA,EAAA;AACA,MAAA,OAAA,cAAyB,CAAA,GAAA,CAAA;gBACzB,EAAW;AACX,UAAA,EAAA;gBACA,WAAc,CAAA,SAAA;AACjB,UAAA,IAAsB,EAAC,QAAA,CAAA;;QAE5B;AACI,KAAA;qBACH,CAAA,GAAA,EAAA;;AAEG,KAAA,EAAA;oBACH;;AAEG,KAAA,EAAA;aACH,cAAA,CAAA,GAAA,CAAA,EAAA,CAAA;;;UAGA,EAAA;AACD,IAAA,MAAA,aAAM,CAAA,GAAA,EAAA;;AAKF,MAAA,WAAA;UACH;AACJ,MAAA;AACJ,KAAE,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"channel.js","sources":["../../../src/graphql/resolvers/channel.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- import { IResolvers } from 'common';
2
- export declare const resolver: () => IResolvers;
1
+ import { IResolverOptions } from '@common-stack/server-core';
2
+ import { IResolvers } from 'common/server';
3
+ export declare const resolver: (options: IResolverOptions) => IResolvers;
@@ -1,7 +1,14 @@
1
- const resolver = () => ({
1
+ const resolver = options => ({
2
2
  // UserAccount: {
3
- // async deviceToken(src:IUserAccount, args,{extendedTokenAccountService,userContext}){
4
- // return extendedTokenAccountService.getDeviceToken(src);
3
+ // async deviceToken(src: IUserAccount, args, { extendedTokenAccountService, userContext }) {
4
+ // options.logger.trace('(UserAccount.deviceToken) src.id [%s]', src.id);
5
+ //
6
+ // // Check if src exists before calling service
7
+ // if (!src || !src.id) {
8
+ // return null;
9
+ // }
10
+ //
11
+ // return extendedTokenAccountService.getDeviceToken(src.id) as any;
5
12
  // },
6
13
  // },
7
14
  Query: {
@@ -10,9 +17,20 @@ const resolver = () => ({
10
17
  userContext,
11
18
  accountService
12
19
  }) {
13
- // const user = await accountService.findAccountById(userContext.accountId);
14
- // return extendedTokenAccountService.getDeviceToken(user);
15
- return extendedTokenAccountService.getDeviceToken(userContext.accountId);
20
+ options.logger.trace('(Query.getDeviceToken) userContext.accountId [%s]', userContext?.accountId);
21
+ try {
22
+ if (!userContext?.accountId) {
23
+ options.logger.warn('Missing accountId in user context');
24
+ return null;
25
+ }
26
+ // const user = await accountService.findAccountById(userContext.accountId);
27
+ // return extendedTokenAccountService.getDeviceToken(user);
28
+ const result = await extendedTokenAccountService.getDeviceToken(userContext.accountId);
29
+ return result;
30
+ } catch (error) {
31
+ options.logger.error('Error getting device token: %o', error);
32
+ return null;
33
+ }
16
34
  },
17
35
  async getAccountByAuth0Id(_, {
18
36
  auth0Id
@@ -21,9 +39,20 @@ const resolver = () => ({
21
39
  userContext,
22
40
  accountService
23
41
  }) {
24
- // const user = await accountService.findAccountById(userContext.accountId);
25
- // return extendedTokenAccountService.getDeviceToken(user);
26
- return extendedTokenAccountService.getAccountByAuth0Id(auth0Id);
42
+ options.logger.trace('(Query.getAccountByAuth0Id) auth0Id [%s]', auth0Id);
43
+ try {
44
+ if (!auth0Id) {
45
+ options.logger.warn('Missing auth0Id parameter');
46
+ return null;
47
+ }
48
+ // const user = await accountService.findAccountById(userContext.accountId);
49
+ // return extendedTokenAccountService.getDeviceToken(user);
50
+ const result = await extendedTokenAccountService.getAccountByAuth0Id(auth0Id);
51
+ return result;
52
+ } catch (error) {
53
+ options.logger.error('Error getting account by Auth0 ID: %o', error);
54
+ return null;
55
+ }
27
56
  }
28
57
  },
29
58
  Mutation: {
@@ -34,27 +63,65 @@ const resolver = () => ({
34
63
  userContext,
35
64
  accountService
36
65
  }) {
37
- const user = await extendedTokenAccountService.getDeviceToken(userContext.accountId);
38
- const expoTokens = user?.tokens?.filter(t => t?.type === 'EXPO_NOTIFICATION_TOKEN' && t?.token != deviceToken);
39
- if (expoTokens && expoTokens?.length > 0) {
40
- expoTokens.forEach(async t => {
41
- await extendedTokenAccountService.removeDeviceToken(t?.token, userContext.accountId);
42
- });
43
- }
44
- const checkUserToken = await extendedTokenAccountService.getDeviceToken(userContext.accountId);
45
- let expoNotificationToken = checkUserToken?.tokens?.filter(t => t?.type === 'EXPO_NOTIFICATION_TOKEN' && t?.token == deviceToken);
46
- if (expoNotificationToken && expoNotificationToken?.length > 0) return checkUserToken;else {
47
- await extendedTokenAccountService.setDeviceToken(deviceToken, userContext.accountId);
48
- return extendedTokenAccountService.getDeviceToken(userContext.accountId);
66
+ options.logger.trace('(Mutation.setDeviceToken) deviceToken [%s], accountId [%s]', deviceToken ? '***' : 'null', userContext?.accountId);
67
+ try {
68
+ if (!deviceToken) {
69
+ options.logger.warn('Missing deviceToken parameter');
70
+ throw new Error('Device token is required');
71
+ }
72
+ if (!userContext?.accountId) {
73
+ options.logger.warn('Missing accountId in user context');
74
+ throw new Error('User not authenticated');
75
+ }
76
+ const user = await extendedTokenAccountService.getDeviceToken(userContext.accountId);
77
+ // Filter out existing EXPO_NOTIFICATION_TOKEN that are different from the new one
78
+ const expoTokens = user?.tokens?.filter(t => t?.type === 'EXPO_NOTIFICATION_TOKEN' && t?.token != deviceToken);
79
+ // Remove existing different expo tokens
80
+ if (expoTokens && expoTokens?.length > 0) {
81
+ options.logger.debug('Removing %d existing expo tokens', expoTokens.length);
82
+ for (const t of expoTokens) {
83
+ await extendedTokenAccountService.removeDeviceToken(t?.token, userContext.accountId);
84
+ }
85
+ }
86
+ // Check if the token already exists
87
+ const checkUserToken = await extendedTokenAccountService.getDeviceToken(userContext.accountId);
88
+ let expoNotificationToken = checkUserToken?.tokens?.filter(t => t?.type === 'EXPO_NOTIFICATION_TOKEN' && t?.token == deviceToken);
89
+ if (expoNotificationToken && expoNotificationToken?.length > 0) {
90
+ options.logger.debug('Device token already exists for user');
91
+ return checkUserToken;
92
+ } else {
93
+ options.logger.debug('Adding new device token for user');
94
+ await extendedTokenAccountService.setDeviceToken(deviceToken, userContext.accountId);
95
+ const result = await extendedTokenAccountService.getDeviceToken(userContext.accountId);
96
+ return result;
97
+ }
98
+ } catch (error) {
99
+ options.logger.error('Error setting device token: %o', error);
100
+ throw error;
49
101
  }
50
102
  },
51
- removeDeviceToken(_, {
103
+ async removeDeviceToken(_, {
52
104
  deviceToken
53
105
  }, {
54
106
  extendedTokenAccountService,
55
107
  userContext
56
108
  }) {
57
- return extendedTokenAccountService.removeDeviceToken(deviceToken, userContext.accountId);
109
+ options.logger.trace('(Mutation.removeDeviceToken) deviceToken [%s], accountId [%s]', deviceToken ? '***' : 'null', userContext?.accountId);
110
+ try {
111
+ if (!deviceToken) {
112
+ options.logger.warn('Missing deviceToken parameter');
113
+ throw new Error('Device token is required');
114
+ }
115
+ if (!userContext?.accountId) {
116
+ options.logger.warn('Missing accountId in user context');
117
+ throw new Error('User not authenticated');
118
+ }
119
+ const result = await extendedTokenAccountService.removeDeviceToken(deviceToken, userContext.accountId);
120
+ return result;
121
+ } catch (error) {
122
+ options.logger.error('Error removing device token: %o', error);
123
+ throw error;
124
+ }
58
125
  }
59
126
  }
60
127
  });export{resolver};//# sourceMappingURL=extended-token-account.js.map