@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
@@ -0,0 +1,37 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
4
+ import chatterQueueOptions from './chatter-queue-options';
5
+ import { MqMessageQueueService } from '../services/mq-message-queue.service';
6
+ import { MqMessageService } from '../services/mq-message.service';
7
+ import { QueuesModuleOptions } from "../interfaces";
8
+
9
+
10
+ export type ChatterEventType = 'insert' | 'update' | 'delete';
11
+
12
+ export interface ChatterMessagePayload {
13
+ eventType: ChatterEventType;
14
+ model: string; // entity name
15
+ entityId: string; // id string
16
+ occurredAt: string; // ISO
17
+ before?: any;
18
+ after?: any;
19
+ diff?: string[]; // changed column names for updates
20
+ userId?: string | null;
21
+ }
22
+
23
+ @Injectable()
24
+ export class ChatterQueuePublisher extends RabbitMqPublisher<any> {
25
+ constructor(
26
+ protected readonly mqMessageService: MqMessageService,
27
+ protected readonly mqMessageQueueService: MqMessageQueueService,
28
+ ) {
29
+ super(mqMessageService, mqMessageQueueService);
30
+ }
31
+
32
+ options(): QueuesModuleOptions {
33
+ return {
34
+ ...chatterQueueOptions
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,46 @@
1
+ import { Injectable, Logger } from '@nestjs/common';
2
+
3
+ import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
4
+ import { QueueMessage } from 'src/interfaces/mq';
5
+ import { MqMessageService } from '../services/mq-message.service';
6
+ import { MqMessageQueueService } from '../services/mq-message-queue.service';
7
+ import { QueuesModuleOptions } from "../interfaces";
8
+ import chatterQueueOptions from './chatter-queue-options';
9
+ import { ChatterMessagePayload } from './chatter-queue-publisher.service';
10
+ import { ChatterMessageService } from 'src/services/chatter-message.service';
11
+
12
+ @Injectable()
13
+ export class ChatterQueueSubscriber extends RabbitMqSubscriber<any> {
14
+ private readonly chatterQueueLogger = new Logger(ChatterQueueSubscriber.name);
15
+
16
+ constructor(
17
+ readonly mqMessageService: MqMessageService,
18
+ readonly mqMessageQueueService: MqMessageQueueService,
19
+ private readonly chatterMessageService: ChatterMessageService,
20
+ ) {
21
+ super(mqMessageService, mqMessageQueueService);
22
+ }
23
+
24
+ options(): QueuesModuleOptions {
25
+ return {
26
+ ...chatterQueueOptions
27
+ }
28
+ }
29
+
30
+ async subscribe(message: QueueMessage<ChatterMessagePayload>) {
31
+ const p = message.payload;
32
+ this.chatterQueueLogger.debug(`Audit event ${p.eventType} ${p.model}#${p.entityId}`);
33
+
34
+ switch (p.eventType) {
35
+ case 'insert':
36
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, { name: p.model } as any);
37
+ break;
38
+ case 'update':
39
+ await this.chatterMessageService.postAuditMessageOnUpdate(p.after, { name: p.model } as any, p.before, (p.diff || []).map(n => ({ propertyName: n })));
40
+ break;
41
+ case 'delete':
42
+ await this.chatterMessageService.postAuditMessageOnDelete(p.before, { name: p.model } as any, p.before);
43
+ break;
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,23 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { QueuesModuleOptions } from "src/interfaces";
3
+ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
4
+ import { MqMessageService } from "src/services/mq-message.service";
5
+ import { RabbitMqPublisher } from "src/services/queues/rabbitmq-publisher.service";
6
+ import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
7
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
8
+
9
+ @Injectable()
10
+ export class ComputedFieldEvaluationPublisherRabbitmq extends RabbitMqPublisher<ComputedFieldEvaluationPayload> {
11
+ constructor(
12
+ protected readonly mqMessageService: MqMessageService,
13
+ protected readonly mqMessageQueueService: MqMessageQueueService,
14
+ ) {
15
+ super(mqMessageService, mqMessageQueueService);
16
+ }
17
+
18
+ options(): QueuesModuleOptions {
19
+ return {
20
+ ...computedFieldEvaluationQueueOptions
21
+ };
22
+ }
23
+ }
@@ -1,9 +1,9 @@
1
- import { BrokerType } from "../../interfaces";
1
+ import { BrokerType } from "../interfaces";
2
2
 
3
3
  const QUEUE_NAME = 'computed_field_evaluation_queue';
4
4
 
5
5
  export default {
6
6
  name: 'computedFieldEvaluationQueue',
7
- type: BrokerType.Database,
7
+ type: BrokerType.RabbitMQ,
8
8
  queueName: QUEUE_NAME,
9
9
  };
@@ -0,0 +1,38 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { SolidRegistry } from "src/helpers/solid-registry";
3
+ import { IEntityPostComputeFieldProvider, QueuesModuleOptions } from "src/interfaces";
4
+ import { QueueMessage } from "src/interfaces/mq";
5
+ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
6
+ import { MqMessageService } from "src/services/mq-message.service";
7
+ import { PollerService } from "src/services/poller.service";
8
+ import { RabbitMqSubscriber } from "src/services/queues/rabbitmq-subscriber.service";
9
+ import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
10
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
11
+
12
+ @Injectable()
13
+ export class ComputedFieldEvaluationSubscriberRabbitmq extends RabbitMqSubscriber<ComputedFieldEvaluationPayload> {
14
+ constructor(
15
+ readonly mqMessageService: MqMessageService,
16
+ readonly mqMessageQueueService: MqMessageQueueService,
17
+ readonly solidRegistry: SolidRegistry,
18
+ readonly poller: PollerService,
19
+ ) {
20
+ super(mqMessageService, mqMessageQueueService);
21
+ }
22
+
23
+ options(): QueuesModuleOptions {
24
+ return {
25
+ ...computedFieldEvaluationQueueOptions
26
+ }
27
+ }
28
+
29
+ // This method will use the ComputedFieldEvaluationPayload to evaluate the computed fields
30
+ // It will then call the corresponding provider computeAndSave method to perform the evaluation
31
+ async subscribe(message: QueueMessage<ComputedFieldEvaluationPayload>) {
32
+ const { databaseEntity, ...computedFieldMetadata } = message.payload;
33
+ const provider = this.solidRegistry.getComputedFieldProvider(computedFieldMetadata.computedFieldValueProviderName);
34
+ // Get the instance of the provider and assert it is of type IEntityComputedFieldProvider
35
+ const providerInstance = provider.instance as IEntityPostComputeFieldProvider<any, any>; // IEntityComputedFieldProvider
36
+ await providerInstance.postComputeAndSaveValue(databaseEntity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue
37
+ }
38
+ }
@@ -4,10 +4,10 @@ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
4
4
  import { MqMessageService } from "src/services/mq-message.service";
5
5
  import { DatabasePublisher } from "src/services/queues/database-publisher.service";
6
6
  import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
7
- import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
7
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options-database";
8
8
 
9
9
  @Injectable()
10
- export class ComputedFieldEvaluationPublisher extends DatabasePublisher<ComputedFieldEvaluationPayload> {
10
+ export class ComputedFieldEvaluationPublisherDatabase extends DatabasePublisher<ComputedFieldEvaluationPayload> {
11
11
  constructor(
12
12
  protected readonly mqMessageService: MqMessageService,
13
13
  protected readonly mqMessageQueueService: MqMessageQueueService,
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "../../interfaces";
2
+
3
+ const QUEUE_NAME = 'computed_field_evaluation_queue_database';
4
+
5
+ export default {
6
+ name: 'computedFieldEvaluationQueueDatabase',
7
+ type: BrokerType.Database,
8
+ queueName: QUEUE_NAME,
9
+ };
@@ -6,11 +6,11 @@ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
6
6
  import { MqMessageService } from "src/services/mq-message.service";
7
7
  import { DatabaseSubscriber } from "src/services/queues/database-subscriber.service";
8
8
  import { ComputedFieldEvaluationPayload } from "src/subscribers/computed-entity-field.subscriber";
9
- import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options";
9
+ import computedFieldEvaluationQueueOptions from "./computed-field-evaluation-queue-options-database";
10
10
  import { PollerService } from "src/services/poller.service";
11
11
 
12
12
  @Injectable()
13
- export class ComputedFieldEvaluationSubscriber extends DatabaseSubscriber<ComputedFieldEvaluationPayload> {
13
+ export class ComputedFieldEvaluationSubscriberDatabase extends DatabaseSubscriber<ComputedFieldEvaluationPayload> {
14
14
  constructor(
15
15
  readonly mqMessageService: MqMessageService,
16
16
  readonly mqMessageQueueService: MqMessageQueueService,
@@ -1,9 +1,9 @@
1
1
  import { BrokerType } from "../../interfaces";
2
2
 
3
- const QUEUE_NAME = 'generate_code_queue';
3
+ const QUEUE_NAME = 'generate_code_queue_database';
4
4
 
5
5
  export default {
6
- name: 'generateCodeQueue',
6
+ name: 'generateCodeQueueDatabase',
7
7
  type: BrokerType.Database,
8
8
  queueName: QUEUE_NAME,
9
9
  };
@@ -29,12 +29,20 @@ export class TestQueueSubscriberDatabase extends DatabaseSubscriber<any> {
29
29
  // console.log(`Received message ${JSON.stringify(message)}`);
30
30
  this.testQueueLogger.debug(`Received message: ${JSON.stringify(message)}`);
31
31
 
32
+ let timeoutSecondsParsed = 10;
33
+ const timeoutSeconds = message?.payload?.timeoutSeconds;
34
+ if (timeoutSeconds) {
35
+ timeoutSecondsParsed = +timeoutSeconds;
36
+ }
37
+
38
+ this.testQueueLogger.debug(`Processing message with timeout: ${timeoutSecondsParsed}`);
39
+
40
+ // Simulate some processing time
32
41
  return new Promise((resolve, reject) => {
33
- // Simulate some processing time
34
42
  setTimeout(() => {
35
43
  this.testQueueLogger.debug(`Processed message: ${JSON.stringify(message)}`);
36
44
  resolve({ status: 'success', messageId: message.messageId, message: `Processed message` });
37
- }, 10000); // Simulate 1 second processing time
45
+ }, timeoutSecondsParsed * 1000);
38
46
  });
39
47
  }
40
48
  }
@@ -0,0 +1,23 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
4
+ import { CodeGenerationOptions, QueuesModuleOptions } from "../interfaces";
5
+ import { MqMessageQueueService } from '../services/mq-message-queue.service';
6
+ import { MqMessageService } from '../services/mq-message.service';
7
+ import generateCodeQueueOptions from './generate-code-queue-options';
8
+
9
+ @Injectable()
10
+ export class GenerateCodePublisherRabbitmq extends RabbitMqPublisher<CodeGenerationOptions> {
11
+ constructor(
12
+ protected readonly mqMessageService: MqMessageService,
13
+ protected readonly mqMessageQueueService: MqMessageQueueService,
14
+ ) {
15
+ super(mqMessageService, mqMessageQueueService);
16
+ }
17
+
18
+ options(): QueuesModuleOptions {
19
+ return {
20
+ ...generateCodeQueueOptions
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "../interfaces";
2
+
3
+ const QUEUE_NAME = 'generate_code_queue_rabbitmq';
4
+
5
+ export default {
6
+ name: 'generateCodeQueueRabbitmq',
7
+ type: BrokerType.RabbitMQ,
8
+ queueName: QUEUE_NAME,
9
+ };
@@ -0,0 +1,59 @@
1
+ import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
+
3
+ import { QueueMessage } from 'src/interfaces/mq';
4
+ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';
5
+ import { SolidFieldType } from 'src/dtos/create-field-metadata.dto';
6
+ import { ModelMetadataService } from 'src/services/model-metadata.service';
7
+ import { PollerService } from 'src/services/poller.service';
8
+ import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
9
+ import { CodeGenerationOptions, QueuesModuleOptions } from 'src/interfaces';
10
+ import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
11
+ import { MqMessageService } from 'src/services/mq-message.service';
12
+ import generateCodeQueueOptions from './generate-code-queue-options';
13
+
14
+ @Injectable()
15
+ export class GenerateCodeSubscriberRabbitmq extends RabbitMqSubscriber<CodeGenerationOptions> {
16
+ private readonly generateCodeSubscriberLogger = new Logger(GenerateCodeSubscriberRabbitmq.name);
17
+
18
+ constructor(
19
+ readonly mqMessageService: MqMessageService,
20
+ readonly mqMessageQueueService: MqMessageQueueService,
21
+ readonly poller: PollerService,
22
+ @Inject(forwardRef(() => ModelMetadataService))
23
+ readonly modelMetadataService: ModelMetadataService,
24
+ ) {
25
+ super(mqMessageService, mqMessageQueueService);
26
+ }
27
+
28
+ options(): QueuesModuleOptions {
29
+ return {
30
+ ...generateCodeQueueOptions
31
+ }
32
+ }
33
+
34
+ async subscribe(message: QueueMessage<CodeGenerationOptions>) {
35
+ this.generateCodeSubscriberLogger.debug(`Received message: ${JSON.stringify(message)}`);
36
+
37
+ const codeGnerationOptions = message.payload;
38
+
39
+ const { model, removeFieldCodeOuput, refreshModelCodeOutput } = await this.modelMetadataService.generateCode(codeGnerationOptions);
40
+
41
+ // Generate the code for models which are linked to fields having an inverse relation
42
+ const coModelSingularNames = model.fields.
43
+ filter(field => field.type === SolidFieldType.relation && field.relationCreateInverse === true)
44
+ .map(field => field.relationCoModelSingularName);
45
+
46
+ for (const singularName of coModelSingularNames) {
47
+ const coModel = await this.modelMetadataService.findOneBySingularName(singularName);
48
+ const inverseOptions: CodeGenerationOptions = {
49
+ modelId: coModel.id,
50
+ dryRun: codeGnerationOptions.dryRun
51
+ };
52
+ await this.modelMetadataService.generateCode(inverseOptions);
53
+ }
54
+
55
+ await this.modelMetadataService.generateVAMConfig(model.id);
56
+
57
+ return `${removeFieldCodeOuput} \n ${refreshModelCodeOutput}`;
58
+ }
59
+ }
@@ -27,12 +27,20 @@ export class TestQueueSubscriber extends RabbitMqSubscriber<any> {
27
27
  // console.log(`Received message ${JSON.stringify(message)}`);
28
28
  this.testQueueLogger.debug(`Received message: ${JSON.stringify(message)}`);
29
29
 
30
- return new Promise((resolve, reject) => {
31
- // Simulate some processing time
32
- setTimeout(() => {
33
- this.testQueueLogger.debug(`Processed message: ${JSON.stringify(message)}`);
34
- resolve({ status: 'success', messageId: message.messageId, message: `Processed message` });
35
- }, 10000); // Simulate 1 second processing time
36
- });
30
+ let timeoutSecondsParsed = 10;
31
+ const timeoutSeconds = message?.payload?.timeoutSeconds;
32
+ if (timeoutSeconds) {
33
+ timeoutSecondsParsed = +timeoutSeconds;
34
+ }
35
+
36
+ this.testQueueLogger.debug(`Processing message with timeout: ${timeoutSecondsParsed}`);
37
+
38
+ // Simulate some processing time
39
+ setTimeout(() => {
40
+ this.testQueueLogger.debug(`Processed message: ${JSON.stringify(message)}`);
41
+ // resolve({ status: 'success', messageId: message.messageId, message: `Processed message` });
42
+ }, timeoutSecondsParsed * 1000);
43
+
44
+ // return new Promise((resolve, reject) => {});
37
45
  }
38
46
  }
@@ -0,0 +1,22 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { QueuesModuleOptions, TriggerMcpClientOptions } from "src/interfaces";
3
+ import { MqMessageQueueService } from "src/services/mq-message-queue.service";
4
+ import { MqMessageService } from "src/services/mq-message.service";
5
+ import { RabbitMqPublisher } from "src/services/queues/rabbitmq-publisher.service";
6
+ import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
7
+
8
+ @Injectable()
9
+ export class TriggerMcpClientPublisherRabbitmq extends RabbitMqPublisher<TriggerMcpClientOptions> {
10
+ constructor(
11
+ protected readonly mqMessageService: MqMessageService,
12
+ protected readonly mqMessageQueueService: MqMessageQueueService,
13
+ ) {
14
+ super(mqMessageService, mqMessageQueueService);
15
+ }
16
+
17
+ options(): QueuesModuleOptions {
18
+ return {
19
+ ...triggerMcpClientQueueOptions
20
+ };
21
+ }
22
+ }
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "src/interfaces";
2
+
3
+ const TRIGGER_MCP_CLIENT_QUEUE_NAME = 'trigger_mcp_client_queue_rabbitmq';
4
+
5
+ export default {
6
+ name: 'triggerMcpClientQueueRabbitmq',
7
+ type: BrokerType.RabbitMQ,
8
+ queueName: TRIGGER_MCP_CLIENT_QUEUE_NAME,
9
+ };
@@ -0,0 +1,104 @@
1
+ import { Injectable, Logger } from '@nestjs/common';
2
+
3
+ import { QueueMessage } from 'src/interfaces/mq';
4
+ import triggerMcpClientQueueOptions from "./trigger-mcp-client-queue-options";
5
+ import { AiInteractionService } from 'src/services/ai-interaction.service';
6
+ import { PollerService } from 'src/services/poller.service';
7
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
8
+ import { TriggerMcpClientOptions, QueuesModuleOptions } from 'src/interfaces';
9
+ import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
10
+ import { MqMessageService } from 'src/services/mq-message.service';
11
+
12
+ @Injectable()
13
+ export class TriggerMcpClientSubscriberRabbitmq extends RabbitMqPublisher<TriggerMcpClientOptions> {
14
+ private readonly triggerMcpClientSubscriberLogger = new Logger(TriggerMcpClientSubscriberRabbitmq.name);
15
+
16
+ constructor(
17
+ readonly mqMessageService: MqMessageService,
18
+ readonly mqMessageQueueService: MqMessageQueueService,
19
+ readonly poller: PollerService,
20
+ readonly aiInteractionService: AiInteractionService,
21
+ ) {
22
+ super(mqMessageService, mqMessageQueueService);
23
+ }
24
+
25
+ options(): QueuesModuleOptions {
26
+ return {
27
+ ...triggerMcpClientQueueOptions
28
+ }
29
+ }
30
+
31
+ async subscribe(message: QueueMessage<TriggerMcpClientOptions>) {
32
+ this.triggerMcpClientSubscriberLogger.debug(`Received message: ${JSON.stringify(message)}`);
33
+
34
+ const codeGnerationOptions = message.payload;
35
+
36
+ const aiInteraction = await this.aiInteractionService.findOne(codeGnerationOptions.aiInteractionId, {
37
+ populate: ['user']
38
+ });
39
+ if (!aiInteraction) {
40
+ const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${codeGnerationOptions.aiInteractionId}`
41
+ this.triggerMcpClientSubscriberLogger.log(m);
42
+ throw new Error(m);
43
+ }
44
+
45
+ // The message contains the users prompt.
46
+ const prompt = aiInteraction.message;
47
+
48
+ // Use this to invoke our mcp client
49
+ // TODO: try / catch ...
50
+ // Handle the rejection gracefully...
51
+ const aiResponse = await this.aiInteractionService.runMcpPrompt(prompt);
52
+ this.triggerMcpClientSubscriberLogger.log(`aiResponse: `);
53
+ this.triggerMcpClientSubscriberLogger.log(JSON.stringify(aiResponse));
54
+
55
+ if (!aiResponse.success) {
56
+ this.triggerMcpClientSubscriberLogger.log(`Gen ai has returned with a false status code`);
57
+
58
+ const errorsStr = aiResponse.errors.join('; ');
59
+
60
+ await this.aiInteractionService.create({
61
+ userId: aiInteraction.user.id,
62
+ threadId: aiInteraction.threadId,
63
+ parentInteractionId: aiInteraction.id,
64
+ role: 'gen-ai',
65
+ message: '-',
66
+ contentType: aiResponse.content_type,
67
+ errorMessage: errorsStr,
68
+ modelUsed: aiResponse.model,
69
+ responseTimeMs: aiResponse.duration_ms,
70
+ metadata: JSON.stringify(aiResponse),
71
+ isApplied: aiInteraction.isApplied,
72
+ status: aiResponse.success ? 'succeeded' : 'failed'
73
+ });
74
+
75
+ // update the job entry with failure... raising an error will lead the job to be marked as failed...
76
+ throw new Error(errorsStr);
77
+ }
78
+ else {
79
+ let nestedResponse = aiResponse.response.trim();
80
+
81
+ const genAiInteraction = await this.aiInteractionService.create({
82
+ userId: aiInteraction.user.id,
83
+ threadId: aiInteraction.threadId,
84
+ parentInteractionId: aiInteraction.id,
85
+ role: 'gen-ai',
86
+ message: nestedResponse,
87
+ contentType: aiResponse.content_type,
88
+ errorMessage: '',
89
+ modelUsed: aiResponse.model,
90
+ responseTimeMs: aiResponse.duration_ms,
91
+ metadata: JSON.stringify(aiResponse),
92
+ isApplied: aiInteraction.isApplied,
93
+ status: aiResponse.success ? 'succeeded' : 'failed'
94
+ });
95
+
96
+ // If the human interaction was with isAutoApply=true, then we can go ahead and autoApply.
97
+ if (aiInteraction.isAutoApply) {
98
+ this.aiInteractionService.applySolidAiInteraction(genAiInteraction.id);
99
+ }
100
+ }
101
+
102
+ return aiResponse;
103
+ }
104
+ }
@@ -0,0 +1,23 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { QueuesModuleOptions } from 'src/interfaces';
4
+ import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
5
+ import { MqMessageService } from 'src/services/mq-message.service';
6
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
7
+ import smsQueueOptions from './twilio-sms-queue-options';
8
+
9
+ @Injectable()
10
+ export class TwilioSmsQueuePublisherRabbitmq extends RabbitMqPublisher<any> {
11
+ constructor(
12
+ protected readonly mqMessageService: MqMessageService,
13
+ protected readonly mqMessageQueueService: MqMessageQueueService,
14
+ ) {
15
+ super(mqMessageService, mqMessageQueueService);
16
+ }
17
+
18
+ options(): QueuesModuleOptions {
19
+ return {
20
+ ...smsQueueOptions
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,9 @@
1
+ import { BrokerType } from "src/interfaces";
2
+
3
+ const SMS_QUEUE_NAME = 'twilio_sms_queue_rabbitmq';
4
+
5
+ export default {
6
+ name: 'twilioSmsInstanceRabbitmq',
7
+ type: BrokerType.RabbitMQ,
8
+ queueName: SMS_QUEUE_NAME,
9
+ };
@@ -0,0 +1,32 @@
1
+ import { Injectable } from '@nestjs/common';
2
+
3
+ import { QueuesModuleOptions } from 'src/interfaces';
4
+ import { QueueMessage } from 'src/interfaces/mq';
5
+ import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
6
+ import { MqMessageService } from 'src/services/mq-message.service';
7
+ import { PollerService } from 'src/services/poller.service';
8
+ import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
9
+ import { TwilioSMSService } from 'src/services/sms/TwilioSMSService';
10
+ import smsQueueOptions from './twilio-sms-queue-options';
11
+
12
+ @Injectable()
13
+ export class TwilioSmsQueueSubscriberRabbitmq extends RabbitMqPublisher<any> {
14
+ constructor(
15
+ private readonly smsService: TwilioSMSService,
16
+ readonly mqMessageService: MqMessageService,
17
+ readonly mqMessageQueueService: MqMessageQueueService,
18
+ readonly poller: PollerService,
19
+ ) {
20
+ super(mqMessageService, mqMessageQueueService);
21
+ }
22
+
23
+ options(): QueuesModuleOptions {
24
+ return {
25
+ ...smsQueueOptions
26
+ }
27
+ }
28
+
29
+ subscribe(message: QueueMessage<any>) {
30
+ return this.smsService.sendSMSSynchronously(message);
31
+ }
32
+ }
@@ -91,7 +91,7 @@ export class SecurityRuleRepository extends Repository<SecurityRule> {
91
91
  async upsertWithDto(createDto: CreateSecurityRuleDto) {
92
92
  // Populate the role from roleId or roleUserKey
93
93
  const roleRepository = this.dataSource.getRepository(RoleMetadata);
94
- if (!createDto.roleId) {
94
+ if (createDto.roleId) {
95
95
  const role = await roleRepository.findOne({
96
96
  where: {
97
97
  id: createDto.roleId,
@@ -111,7 +111,7 @@ export class SecurityRuleRepository extends Repository<SecurityRule> {
111
111
 
112
112
  // Populate the model from modelMetadataId or modelMetadataUserKey
113
113
  const modelMetadataRepository = this.dataSource.getRepository(ModelMetadata);
114
- if (!createDto.modelMetadataId) {
114
+ if (createDto.modelMetadataId) {
115
115
  const modelMetadata = await modelMetadataRepository.findOne({
116
116
  where: {
117
117
  id: createDto.modelMetadataId,
@@ -3058,8 +3058,8 @@
3058
3058
  "ormType": "varchar",
3059
3059
  "length": 128,
3060
3060
  "required": true,
3061
- "unique": true,
3062
- "index": true,
3061
+ "unique": false,
3062
+ "index": false,
3063
3063
  "private": false,
3064
3064
  "encrypt": false,
3065
3065
  "isSystem": true
@@ -764,13 +764,13 @@ export class AuthenticationService {
764
764
  isValidUser = false
765
765
  // throw new NotFoundException(ERROR_MESSAGES.INVALID_CREDENTIALS);
766
766
  }
767
- if (!user.active) {
767
+ if (isValidUser && !user?.active) {
768
768
  isValidUser = false
769
769
  // throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
770
770
  }
771
771
 
772
772
  // 2. Validate if user has used a provider which is "local", only then it makes sense for us to initiate the forgot password routine.
773
- if (user.lastLoginProvider !== 'local') {
773
+ if (isValidUser && user?.lastLoginProvider !== 'local') {
774
774
  isValidUser = false
775
775
  // throw new BadRequestException(ERROR_MESSAGES.INVALID_CREDENTIALS);
776
776
  }
@@ -792,8 +792,8 @@ export class AuthenticationService {
792
792
  error: '',
793
793
  errorCode: '',
794
794
  data: {
795
- user: {
796
- email: user.email,
795
+ user: {
796
+ email: user?.email,
797
797
  // mobile: user.mobile,
798
798
  // username: user.username,
799
799
  },
@@ -18,7 +18,7 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
18
18
  if (!this.serviceRole) {
19
19
  this.logger.debug('Queue service Role is not defined in the environment variables');
20
20
  }
21
- this.logger.debug(`DatabasePublisher instance created with options: ${JSON.stringify(this.options())} and url: ${this.url}`);
21
+ this.logger.debug(`DatabasePublisher instance created with options: ${JSON.stringify(this.options())}`);
22
22
  }
23
23
 
24
24
  abstract options(): QueuesModuleOptions;
@@ -33,7 +33,7 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
33
33
  throw new Error('Queue service Role is subscriber, cannot publish messages');
34
34
  }
35
35
 
36
- this.logger.debug(`DatabasePublisher publishing with options: ${JSON.stringify(this.options())} and url: ${this.url}`);
36
+ this.logger.debug(`DatabasePublisher publishing with options: ${JSON.stringify(this.options())}`);
37
37
 
38
38
  const options = this.options();
39
39