@solidstarters/solid-core 1.2.163 → 1.2.166

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 (189) hide show
  1. package/dist/controllers/test-queue.controller.d.ts +1 -1
  2. package/dist/controllers/test-queue.controller.d.ts.map +1 -1
  3. package/dist/controllers/test-queue.controller.js +6 -4
  4. package/dist/controllers/test-queue.controller.js.map +1 -1
  5. package/dist/decorators/error-codes-provider.decorator.d.ts +4 -0
  6. package/dist/decorators/error-codes-provider.decorator.d.ts.map +1 -0
  7. package/dist/decorators/error-codes-provider.decorator.js +12 -0
  8. package/dist/decorators/error-codes-provider.decorator.js.map +1 -0
  9. package/dist/entities/security-rule.entity.js +0 -1
  10. package/dist/entities/security-rule.entity.js.map +1 -1
  11. package/dist/filters/http-exception.filter.d.ts +3 -2
  12. package/dist/filters/http-exception.filter.d.ts.map +1 -1
  13. package/dist/filters/http-exception.filter.js +23 -16
  14. package/dist/filters/http-exception.filter.js.map +1 -1
  15. package/dist/helpers/error-mapper.service.d.ts +12 -2
  16. package/dist/helpers/error-mapper.service.d.ts.map +1 -1
  17. package/dist/helpers/error-mapper.service.js +85 -72
  18. package/dist/helpers/error-mapper.service.js.map +1 -1
  19. package/dist/helpers/solid-core-error-codes-provider.service.d.ts +7 -0
  20. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -0
  21. package/dist/helpers/solid-core-error-codes-provider.service.js +67 -0
  22. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -0
  23. package/dist/helpers/solid-registry.d.ts +5 -1
  24. package/dist/helpers/solid-registry.d.ts.map +1 -1
  25. package/dist/helpers/solid-registry.js +16 -0
  26. package/dist/helpers/solid-registry.js.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/interfaces.d.ts +16 -0
  32. package/dist/interfaces.d.ts.map +1 -1
  33. package/dist/interfaces.js.map +1 -1
  34. package/dist/jobs/chatter-queue-options.d.ts +8 -0
  35. package/dist/jobs/chatter-queue-options.d.ts.map +1 -0
  36. package/dist/jobs/chatter-queue-options.js +10 -0
  37. package/dist/jobs/chatter-queue-options.js.map +1 -0
  38. package/dist/jobs/chatter-queue-publisher.service.d.ts +22 -0
  39. package/dist/jobs/chatter-queue-publisher.service.d.ts.map +1 -0
  40. package/dist/jobs/chatter-queue-publisher.service.js +39 -0
  41. package/dist/jobs/chatter-queue-publisher.service.js.map +1 -0
  42. package/dist/jobs/chatter-queue-subscriber.service.d.ts +17 -0
  43. package/dist/jobs/chatter-queue-subscriber.service.d.ts.map +1 -0
  44. package/dist/jobs/chatter-queue-subscriber.service.js +59 -0
  45. package/dist/jobs/chatter-queue-subscriber.service.js.map +1 -0
  46. package/dist/jobs/{database/computed-field-evaluation-publisher.service.d.ts → computed-field-evaluation-publisher.service.d.ts} +2 -2
  47. package/dist/jobs/computed-field-evaluation-publisher.service.d.ts.map +1 -0
  48. package/dist/jobs/{database/computed-field-evaluation-publisher.service.js → computed-field-evaluation-publisher.service.js} +8 -8
  49. package/dist/jobs/computed-field-evaluation-publisher.service.js.map +1 -0
  50. package/dist/jobs/{database/computed-field-evaluation-queue-options.d.ts → computed-field-evaluation-queue-options.d.ts} +1 -1
  51. package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -0
  52. package/dist/jobs/{database/computed-field-evaluation-queue-options.js → computed-field-evaluation-queue-options.js} +2 -2
  53. package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -0
  54. package/dist/jobs/{database/computed-field-evaluation-subscriber.service.d.ts → computed-field-evaluation-subscriber.service.d.ts} +3 -3
  55. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -0
  56. package/dist/jobs/computed-field-evaluation-subscriber.service.js +51 -0
  57. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -0
  58. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts +12 -0
  59. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.d.ts.map +1 -0
  60. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.js +39 -0
  61. package/dist/jobs/database/computed-field-evaluation-publisher-database.service.js.map +1 -0
  62. package/dist/jobs/database/computed-field-evaluation-queue-options-database.d.ts +8 -0
  63. package/dist/jobs/database/computed-field-evaluation-queue-options-database.d.ts.map +1 -0
  64. package/dist/jobs/database/computed-field-evaluation-queue-options-database.js +10 -0
  65. package/dist/jobs/database/computed-field-evaluation-queue-options-database.js.map +1 -0
  66. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts +18 -0
  67. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.d.ts.map +1 -0
  68. package/dist/jobs/database/{computed-field-evaluation-subscriber.service.js → computed-field-evaluation-subscriber-database.service.js} +8 -8
  69. package/dist/jobs/database/computed-field-evaluation-subscriber-database.service.js.map +1 -0
  70. package/dist/jobs/database/generate-code-queue-options-database.js +2 -2
  71. package/dist/jobs/database/generate-code-queue-options-database.js.map +1 -1
  72. package/dist/jobs/database/test-queue-subscriber-database.service.d.ts.map +1 -1
  73. package/dist/jobs/database/test-queue-subscriber-database.service.js +7 -1
  74. package/dist/jobs/database/test-queue-subscriber-database.service.js.map +1 -1
  75. package/dist/jobs/generate-code-publisher.service.d.ts +11 -0
  76. package/dist/jobs/generate-code-publisher.service.d.ts.map +1 -0
  77. package/dist/jobs/generate-code-publisher.service.js +39 -0
  78. package/dist/jobs/generate-code-publisher.service.js.map +1 -0
  79. package/dist/jobs/generate-code-queue-options.d.ts +8 -0
  80. package/dist/jobs/generate-code-queue-options.d.ts.map +1 -0
  81. package/dist/jobs/generate-code-queue-options.js +10 -0
  82. package/dist/jobs/generate-code-queue-options.js.map +1 -0
  83. package/dist/jobs/generate-code-subscriber.service.d.ts +18 -0
  84. package/dist/jobs/generate-code-subscriber.service.d.ts.map +1 -0
  85. package/dist/jobs/generate-code-subscriber.service.js +70 -0
  86. package/dist/jobs/generate-code-subscriber.service.js.map +1 -0
  87. package/dist/jobs/test-queue-subscriber.service.d.ts +1 -1
  88. package/dist/jobs/test-queue-subscriber.service.d.ts.map +1 -1
  89. package/dist/jobs/test-queue-subscriber.service.js +9 -6
  90. package/dist/jobs/test-queue-subscriber.service.js.map +1 -1
  91. package/dist/jobs/trigger-mcp-client-publisher.service.d.ts +11 -0
  92. package/dist/jobs/trigger-mcp-client-publisher.service.d.ts.map +1 -0
  93. package/dist/jobs/trigger-mcp-client-publisher.service.js +39 -0
  94. package/dist/jobs/trigger-mcp-client-publisher.service.js.map +1 -0
  95. package/dist/jobs/trigger-mcp-client-queue-options.d.ts +8 -0
  96. package/dist/jobs/trigger-mcp-client-queue-options.d.ts.map +1 -0
  97. package/dist/jobs/trigger-mcp-client-queue-options.js +10 -0
  98. package/dist/jobs/trigger-mcp-client-queue-options.js.map +1 -0
  99. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts +18 -0
  100. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts.map +1 -0
  101. package/dist/jobs/trigger-mcp-client-subscriber.service.js +103 -0
  102. package/dist/jobs/trigger-mcp-client-subscriber.service.js.map +1 -0
  103. package/dist/jobs/twilio-sms-publisher.service.d.ts +11 -0
  104. package/dist/jobs/twilio-sms-publisher.service.d.ts.map +1 -0
  105. package/dist/jobs/twilio-sms-publisher.service.js +39 -0
  106. package/dist/jobs/twilio-sms-publisher.service.js.map +1 -0
  107. package/dist/jobs/twilio-sms-queue-options.d.ts +8 -0
  108. package/dist/jobs/twilio-sms-queue-options.d.ts.map +1 -0
  109. package/dist/jobs/twilio-sms-queue-options.js +10 -0
  110. package/dist/jobs/twilio-sms-queue-options.js.map +1 -0
  111. package/dist/jobs/twilio-sms-subscriber.service.d.ts +17 -0
  112. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -0
  113. package/dist/jobs/twilio-sms-subscriber.service.js +48 -0
  114. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -0
  115. package/dist/repository/security-rule.repository.js +2 -2
  116. package/dist/repository/security-rule.repository.js.map +1 -1
  117. package/dist/seeders/seed-data/solid-core-metadata.json +2 -2
  118. package/dist/services/authentication.service.js +3 -3
  119. package/dist/services/authentication.service.js.map +1 -1
  120. package/dist/services/queues/database-publisher.service.js +2 -2
  121. package/dist/services/queues/database-publisher.service.js.map +1 -1
  122. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  123. package/dist/services/queues/database-subscriber.service.js +2 -1
  124. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  125. package/dist/services/queues/publisher-factory.service.js +1 -1
  126. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  127. package/dist/services/solid-introspect.service.d.ts +1 -0
  128. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  129. package/dist/services/solid-introspect.service.js +14 -0
  130. package/dist/services/solid-introspect.service.js.map +1 -1
  131. package/dist/solid-core.module.d.ts.map +1 -1
  132. package/dist/solid-core.module.js +23 -4
  133. package/dist/solid-core.module.js.map +1 -1
  134. package/dist/subscribers/audit.subscriber.d.ts +8 -0
  135. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  136. package/dist/subscribers/audit.subscriber.js +52 -3
  137. package/dist/subscribers/audit.subscriber.js.map +1 -1
  138. package/dist/subscribers/computed-entity-field.subscriber.d.ts +3 -3
  139. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  140. package/dist/subscribers/computed-entity-field.subscriber.js +5 -7
  141. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  142. package/dist/tsconfig.tsbuildinfo +1 -1
  143. package/package.json +1 -1
  144. package/src/controllers/test-queue.controller.ts +4 -3
  145. package/src/decorators/error-codes-provider.decorator.ts +9 -0
  146. package/src/entities/security-rule.entity.ts +1 -1
  147. package/src/filters/http-exception.filter.ts +48 -23
  148. package/src/helpers/error-mapper.service.ts +117 -176
  149. package/src/helpers/solid-core-error-codes-provider.service.ts +63 -0
  150. package/src/helpers/solid-registry.ts +20 -1
  151. package/src/index.ts +1 -0
  152. package/src/interfaces.ts +36 -0
  153. package/src/jobs/chatter-queue-options.ts +9 -0
  154. package/src/jobs/chatter-queue-publisher.service.ts +37 -0
  155. package/src/jobs/chatter-queue-subscriber.service.ts +46 -0
  156. package/src/jobs/computed-field-evaluation-publisher.service.ts +23 -0
  157. package/src/jobs/{database/computed-field-evaluation-queue-options.ts → computed-field-evaluation-queue-options.ts} +2 -2
  158. package/src/jobs/computed-field-evaluation-subscriber.service.ts +38 -0
  159. package/src/jobs/database/{computed-field-evaluation-publisher.service.ts → computed-field-evaluation-publisher-database.service.ts} +2 -2
  160. package/src/jobs/database/computed-field-evaluation-queue-options-database.ts +9 -0
  161. package/src/jobs/database/{computed-field-evaluation-subscriber.service.ts → computed-field-evaluation-subscriber-database.service.ts} +2 -2
  162. package/src/jobs/database/generate-code-queue-options-database.ts +2 -2
  163. package/src/jobs/database/test-queue-subscriber-database.service.ts +10 -2
  164. package/src/jobs/generate-code-publisher.service.ts +23 -0
  165. package/src/jobs/generate-code-queue-options.ts +9 -0
  166. package/src/jobs/generate-code-subscriber.service.ts +59 -0
  167. package/src/jobs/test-queue-subscriber.service.ts +15 -7
  168. package/src/jobs/trigger-mcp-client-publisher.service.ts +22 -0
  169. package/src/jobs/trigger-mcp-client-queue-options.ts +9 -0
  170. package/src/jobs/trigger-mcp-client-subscriber.service.ts +104 -0
  171. package/src/jobs/twilio-sms-publisher.service.ts +23 -0
  172. package/src/jobs/twilio-sms-queue-options.ts +9 -0
  173. package/src/jobs/twilio-sms-subscriber.service.ts +32 -0
  174. package/src/repository/security-rule.repository.ts +2 -2
  175. package/src/seeders/seed-data/solid-core-metadata.json +2 -2
  176. package/src/services/authentication.service.ts +4 -4
  177. package/src/services/queues/database-publisher.service.ts +2 -2
  178. package/src/services/queues/database-subscriber.service.ts +2 -1
  179. package/src/services/queues/publisher-factory.service.ts +1 -1
  180. package/src/services/solid-introspect.service.ts +22 -0
  181. package/src/solid-core.module.ts +35 -8
  182. package/src/subscribers/audit.subscriber.ts +235 -5
  183. package/src/subscribers/computed-entity-field.subscriber.ts +7 -5
  184. package/dist/jobs/database/computed-field-evaluation-publisher.service.d.ts.map +0 -1
  185. package/dist/jobs/database/computed-field-evaluation-publisher.service.js.map +0 -1
  186. package/dist/jobs/database/computed-field-evaluation-queue-options.d.ts.map +0 -1
  187. package/dist/jobs/database/computed-field-evaluation-queue-options.js.map +0 -1
  188. package/dist/jobs/database/computed-field-evaluation-subscriber.service.d.ts.map +0 -1
  189. package/dist/jobs/database/computed-field-evaluation-subscriber.service.js.map +0 -1
@@ -98,8 +98,9 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
98
98
  // }
99
99
 
100
100
  async onModuleInit(): Promise<void> {
101
+ const defaultBroker = process.env.QUEUES_DEFAULT_BROKER || 'database';
101
102
  // we will start subscriber only if the current service role is subscriber.
102
- if (['both', 'subscriber'].includes(this.serviceRole)) {
103
+ if (['both', 'subscriber'].includes(this.serviceRole) && defaultBroker === 'database') {
103
104
 
104
105
  const options = this.options();
105
106
 
@@ -34,7 +34,7 @@ export class PublisherFactory<T> {
34
34
 
35
35
  // type safe
36
36
  const typedActualPublisher: QueuePublisher<T> = actualPublisherToUse.instance;
37
- this.logger.error(`Resolved publisher with name ${actualPublisherToUse.name}, and with options ${typedActualPublisher.options()}`);
37
+ this.logger.debug(`Resolved publisher with name ${actualPublisherToUse.name}, and with options: ${JSON.stringify(typedActualPublisher.options())}`);
38
38
 
39
39
  return typedActualPublisher.publish(message);
40
40
  }
@@ -12,6 +12,7 @@ import { IS_DASHBOARD_VARIABLE_SELECTION_PROVIDER } from 'src/decorators/dashboa
12
12
  import { IS_DASHBOARD_QUESTION_DATA_PROVIDER } from 'src/decorators/dashboard-question-data-provider.decorator';
13
13
  import { IS_MAIL_PROVIDER } from 'src/decorators/mail-provider.decorator';
14
14
  import { IS_WA_PROVIDER } from 'src/decorators/whatsapp-provider.decorator';
15
+ import { IS_ERROR_CODE_PROVIDER } from 'src/decorators/error-codes-provider.decorator';
15
16
 
16
17
  @Injectable()
17
18
  export class SolidIntrospectService implements OnApplicationBootstrap {
@@ -36,6 +37,15 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
36
37
 
37
38
  // TODO: Scan the filesystem and populate the solid metadata
38
39
 
40
+ // Register all IErrorCodeProvider implementations
41
+ const errorCodeProviders = this.discoveryService
42
+ .getProviders()
43
+ .filter((provider) => this.isErrorCodeProvider(provider));
44
+
45
+ errorCodeProviders.forEach((errorCodeProvider) => {
46
+ this.solidRegistry.registerErrorCodeProvider(errorCodeProvider);
47
+ });
48
+
39
49
  // Register all ISelectionProvider implementations
40
50
  const selectionProviders = this.discoveryService
41
51
  .getProviders()
@@ -152,6 +162,18 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
152
162
  return true;
153
163
  }
154
164
 
165
+ private isErrorCodeProvider(provider: InstanceWrapper) {
166
+ const { instance } = provider;
167
+ if (!instance) return false;
168
+
169
+ const isErrorCodeProvider = this.reflector.get<boolean>(
170
+ IS_ERROR_CODE_PROVIDER,
171
+ instance.constructor,
172
+ );
173
+
174
+ return !!isErrorCodeProvider;
175
+ }
176
+
155
177
  private isSelectionProvider(provider: InstanceWrapper) {
156
178
  const { instance } = provider;
157
179
  if (!instance) return false;
@@ -94,6 +94,10 @@ import { SmsQueuePublisher } from './jobs/sms-publisher.service';
94
94
  import { SmsQueueSubscriber } from './jobs/sms-subscriber.service';
95
95
  import { TestQueuePublisher } from './jobs/test-queue-publisher.service';
96
96
  import { TestQueueSubscriber } from './jobs/test-queue-subscriber.service';
97
+
98
+ // import { ChatterQueuePublisher } from './jobs/chatter-queue-publisher.service';
99
+ // import { ChatterQueueSubscriber } from './jobs/chatter-queue-subscriber.service';
100
+
97
101
  import { Msg91WhatsappQueuePublisher } from './jobs/msg91-whatsapp-publisher.service';
98
102
  import { Msg91WhatsappQueueSubscriber } from './jobs/msg91-whatsapp-subscriber.service';
99
103
  import { UserRegistrationListener } from './listeners/user-registration.listener';
@@ -176,8 +180,8 @@ import { ModelMetadataHelperService } from './helpers/model-metadata-helper.serv
176
180
  import { ModuleMetadataHelperService } from './helpers/module-metadata-helper.service';
177
181
  import { ApiEmailQueuePublisherDatabase } from './jobs/database/api-email-publisher-database.service';
178
182
  import { ApiEmailQueueSubscriberDatabase } from './jobs/database/api-email-subscriber-database.service';
179
- import { ComputedFieldEvaluationPublisher } from './jobs/database/computed-field-evaluation-publisher.service';
180
- import { ComputedFieldEvaluationSubscriber } from './jobs/database/computed-field-evaluation-subscriber.service';
183
+ import { ComputedFieldEvaluationPublisherDatabase } from './jobs/database/computed-field-evaluation-publisher-database.service';
184
+ import { ComputedFieldEvaluationSubscriberDatabase } from './jobs/database/computed-field-evaluation-subscriber-database.service';
181
185
  import { SmtpEmailQueuePublisherDatabase } from './jobs/database/smtp-email-publisher-database.service';
182
186
  import { SmtpEmailQueueSubscriberDatabase } from './jobs/database/smtp-email-subscriber-database.service';
183
187
  import { GenerateCodePublisherDatabase } from './jobs/database/generate-code-publisher-database.service';
@@ -288,6 +292,15 @@ import { ErrorMapperService } from './helpers/error-mapper.service';
288
292
  import { IngestCommand } from './commands/ingest.command';
289
293
  import { R2RHelperService } from './services/genai/r2r-helper.service';
290
294
  import { IngestMetadataService } from './services/genai/ingest-metadata.service';
295
+ import { ComputedFieldEvaluationPublisherRabbitmq } from './jobs/computed-field-evaluation-publisher.service';
296
+ import { ComputedFieldEvaluationSubscriberRabbitmq } from './jobs/computed-field-evaluation-subscriber.service';
297
+ import { GenerateCodePublisherRabbitmq } from './jobs/generate-code-publisher.service';
298
+ import { GenerateCodeSubscriberRabbitmq } from './jobs/generate-code-subscriber.service';
299
+ import { TriggerMcpClientPublisherRabbitmq } from './jobs/trigger-mcp-client-publisher.service';
300
+ import { TriggerMcpClientSubscriberRabbitmq } from './jobs/trigger-mcp-client-subscriber.service';
301
+ import { TwilioSmsQueuePublisherRabbitmq } from './jobs/twilio-sms-publisher.service';
302
+ import { TwilioSmsQueueSubscriberRabbitmq } from './jobs/twilio-sms-subscriber.service';
303
+ import { SolidCoreErrorCodesProvider } from './helpers/solid-core-error-codes-provider.service';
291
304
 
292
305
 
293
306
  @Global()
@@ -368,10 +381,10 @@ import { IngestMetadataService } from './services/genai/ingest-metadata.service'
368
381
  inject: [ConfigService],
369
382
  useFactory: (configService: ConfigService) => ({
370
383
  throttlers: [
371
- { name: 'short', ttl: seconds(10), limit: 10 },
372
- { name: 'login', ttl: seconds(10), limit: 5 },
373
- { name: 'burst', ttl: seconds(1), limit: 100 },
374
- { name: 'sustained', ttl: seconds(300), limit: 500 },
384
+ { name: 'short', ttl: seconds(10), limit: 10 },
385
+ { name: 'login', ttl: seconds(10), limit: 5 },
386
+ { name: 'burst', ttl: seconds(1), limit: 100 },
387
+ { name: 'sustained', ttl: seconds(300), limit: 500 },
375
388
  ],
376
389
  storage: isRedisConfigured(configService) ? new ThrottlerStorageRedisService(`redis://${configService.get<string>('REDIS_HOST')}:${configService.get<string>('REDIS_PORT')}`) : undefined,
377
390
  }),
@@ -488,12 +501,15 @@ import { IngestMetadataService } from './services/genai/ingest-metadata.service'
488
501
  PublisherFactory,
489
502
  PollerService,
490
503
  ErrorMapperService,
504
+ SolidCoreErrorCodesProvider,
491
505
 
492
506
  McpToolResponseHandlerFactory,
493
507
  SolidCreateModuleMcpToolResponseHandler,
494
508
 
495
509
  TriggerMcpClientPublisherDatabase,
496
510
  TriggerMcpClientSubscriberDatabase,
511
+ TriggerMcpClientPublisherRabbitmq,
512
+ TriggerMcpClientSubscriberRabbitmq,
497
513
 
498
514
  SmtpEmailQueuePublisherRabbitmq,
499
515
  SmtpEmailQueueSubscriberRabbitmq,
@@ -509,6 +525,8 @@ import { IngestMetadataService } from './services/genai/ingest-metadata.service'
509
525
  SmsQueueSubscriberDatabase,
510
526
  TwilioSmsQueuePublisherDatabase,
511
527
  TwilioSmsQueueSubscriberDatabase,
528
+ TwilioSmsQueuePublisherRabbitmq,
529
+ TwilioSmsQueueSubscriberRabbitmq,
512
530
  OTPQueuePublisher,
513
531
  OTPQueueSubscriber,
514
532
  OTPQueuePublisherDatabase,
@@ -543,10 +561,17 @@ import { IngestMetadataService } from './services/genai/ingest-metadata.service'
543
561
  UserRegistrationListener,
544
562
  TestQueuePublisher,
545
563
  TestQueueSubscriber,
564
+
565
+ // ChatterQueuePublisher,
566
+ // ChatterQueueSubscriber,
567
+
546
568
  TestQueuePublisherDatabase,
547
569
  TestQueueSubscriberDatabase,
548
570
  GenerateCodePublisherDatabase,
549
571
  GenerateCodeSubscriberDatabase,
572
+ GenerateCodePublisherRabbitmq,
573
+ GenerateCodeSubscriberRabbitmq,
574
+ OTPQueuePublisher,
550
575
  MqMessageQueueService,
551
576
  MqMessageService,
552
577
  ScheduledJobService,
@@ -584,8 +609,10 @@ import { IngestMetadataService } from './services/genai/ingest-metadata.service'
584
609
  SystemFieldsSeederService,
585
610
  FieldMetadataRepository,
586
611
  ComputedEntityFieldSubscriber,
587
- ComputedFieldEvaluationPublisher,
588
- ComputedFieldEvaluationSubscriber,
612
+ ComputedFieldEvaluationPublisherDatabase,
613
+ ComputedFieldEvaluationSubscriberDatabase,
614
+ ComputedFieldEvaluationPublisherRabbitmq,
615
+ ComputedFieldEvaluationSubscriberRabbitmq,
589
616
  ConcatEntityComputedFieldProvider,
590
617
  UserActivityHistoryService,
591
618
  DashboardService,
@@ -6,6 +6,12 @@ import { ChatterMessageService } from '../services/chatter-message.service';
6
6
  import { lowerFirst } from 'src/helpers/string.helper';
7
7
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
8
8
 
9
+
10
+ type DeferredCall =
11
+ | { kind: 'insert'; args: Parameters<ChatterMessageService['postAuditMessageOnInsert']> }
12
+ | { kind: 'update'; args: Parameters<ChatterMessageService['postAuditMessageOnUpdate']> }
13
+ | { kind: 'delete'; args: Parameters<ChatterMessageService['postAuditMessageOnDelete']> };
14
+
9
15
  @Injectable()
10
16
  @EventSubscriber()
11
17
  export class AuditSubscriber implements EntitySubscriberInterface {
@@ -16,11 +22,21 @@ export class AuditSubscriber implements EntitySubscriberInterface {
16
22
  private readonly chatterMessageService: ChatterMessageService,
17
23
  @InjectRepository(ModelMetadata)
18
24
  private readonly modelMetadataRepo: Repository<ModelMetadata>,
19
- private readonly modelMetadataHelperService : ModelMetadataHelperService,
25
+ private readonly modelMetadataHelperService: ModelMetadataHelperService,
20
26
  ) {
21
27
  this.dataSource.subscribers.push(this);
22
28
  }
23
29
 
30
+ // Per-transaction buffer (auto-GC when queryRunner is gone)
31
+ private perTxn = new WeakMap<any, DeferredCall[]>();
32
+
33
+ private enqueue(event: { queryRunner: any }, call: DeferredCall) {
34
+ const qr = event.queryRunner;
35
+ const arr = this.perTxn.get(qr) ?? [];
36
+ arr.push(call);
37
+ this.perTxn.set(qr, arr);
38
+ }
39
+
24
40
  private async shouldTrackAudit(entity: any, metadata: EntityMetadata): Promise<boolean> {
25
41
  const model = await this.modelMetadataRepo.findOne({
26
42
  where: {
@@ -56,19 +72,233 @@ export class AuditSubscriber implements EntitySubscriberInterface {
56
72
 
57
73
  async afterInsert(event: InsertEvent<any>) {
58
74
  if (await this.shouldTrackAudit(event.entity, event.metadata)) {
59
- await this.chatterMessageService.postAuditMessageOnInsert(event.entity, event.metadata);
75
+ // await this.chatterMessageService.postAuditMessageOnInsert(event.entity, event.metadata);
76
+ this.enqueue(event, {
77
+ kind: 'insert',
78
+ args: [event.entity, event.metadata] as Parameters<ChatterMessageService['postAuditMessageOnInsert']>,
79
+ });
60
80
  }
61
81
  }
62
82
 
63
83
  async afterUpdate(event: UpdateEvent<any>) {
64
84
  if (await this.shouldTrackAudit(event.entity, event.metadata)) {
65
- await this.chatterMessageService.postAuditMessageOnUpdate(event.entity, event.metadata, event.databaseEntity, event.updatedColumns || []);
85
+ // await this.chatterMessageService.postAuditMessageOnUpdate(event.entity, event.metadata, event.databaseEntity, event.updatedColumns || []);
86
+ this.enqueue(event, {
87
+ kind: 'update',
88
+ args: [
89
+ event.entity, // entity (after)
90
+ event.metadata,
91
+ event.databaseEntity, // entity (before)
92
+ event.updatedColumns ?? [],
93
+ ] as Parameters<ChatterMessageService['postAuditMessageOnUpdate']>,
94
+ });
66
95
  }
67
96
  }
68
97
 
69
98
  async afterRemove(event: RemoveEvent<any>) {
70
99
  if (await this.shouldTrackAudit(event.entity, event.metadata)) {
71
- await this.chatterMessageService.postAuditMessageOnDelete(event.entity, event.metadata, event.databaseEntity);
100
+ // await this.chatterMessageService.postAuditMessageOnDelete(event.entity, event.metadata, event.databaseEntity);
101
+ this.enqueue(event, {
102
+ kind: 'delete',
103
+ args: [
104
+ event.entity,
105
+ event.metadata,
106
+ event.databaseEntity,
107
+ ] as Parameters<ChatterMessageService['postAuditMessageOnDelete']>,
108
+ });
109
+ }
110
+ }
111
+
112
+ // --------- transaction lifecycle ----------
113
+ async afterTransactionCommit(event: { queryRunner: any }) {
114
+ const batch = this.perTxn.get(event.queryRunner) ?? [];
115
+ this.perTxn.delete(event.queryRunner);
116
+
117
+ // Now we’re OUTSIDE the DB transaction — safe to do I/O/DB writes inside chatter service.
118
+ for (const item of batch) {
119
+ try {
120
+ switch (item.kind) {
121
+ case 'insert': await this.chatterMessageService.postAuditMessageOnInsert(...item.args); break;
122
+ case 'update': await this.chatterMessageService.postAuditMessageOnUpdate(...item.args); break;
123
+ case 'delete': await this.chatterMessageService.postAuditMessageOnDelete(...item.args); break;
124
+ }
125
+ } catch (e) {
126
+ // Best effort: log and continue; your core txn was already committed
127
+ // Optionally: send to a generic error logger/metric here
128
+ }
72
129
  }
73
130
  }
74
- }
131
+
132
+ afterTransactionRollback(event: { queryRunner: any }) {
133
+ // Drop buffered calls; the write never happened
134
+ this.perTxn.delete(event.queryRunner);
135
+ }
136
+ }
137
+
138
+ // import { DataSource, EntityMetadata, EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
139
+ // import { Injectable } from '@nestjs/common';
140
+ // import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
141
+ // import { Repository } from 'typeorm';
142
+ // import { ModelMetadata } from '../entities/model-metadata.entity';
143
+ // import { lowerFirst } from 'src/helpers/string.helper';
144
+ // import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
145
+ // import { ChatterMessagePayload } from 'src/jobs/chatter-queue-publisher.service';
146
+ // import { RequestContextService } from 'src/services/request-context.service';
147
+ // import { PublisherFactory } from 'src/services/queues/publisher-factory.service';
148
+
149
+ // @EventSubscriber()
150
+ // @Injectable()
151
+ // export class AuditSubscriber implements EntitySubscriberInterface {
152
+ // private perTxn = new WeakMap<any, ChatterMessagePayload[]>();
153
+
154
+ // constructor(
155
+ // @InjectDataSource() private readonly dataSource: DataSource,
156
+ // @InjectRepository(ModelMetadata) private readonly modelMetadataRepo: Repository<ModelMetadata>,
157
+ // private readonly modelMetadataHelperService: ModelMetadataHelperService,
158
+ // private readonly requestContext: RequestContextService,
159
+ // private readonly publisherFactory: PublisherFactory<any>
160
+ // ) {
161
+ // this.dataSource.subscribers.push(this);
162
+ // }
163
+
164
+ // // --- small cache to avoid metadata queries on every row ---
165
+ // private modelCache = new Map<string, { enable: boolean; fields: Array<{ name: string; enableAuditTracking: boolean; type: string; relationType?: string }>; ts: number }>();
166
+ // private cacheTTLms = 60_000;
167
+
168
+ // private async shouldTrackAudit(entity: any, metadata: EntityMetadata): Promise<{ enable: boolean; auditFields?: string[] }> {
169
+ // const key = metadata.name;
170
+ // const now = Date.now();
171
+ // const cached = this.modelCache.get(key);
172
+ // if (cached && (now - cached.ts) < this.cacheTTLms) {
173
+ // if (!cached.enable) return { enable: false };
174
+ // const fields = cached.fields.filter(f =>
175
+ // f.enableAuditTracking &&
176
+ // !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(f.type) &&
177
+ // !(f.type === 'relation' && f.relationType === 'one-to-many')
178
+ // );
179
+ // const present = fields.map(f => f.name).filter(n => entity?.[n] !== undefined);
180
+ // return { enable: present.length > 0, auditFields: present };
181
+ // }
182
+
183
+ // const model = await this.modelMetadataRepo.findOne({
184
+ // where: { singularName: lowerFirst(metadata.name) },
185
+ // relations: { fields: true, module: true },
186
+ // });
187
+ // const enable = !!model?.enableAuditTracking;
188
+ // const fields = model?.fields ?? [];
189
+ // this.modelCache.set(key, { enable, fields, ts: now });
190
+
191
+ // if (!enable) return { enable: false };
192
+ // const filtered = fields.filter(f =>
193
+ // f.enableAuditTracking &&
194
+ // !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(f.type) &&
195
+ // !(f.type === 'relation' && f.relationType === 'one-to-many')
196
+ // );
197
+ // const present = filtered.map(f => f.name).filter(n => entity?.[n] !== undefined);
198
+ // return { enable: present.length > 0, auditFields: present };
199
+ // }
200
+
201
+ // private push(event: { queryRunner: any }, msg: ChatterMessagePayload) {
202
+ // const arr = this.perTxn.get(event.queryRunner) ?? [];
203
+ // arr.push(msg);
204
+ // this.perTxn.set(event.queryRunner, arr);
205
+ // }
206
+
207
+ // async afterInsert(event: InsertEvent<any>) {
208
+ // if (!event.entity) return;
209
+ // const enable = await this.shouldTrackAudit(event.entity, event.metadata);
210
+ // if (!enable) return;
211
+
212
+ // const payload: ChatterMessagePayload = {
213
+ // eventType: 'insert',
214
+ // model: event.metadata.name,
215
+ // entityId: String(event.entity.id ?? event.entity.uuid ?? ''),
216
+ // occurredAt: new Date().toISOString(),
217
+ // after: this.safeCopy(event.entity),
218
+ // userId: this.getUserId(),
219
+ // };
220
+ // this.push(event, payload);
221
+ // }
222
+
223
+ // async afterUpdate(event: UpdateEvent<any>) {
224
+ // // Updated entity may be null if you used raw query; fall back to databaseEntity
225
+ // const current = event.entity ?? {};
226
+ // const before = event.databaseEntity ?? {};
227
+ // const { enable, auditFields } = await this.shouldTrackAudit(current, event.metadata);
228
+ // if (!enable) return;
229
+
230
+ // const changedCols = (event.updatedColumns || []).map(c => c.propertyName);
231
+ // const payload: ChatterMessagePayload = {
232
+ // eventType: 'update',
233
+ // model: event.metadata.name,
234
+ // entityId: String((current as any).id ?? (before as any).id ?? ''),
235
+ // occurredAt: new Date().toISOString(),
236
+ // before: this.pick(before, auditFields || changedCols),
237
+ // after: this.pick(current, auditFields || changedCols),
238
+ // diff: changedCols,
239
+ // userId: this.getUserId(),
240
+ // };
241
+ // this.push(event, payload);
242
+ // }
243
+
244
+ // async afterRemove(event: RemoveEvent<any>) {
245
+ // const base = event.entity ?? event.databaseEntity;
246
+ // if (!base) return;
247
+
248
+ // const { enable } = await this.shouldTrackAudit(base, event.metadata);
249
+ // if (!enable) return;
250
+
251
+ // const payload: ChatterMessagePayload = {
252
+ // eventType: 'delete',
253
+ // model: event.metadata.name,
254
+ // entityId: String((base as any).id ?? ''),
255
+ // occurredAt: new Date().toISOString(),
256
+ // before: this.safeCopy(base),
257
+ // userId: this.getUserId(),
258
+ // };
259
+ // this.push(event, payload);
260
+ // }
261
+
262
+ // // Publish AFTER the transaction commits -> no idle-in-transaction
263
+ // async afterTransactionCommit(event: { queryRunner: any }) {
264
+ // const batch = this.perTxn.get(event.queryRunner) ?? [];
265
+ // this.perTxn.delete(event.queryRunner);
266
+ // for (const msg of batch) {
267
+ // try {
268
+ // await this.publisherFactory.publish({ payload: msg, parentEntity: msg.model, parentEntityId: msg.entityId }, 'ChatterQueuePublisher');
269
+ // } catch (err) {
270
+ // // log + optionally send to a DLQ or retry queue
271
+ // // do NOT throw; commit already happened
272
+ // // your RabbitMqPublisher likely tracks failures in MqMessage tables anyway
273
+ // }
274
+ // }
275
+ // }
276
+
277
+ // afterTransactionRollback(event: { queryRunner: any }) {
278
+ // this.perTxn.delete(event.queryRunner);
279
+ // }
280
+
281
+ // // --- small helpers to keep payloads JSON-safe and small ---
282
+ // private safeCopy(obj: any) {
283
+ // try {
284
+ // return JSON.parse(JSON.stringify(obj));
285
+ // } catch {
286
+ // return {}; // strip circular refs
287
+ // }
288
+ // }
289
+
290
+ // private pick(obj: any, keys: string[]) {
291
+ // const out: any = {};
292
+ // for (const k of keys) out[k] = obj?.[k];
293
+ // return this.safeCopy(out);
294
+ // }
295
+
296
+ // private getUserId(): string | null {
297
+
298
+ // const activeUser = this.requestContext.getActiveUser();
299
+ // if (activeUser?.sub)
300
+ // return String(activeUser.sub);
301
+ // }
302
+
303
+
304
+ // }
@@ -4,7 +4,7 @@ import { InjectDataSource } from "@nestjs/typeorm";
4
4
  import { ComputedFieldTriggerOperation } from "src/dtos/create-field-metadata.dto";
5
5
  import { ComputedFieldMetadata, SolidRegistry } from "src/helpers/solid-registry";
6
6
  import { IEntityPreComputeFieldProvider } from "src/interfaces";
7
- import { ComputedFieldEvaluationPublisher } from "src/jobs/database/computed-field-evaluation-publisher.service";
7
+ import { PublisherFactory } from "src/services/queues/publisher-factory.service";
8
8
  import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from "typeorm";
9
9
 
10
10
  // Create an interface i.e ComputedFieldEvaluationPayload which has same fields as the ComputedFieldMetadata and an additional field for the database entity
@@ -20,7 +20,8 @@ export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface
20
20
  @InjectDataSource()
21
21
  private readonly dataSource: DataSource,
22
22
  private readonly solidRegistry: SolidRegistry,
23
- private readonly computedFieldPublisher: ComputedFieldEvaluationPublisher,
23
+ private readonly publisherFactory: PublisherFactory<ComputedFieldEvaluationPayload>
24
+ // private readonly computedFieldPublisher: ComputedFieldEvaluationPublisherDatabase,
24
25
  ) {
25
26
  this.dataSource.subscribers.push(this);
26
27
  }
@@ -112,9 +113,10 @@ export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface
112
113
  ...computedField,
113
114
  databaseEntity,
114
115
  };
115
- this.computedFieldPublisher.publish({
116
- payload
117
- });
116
+ this.publisherFactory.publish({payload}, 'ComputedFieldEvaluationPublisher')
117
+ // this.computedFieldPublisher.publish({
118
+ // payload
119
+ // });
118
120
  }
119
121
 
120
122
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"computed-field-evaluation-publisher.service.d.ts","sourceRoot":"","sources":["../../../src/jobs/database/computed-field-evaluation-publisher.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,kDAAkD,CAAC;AAGlG,qBACa,gCAAiC,SAAQ,iBAAiB,CAAC,8BAA8B,CAAC;IAE/F,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IACrD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;gBAD5C,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB;IAKnE,OAAO,IAAI,mBAAmB;CAKjC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"computed-field-evaluation-publisher.service.js","sourceRoot":"","sources":["../../../src/jobs/database/computed-field-evaluation-publisher.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAE5C,sFAA8E;AAC9E,0EAAmE;AACnE,iGAAmF;AAEnF,wHAA4F;AAGrF,IAAM,gCAAgC,GAAtC,MAAM,gCAAiC,SAAQ,8CAAiD;IACnG,YACuB,gBAAkC,EAClC,qBAA4C;QAE/D,KAAK,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;QAH5B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,0BAAqB,GAArB,qBAAqB,CAAuB;IAGnE,CAAC;IAED,OAAO;QACH,OAAO;YACH,GAAG,iDAAmC;SACzC,CAAC;IACN,CAAC;CACJ,CAAA;AAbY,4EAAgC;2CAAhC,gCAAgC;IAD5C,IAAA,mBAAU,GAAE;qCAGgC,qCAAgB;QACX,gDAAqB;GAH1D,gCAAgC,CAa5C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { QueuesModuleOptions } from \"src/interfaces\";\nimport { MqMessageQueueService } from \"src/services/mq-message-queue.service\";\nimport { MqMessageService } from \"src/services/mq-message.service\";\nimport { DatabasePublisher } from \"src/services/queues/database-publisher.service\";\nimport { ComputedFieldEvaluationPayload } from \"src/subscribers/computed-entity-field.subscriber\";\nimport computedFieldEvaluationQueueOptions from \"./computed-field-evaluation-queue-options\";\n\n@Injectable()\nexport class ComputedFieldEvaluationPublisher extends DatabasePublisher<ComputedFieldEvaluationPayload> {\n constructor(\n protected readonly mqMessageService: MqMessageService,\n protected readonly mqMessageQueueService: MqMessageQueueService,\n ) {\n super(mqMessageService, mqMessageQueueService);\n }\n\n options(): QueuesModuleOptions {\n return {\n ...computedFieldEvaluationQueueOptions\n };\n }\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"computed-field-evaluation-queue-options.d.ts","sourceRoot":"","sources":["../../../src/jobs/database/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;;;;;;AAI9C,wBAIE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"computed-field-evaluation-queue-options.js","sourceRoot":"","sources":["../../../src/jobs/database/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":";;AAAA,iDAA8C;AAE9C,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAErD,kBAAe;IACX,IAAI,EAAE,8BAA8B;IACpC,IAAI,EAAE,uBAAU,CAAC,QAAQ;IACzB,SAAS,EAAE,UAAU;CACxB,CAAC","sourcesContent":["import { BrokerType } from \"../../interfaces\";\n\nconst QUEUE_NAME = 'computed_field_evaluation_queue';\n\nexport default {\n name: 'computedFieldEvaluationQueue',\n type: BrokerType.Database,\n queueName: QUEUE_NAME,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"computed-field-evaluation-subscriber.service.d.ts","sourceRoot":"","sources":["../../../src/jobs/database/computed-field-evaluation-subscriber.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAiE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,8BAA8B,EAAE,MAAM,kDAAkD,CAAC;AAElG,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qBACa,iCAAkC,SAAQ,kBAAkB,CAAC,8BAA8B,CAAC;IAEjG,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,MAAM,EAAE,aAAa;gBAHrB,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,aAAa;IAKlC,OAAO,IAAI,mBAAmB;IAQxB,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,8BAA8B,CAAC;CAOxE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"computed-field-evaluation-subscriber.service.js","sourceRoot":"","sources":["../../../src/jobs/database/computed-field-evaluation-subscriber.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,iEAA2D;AAG3D,sFAA8E;AAC9E,0EAAmE;AACnE,mGAAqF;AAErF,wHAA4F;AAC5F,kEAA4D;AAGrD,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,gDAAkD;IACrG,YACa,gBAAkC,EAClC,qBAA4C,EAC5C,aAA4B,EAC5B,MAAqB;QAE9B,KAAK,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAL9C,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,kBAAa,GAAb,aAAa,CAAe;QAC5B,WAAM,GAAN,MAAM,CAAe;IAGlC,CAAC;IAED,OAAO;QACH,OAAO;YACH,GAAG,iDAAmC;SACzC,CAAA;IACL,CAAC;IAID,KAAK,CAAC,SAAS,CAAC,OAAqD;QACjE,MAAM,EAAE,cAAc,EAAE,GAAG,qBAAqB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;QAEnH,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAqD,CAAC;QACxF,MAAM,gBAAgB,CAAC,uBAAuB,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IAC1F,CAAC;CACJ,CAAA;AAzBY,8EAAiC;4CAAjC,iCAAiC;IAD7C,IAAA,mBAAU,GAAE;qCAGsB,qCAAgB;QACX,gDAAqB;QAC7B,8BAAa;QACpB,8BAAa;GALzB,iCAAiC,CAyB7C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IEntityPostComputeFieldProvider, IEntityComputedFieldProvider, QueuesModuleOptions } from \"src/interfaces\";\nimport { QueueMessage } from \"src/interfaces/mq\";\nimport { MqMessageQueueService } from \"src/services/mq-message-queue.service\";\nimport { MqMessageService } from \"src/services/mq-message.service\";\nimport { DatabaseSubscriber } from \"src/services/queues/database-subscriber.service\";\nimport { ComputedFieldEvaluationPayload } from \"src/subscribers/computed-entity-field.subscriber\";\nimport computedFieldEvaluationQueueOptions from \"./computed-field-evaluation-queue-options\";\nimport { PollerService } from \"src/services/poller.service\";\n\n@Injectable()\nexport class ComputedFieldEvaluationSubscriber extends DatabaseSubscriber<ComputedFieldEvaluationPayload> {\n constructor(\n readonly mqMessageService: MqMessageService,\n readonly mqMessageQueueService: MqMessageQueueService,\n readonly solidRegistry: SolidRegistry,\n readonly poller: PollerService,\n ) {\n super(mqMessageService, mqMessageQueueService, poller);\n }\n\n options(): QueuesModuleOptions {\n return {\n ...computedFieldEvaluationQueueOptions\n }\n }\n\n // This method will use the ComputedFieldEvaluationPayload to evaluate the computed fields\n // It will then call the corresponding provider computeAndSave method to perform the evaluation\n async subscribe(message: QueueMessage<ComputedFieldEvaluationPayload>) {\n const { databaseEntity, ...computedFieldMetadata } = message.payload;\n const provider = this.solidRegistry.getComputedFieldProvider(computedFieldMetadata.computedFieldValueProviderName);\n // Get the instance of the provider and assert it is of type IEntityComputedFieldProvider\n const providerInstance = provider.instance as IEntityPostComputeFieldProvider<any, any>; // IEntityComputedFieldProvider\n await providerInstance.postComputeAndSaveValue(databaseEntity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue\n }\n}"]}