@solidxai/core 0.1.10-beta.0 → 0.1.10-beta.11

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 (269) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +18 -0
  3. package/CURRENT_PROMPT +6 -0
  4. package/dist/commands/refresh-model.command.d.ts +0 -4
  5. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  6. package/dist/commands/refresh-model.command.js +0 -32
  7. package/dist/commands/refresh-model.command.js.map +1 -1
  8. package/dist/commands/run-tests.command.d.ts +2 -0
  9. package/dist/commands/run-tests.command.d.ts.map +1 -1
  10. package/dist/commands/run-tests.command.js +49 -17
  11. package/dist/commands/run-tests.command.js.map +1 -1
  12. package/dist/controllers/action-metadata.controller.js +1 -1
  13. package/dist/controllers/action-metadata.controller.js.map +1 -1
  14. package/dist/controllers/facebook-authentication.controller.js +1 -1
  15. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  16. package/dist/controllers/google-authentication.controller.js +1 -1
  17. package/dist/controllers/google-authentication.controller.js.map +1 -1
  18. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  19. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  20. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  21. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  22. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  23. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  24. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  25. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  26. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  27. package/dist/controllers/model-metadata.controller.js +2 -2
  28. package/dist/controllers/model-metadata.controller.js.map +1 -1
  29. package/dist/controllers/module-metadata.controller.js +1 -1
  30. package/dist/controllers/module-metadata.controller.js.map +1 -1
  31. package/dist/controllers/mq-message-queue.controller.js +1 -1
  32. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  33. package/dist/controllers/mq-message.controller.js +1 -1
  34. package/dist/controllers/mq-message.controller.js.map +1 -1
  35. package/dist/controllers/user.controller.d.ts.map +1 -1
  36. package/dist/controllers/user.controller.js.map +1 -1
  37. package/dist/controllers/view-metadata.controller.js +1 -1
  38. package/dist/controllers/view-metadata.controller.js.map +1 -1
  39. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  40. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  41. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  42. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  43. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  44. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  45. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  46. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  47. package/dist/dtos/update-user.dto.d.ts +1 -0
  48. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  49. package/dist/dtos/update-user.dto.js +7 -1
  50. package/dist/dtos/update-user.dto.js.map +1 -1
  51. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  52. package/dist/entities/chatter-message-details.entity.js +0 -1
  53. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  54. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  55. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  56. package/dist/entities/mcp-audit-log.entity.js +90 -0
  57. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  58. package/dist/entities/user.entity.js +1 -0
  59. package/dist/entities/user.entity.js.map +1 -1
  60. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  61. package/dist/helpers/bootstrap.helper.js +2 -0
  62. package/dist/helpers/bootstrap.helper.js.map +1 -1
  63. package/dist/helpers/command.service.d.ts +1 -0
  64. package/dist/helpers/command.service.d.ts.map +1 -1
  65. package/dist/helpers/command.service.js +1 -0
  66. package/dist/helpers/command.service.js.map +1 -1
  67. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  68. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  69. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  70. package/dist/index.d.ts +4 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +4 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/interfaces.d.ts +0 -2
  75. package/dist/interfaces.d.ts.map +1 -1
  76. package/dist/interfaces.js.map +1 -1
  77. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  78. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  79. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  80. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  81. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  82. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  83. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  84. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  85. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  86. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  87. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  88. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  89. package/dist/repository/mcp-audit-log.repository.js +34 -0
  90. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  91. package/dist/repository/security-rule.repository.js.map +1 -1
  92. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  93. package/dist/seeders/module-test-data.service.d.ts +7 -0
  94. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  95. package/dist/seeders/module-test-data.service.js +94 -18
  96. package/dist/seeders/module-test-data.service.js.map +1 -1
  97. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  98. package/dist/seeders/seed-data/solid-core-metadata.json +380 -2
  99. package/dist/services/authentication.service.d.ts.map +1 -1
  100. package/dist/services/authentication.service.js +5 -5
  101. package/dist/services/authentication.service.js.map +1 -1
  102. package/dist/services/chatter-message.service.d.ts +6 -3
  103. package/dist/services/chatter-message.service.d.ts.map +1 -1
  104. package/dist/services/chatter-message.service.js +23 -35
  105. package/dist/services/chatter-message.service.js.map +1 -1
  106. package/dist/services/crud.service.js.map +1 -1
  107. package/dist/services/csv.service.js.map +1 -1
  108. package/dist/services/dashboard.service.js.map +1 -1
  109. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  110. package/dist/services/excel.service.js.map +1 -1
  111. package/dist/services/export-transaction.service.js.map +1 -1
  112. package/dist/services/field-metadata.service.js +2 -2
  113. package/dist/services/field-metadata.service.js.map +1 -1
  114. package/dist/services/fixtures.service.js.map +1 -1
  115. package/dist/services/import-transaction.service.js.map +1 -1
  116. package/dist/services/list-of-values.service.js.map +1 -1
  117. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  118. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  119. package/dist/services/mcp-audit-log.service.js +38 -0
  120. package/dist/services/mcp-audit-log.service.js.map +1 -0
  121. package/dist/services/model-metadata.service.d.ts +4 -1
  122. package/dist/services/model-metadata.service.d.ts.map +1 -1
  123. package/dist/services/model-metadata.service.js +23 -24
  124. package/dist/services/model-metadata.service.js.map +1 -1
  125. package/dist/services/module-metadata.service.d.ts +4 -1
  126. package/dist/services/module-metadata.service.d.ts.map +1 -1
  127. package/dist/services/module-metadata.service.js +18 -2
  128. package/dist/services/module-metadata.service.js.map +1 -1
  129. package/dist/services/queues/database-publisher.service.js +3 -3
  130. package/dist/services/queues/database-publisher.service.js.map +1 -1
  131. package/dist/services/queues/database-subscriber.service.js +3 -3
  132. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  133. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  134. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  135. package/dist/services/queues/rabbitmq-subscriber.service.js +4 -4
  136. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  137. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  138. package/dist/services/queues/redis-publisher.service.js +4 -1
  139. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  140. package/dist/services/queues/redis-subscriber.service.d.ts.map +1 -1
  141. package/dist/services/queues/redis-subscriber.service.js +4 -1
  142. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  143. package/dist/services/role-metadata.service.js.map +1 -1
  144. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  145. package/dist/services/settings/default-settings-provider.service.d.ts +58 -8
  146. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  147. package/dist/services/settings/default-settings-provider.service.js +21 -4
  148. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  149. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  150. package/dist/services/solid-introspect.service.js.map +1 -1
  151. package/dist/services/user-activity-history.service.js.map +1 -1
  152. package/dist/services/view-metadata.service.d.ts.map +1 -1
  153. package/dist/services/view-metadata.service.js +17 -2
  154. package/dist/services/view-metadata.service.js.map +1 -1
  155. package/dist/solid-core.module.d.ts +1 -0
  156. package/dist/solid-core.module.d.ts.map +1 -1
  157. package/dist/solid-core.module.js +9 -0
  158. package/dist/solid-core.module.js.map +1 -1
  159. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  160. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  161. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  162. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  163. package/dist/testing/core/testing-engine.js.map +1 -1
  164. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  165. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  166. package/dist/testing/reporter/console-reporter.js +21 -0
  167. package/dist/testing/reporter/console-reporter.js.map +1 -1
  168. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  169. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  170. package/dist/testing/reporter/reporter.types.js.map +1 -1
  171. package/dist/testing/reporter/webhook-reporter.d.ts +54 -0
  172. package/dist/testing/reporter/webhook-reporter.d.ts.map +1 -0
  173. package/dist/testing/reporter/webhook-reporter.js +74 -0
  174. package/dist/testing/reporter/webhook-reporter.js.map +1 -0
  175. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  176. package/dist/testing/runner/run-from-metadata.js +20 -1
  177. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  178. package/package.json +8 -8
  179. package/src/commands/refresh-model.command.ts +1 -32
  180. package/src/commands/run-tests.command.ts +45 -17
  181. package/src/controllers/action-metadata.controller.ts +1 -1
  182. package/src/controllers/facebook-authentication.controller.ts +1 -1
  183. package/src/controllers/google-authentication.controller.ts +1 -1
  184. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  185. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  186. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  187. package/src/controllers/model-metadata.controller.ts +1 -1
  188. package/src/controllers/module-metadata.controller.ts +1 -1
  189. package/src/controllers/mq-message-queue.controller.ts +1 -1
  190. package/src/controllers/mq-message.controller.ts +1 -1
  191. package/src/controllers/user.controller.ts +16 -16
  192. package/src/controllers/view-metadata.controller.ts +1 -1
  193. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  194. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  195. package/src/dtos/update-user.dto.ts +4 -0
  196. package/src/entities/chatter-message-details.entity.ts +1 -2
  197. package/src/entities/mcp-audit-log.entity.ts +55 -0
  198. package/src/entities/user.entity.ts +1 -1
  199. package/src/helpers/bootstrap.helper.ts +3 -0
  200. package/src/helpers/command.service.ts +2 -0
  201. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  202. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  203. package/src/helpers/module-metadata-helper.service.ts +1 -1
  204. package/src/index.ts +4 -0
  205. package/src/interfaces.ts +0 -2
  206. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  207. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  208. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  209. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  210. package/src/repository/mcp-audit-log.repository.ts +17 -0
  211. package/src/repository/security-rule.repository.ts +1 -1
  212. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  213. package/src/seeders/module-test-data.service.ts +107 -15
  214. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  215. package/src/seeders/seed-data/solid-core-metadata.json +380 -2
  216. package/src/services/1.js +6 -0
  217. package/src/services/authentication.service.ts +19 -31
  218. package/src/services/chatter-message.service.ts +28 -38
  219. package/src/services/crud.service.ts +3 -3
  220. package/src/services/csv.service.ts +1 -1
  221. package/src/services/dashboard.service.ts +1 -1
  222. package/src/services/database/database-bootstrap.service.ts +1 -1
  223. package/src/services/excel.service.ts +1 -1
  224. package/src/services/export-transaction.service.ts +2 -2
  225. package/src/services/field-metadata.service.ts +3 -3
  226. package/src/services/fixtures.service.ts +2 -2
  227. package/src/services/import-transaction.service.ts +2 -2
  228. package/src/services/list-of-values.service.ts +1 -1
  229. package/src/services/mcp-audit-log.service.ts +19 -0
  230. package/src/services/model-metadata.service.ts +35 -34
  231. package/src/services/module-metadata.service.ts +18 -7
  232. package/src/services/queues/database-publisher.service.ts +4 -4
  233. package/src/services/queues/database-subscriber.service.ts +7 -7
  234. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  235. package/src/services/queues/rabbitmq-subscriber.service.ts +13 -13
  236. package/src/services/queues/redis-publisher.service.ts +7 -4
  237. package/src/services/queues/redis-subscriber.service.ts +9 -6
  238. package/src/services/role-metadata.service.ts +1 -1
  239. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  240. package/src/services/settings/default-settings-provider.service.ts +21 -4
  241. package/src/services/sms/TwilioSMSService.ts +2 -2
  242. package/src/services/solid-introspect.service.ts +2 -2
  243. package/src/services/user-activity-history.service.ts +1 -1
  244. package/src/services/view-metadata.service.ts +25 -8
  245. package/src/solid-core.module.ts +9 -0
  246. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  247. package/src/subscribers/security-rule.subscriber.ts +8 -8
  248. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  249. package/src/testing/core/testing-engine.ts +2 -2
  250. package/src/testing/reporter/console-reporter.ts +27 -0
  251. package/src/testing/reporter/reporter.types.ts +7 -0
  252. package/src/testing/reporter/webhook-reporter.ts +116 -0
  253. package/src/testing/runner/run-from-metadata.ts +19 -1
  254. package/dist-tests/api/authenticate.spec.js +0 -119
  255. package/dist-tests/api/authenticate.spec.js.map +0 -1
  256. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  257. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  258. package/dist-tests/api/ping.spec.js +0 -21
  259. package/dist-tests/api/ping.spec.js.map +0 -1
  260. package/dist-tests/helpers/auth.js +0 -41
  261. package/dist-tests/helpers/auth.js.map +0 -1
  262. package/dist-tests/helpers/env.js +0 -11
  263. package/dist-tests/helpers/env.js.map +0 -1
  264. package/docs/grouping-enhancements.md +0 -89
  265. package/docs/java-spring/README.md +0 -3
  266. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  267. package/docs/seed-changes.md +0 -65
  268. package/docs/test-data-workflow.md +0 -200
  269. package/docs/type-declaration-import-issue.md +0 -24
@@ -47,6 +47,26 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
47
47
  super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
48
48
  }
49
49
 
50
+ private resolveMessageUserId(userId?: number | null): number | null {
51
+ if (userId) {
52
+ return userId;
53
+ }
54
+
55
+ return this.requestContextService.getActiveUser()?.sub ?? null;
56
+ }
57
+
58
+ private resolveMessageUser(userId?: number | null) {
59
+ const resolvedUserId = this.resolveMessageUserId(userId);
60
+ return resolvedUserId ? ({ id: resolvedUserId } as any) : null;
61
+ }
62
+
63
+ private stampMessageAuditFields(chatterMessage: ChatterMessage, userId?: number | null) {
64
+ const resolvedUserId = this.resolveMessageUserId(userId);
65
+ chatterMessage.user = resolvedUserId ? ({ id: resolvedUserId } as any) : null;
66
+ chatterMessage.createdBy = resolvedUserId;
67
+ chatterMessage.updatedBy = resolvedUserId;
68
+ }
69
+
50
70
  async markCompleted(id: number) {
51
71
  const activeUser = this.requestContextService.getActiveUser();
52
72
  if (!activeUser) {
@@ -78,14 +98,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
78
98
  });
79
99
  chatterMessage.modelDisplayName = model?.displayName ?? null;
80
100
 
81
- const activeUser = this.requestContextService.getActiveUser();
82
-
83
- if (activeUser) {
84
- const userId = activeUser?.sub;
85
- chatterMessage.user = { id: userId } as any;
86
- } else {
87
- chatterMessage.user = null;
88
- }
101
+ this.stampMessageAuditFields(chatterMessage);
89
102
 
90
103
  const savedMessage = await this.repo.save(chatterMessage);
91
104
 
@@ -114,7 +127,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
114
127
  return savedMessage;
115
128
  }
116
129
 
117
- async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false) {
130
+ async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false, userId?: number | null) {
118
131
  if (!entity) {
119
132
  return;
120
133
  }
@@ -139,8 +152,6 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
139
152
  !(field.type === 'relation' && field.relationType === 'one-to-many')
140
153
  );
141
154
 
142
- const activeUser = this.requestContextService.getActiveUser();
143
-
144
155
  const chatterMessage = new ChatterMessage();
145
156
  chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;
146
157
  chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;
@@ -150,13 +161,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
150
161
  chatterMessage.modelDisplayName = model?.displayName;
151
162
  chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
152
163
  chatterMessage.messageBody = `New ${model?.displayName} created`;
153
-
154
- if (activeUser) {
155
- const userId = activeUser?.sub;
156
- chatterMessage.user = { id: userId } as any;
157
- } else {
158
- chatterMessage.user = null;
159
- }
164
+ this.stampMessageAuditFields(chatterMessage, userId);
160
165
 
161
166
  const savedMessage = await this.repo.save(chatterMessage);
162
167
 
@@ -177,7 +182,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
177
182
  }
178
183
  }
179
184
 
180
- async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {
185
+ async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false, userId?: number | null) {
181
186
  if (!databaseEntity || !entity) {
182
187
  return;
183
188
  }
@@ -259,8 +264,6 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
259
264
  return;
260
265
  }
261
266
 
262
- const activeUser = this.requestContextService.getActiveUser();
263
-
264
267
  const chatterMessage = new ChatterMessage();
265
268
  chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;
266
269
  chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;
@@ -270,13 +273,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
270
273
  chatterMessage.modelDisplayName = model.displayName;
271
274
  chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
272
275
  chatterMessage.messageBody = `${model?.displayName} updated`;
273
-
274
- if (activeUser) {
275
- const userId = activeUser?.sub;
276
- chatterMessage.user = { id: userId } as any;
277
- } else {
278
- chatterMessage.user = null;
279
- }
276
+ this.stampMessageAuditFields(chatterMessage, userId);
280
277
 
281
278
  const savedMessage = await this.repo.save(chatterMessage);
282
279
 
@@ -294,7 +291,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
294
291
  }
295
292
  }
296
293
 
297
- async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false) {
294
+ async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false, userId?: number | null) {
298
295
  const model = await this.modelMetadataRepo.findOne({
299
296
  where: {
300
297
  singularName: lowerFirst(modelName)
@@ -335,14 +332,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
335
332
  chatterMessage.modelUserKey = databaseEntity[model?.userKeyField?.name];
336
333
  chatterMessage.messageBody = `${model?.displayName} deleted`;
337
334
 
338
- const activeUser = this.requestContextService.getActiveUser();
339
-
340
- if (activeUser) {
341
- const userId = activeUser?.sub;
342
- chatterMessage.user = { id: userId } as any;
343
- } else {
344
- chatterMessage.user = null;
345
- }
335
+ this.stampMessageAuditFields(chatterMessage, userId);
346
336
 
347
337
  const savedMessage = await this.repo.save(chatterMessage);
348
338
 
@@ -421,7 +411,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
421
411
  if (value.id) {
422
412
  return value.id.toString();
423
413
  }
424
- } catch (error) {
414
+ } catch (error: any) {
425
415
  console.error('Error fetching related model metadata:', error);
426
416
  return value.id ? value.id.toString() : '';
427
417
  }
@@ -129,7 +129,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
129
129
  await this.saveMedia(model, files, savedEntity);
130
130
  }
131
131
  return savedEntity;
132
- } catch (error) {
132
+ } catch (error: any) {
133
133
  if (error instanceof QueryFailedError && error.message.includes('duplicate key value violates unique constraint')) {
134
134
  throw new BadRequestException(ERROR_MESSAGES.DUPLICATE_ENTRY);
135
135
  }
@@ -920,7 +920,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
920
920
  );
921
921
 
922
922
  return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };
923
- } catch (error) {
923
+ } catch (error: any) {
924
924
  if (error instanceof QueryFailedError) {
925
925
  if ((error as any).code === '23505') {
926
926
  throw new Error(ERROR_MESSAGES.CONFLICTING_RECORD_ON_UNARCHIVE);
@@ -966,7 +966,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
966
966
  );
967
967
 
968
968
  return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };
969
- } catch (error) {
969
+ } catch (error: any) {
970
970
  if (error instanceof QueryFailedError) {
971
971
  if ((error as any).code === "23505") {
972
972
  throw new Error(ERROR_MESSAGES.CONFLICTING_RECORD_ON_UNARCHIVE);
@@ -68,7 +68,7 @@ export class CsvService {
68
68
  }
69
69
 
70
70
  csvStream.end(); // ✅ Ensure CSV stream is finalized
71
- } catch (error) {
71
+ } catch (error: any) {
72
72
  this.logger.error(`❌ Error writing CSV: ${error.message}`);
73
73
  passThrough.destroy(error); // ✅ Properly destroy stream on error
74
74
  throw error;
@@ -117,7 +117,7 @@ export class DashboardService extends CRUDService<Dashboard> {
117
117
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
118
118
  try {
119
119
  await fs.access(filePath);
120
- } catch (error) {
120
+ } catch (error: any) {
121
121
  throw new Error(`Configuration file not found for module: ${moduleName}`);
122
122
  }
123
123
  const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
@@ -80,7 +80,7 @@ export class DatabaseBootstrapService implements OnModuleInit {
80
80
  await this.dataSource.query(sql);
81
81
 
82
82
  this.logger.debug(`[${this.dataSource.name}] Applied ${fileName}`);
83
- } catch (error) {
83
+ } catch (error: any) {
84
84
  // DO NOT THROW — continue with next file
85
85
  this.logger.error(
86
86
  `[${this.dataSource.name}] Failed ${fileName}`,
@@ -93,7 +93,7 @@ export class ExcelService {
93
93
 
94
94
  workbook.commit();
95
95
  // passThrough.end(); // ✅ Properly close the stream
96
- } catch (error) {
96
+ } catch (error: any) {
97
97
  this.logger.error(`❌ Error writing Excel: ${error.message}`);
98
98
  passThrough.destroy(error); // Destroy stream
99
99
  throw error;
@@ -90,7 +90,7 @@ export class ExportTransactionService extends CRUDService<ExportTransaction> {
90
90
  const fileName = this.getFileName(templateName, uuid, templateFormat);
91
91
  const mimeType = this.getMimeType(templateFormat);
92
92
  return { exportStream, fileName, mimeType, exportTransaction };
93
- } catch (error) {
93
+ } catch (error: any) {
94
94
  this.updateExportTransaction(id, ExportStatus.FAILED, error.message);
95
95
  throw error;
96
96
  }
@@ -114,7 +114,7 @@ export class ExportTransactionService extends CRUDService<ExportTransaction> {
114
114
  // Store the file using the appropriate storage provider
115
115
  await this.storeExportStream(exportStream, exportTransaction, this.getFileName(templateName, uuid, templateFormat));
116
116
  this.updateExportTransaction(id, ExportStatus.COMPLETED);
117
- } catch (error) {
117
+ } catch (error: any) {
118
118
  this.updateExportTransaction(id, ExportStatus.FAILED, error.message);
119
119
  throw error;
120
120
 
@@ -745,6 +745,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
745
745
  "type",
746
746
  "ormType",
747
747
  "isSystem",
748
+ "regexPattern",
749
+ "regexPatternNotMatchingErrorMsg",
748
750
  "defaultValue",
749
751
  "min",
750
752
  "max",
@@ -772,8 +774,6 @@ export class FieldMetadataService implements OnApplicationBootstrap {
772
774
  "regexPattern",
773
775
  "regexPatternNotMatchingErrorMsg",
774
776
  "defaultValue",
775
- "min",
776
- "max",
777
777
  "required",
778
778
  "unique",
779
779
  "index",
@@ -1256,7 +1256,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
1256
1256
  // Write the updated object back to the file
1257
1257
  const updatedContent = JSON.stringify(metaData, null, 2);
1258
1258
  await fs.writeFile(filePath, updatedContent);
1259
- } catch (error) {
1259
+ } catch (error: any) {
1260
1260
  this.logger.error('File creation failed:', error);
1261
1261
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
1262
1262
  }
@@ -35,7 +35,7 @@ export class FixturesService {
35
35
  // Create the model instance in the database
36
36
  const createdInstance = await modelServiceInstance.create(modelFixture.data);
37
37
  this.logger.log(`Successfully created fixture for model: ${modelFixture.singularName} with ID: ${createdInstance.id}`);
38
- } catch (error) {
38
+ } catch (error: any) {
39
39
  this.logger.error(`Error creating fixture for model: ${modelFixture.singularName} - ${error.message}`);
40
40
  }
41
41
  }
@@ -59,7 +59,7 @@ export class FixturesService {
59
59
  const deleteCriteria = modelFixture.data; // This should be adjusted based on actual criteria
60
60
  await modelServiceInstance.delete(deleteCriteria);
61
61
  this.logger.log(`Successfully deleted fixture for model: ${modelFixture.singularName}`);
62
- } catch (error) {
62
+ } catch (error: any) {
63
63
  this.logger.error(`Error deleting fixture for model: ${modelFixture.singularName} - ${error.message}`);
64
64
  }
65
65
  }
@@ -25,7 +25,7 @@ import { SolidIntrospectService } from './solid-introspect.service';
25
25
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
26
26
  import { getUserExcludedFields } from 'src/helpers/user-helper';
27
27
  import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
28
- import {upperFirst, camelCase} from 'lodash';
28
+ import { upperFirst, camelCase } from 'lodash';
29
29
  import { classify } from '../helpers/string.helper';
30
30
 
31
31
  interface ImportTemplateFileInfo {
@@ -557,7 +557,7 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
557
557
  const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);
558
558
  ids.push(createdRecord.id); // Add the ID of the created record to the ids array
559
559
  }
560
- catch (error) {
560
+ catch (error: any) {
561
561
  this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);
562
562
  // Get the Import transaction error log repo
563
563
  const errorLog = await this.createErrorLogEntry(importTransaction, record, error);
@@ -140,7 +140,7 @@ export class ListOfValuesService extends CRUDService<ListOfValues> {
140
140
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
141
141
  try {
142
142
  await fs.access(filePath);
143
- } catch (error) {
143
+ } catch (error: any) {
144
144
  throw new Error(`Configuration file not found for module: ${moduleName}`);
145
145
  }
146
146
  const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
@@ -0,0 +1,19 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import { InjectEntityManager } from '@nestjs/typeorm';
4
+ import { McpAuditLog } from 'src/entities/mcp-audit-log.entity';
5
+ import { McpAuditLogRepository } from 'src/repository/mcp-audit-log.repository';
6
+ import { EntityManager } from 'typeorm';
7
+ import { CRUDService } from './crud.service';
8
+
9
+ @Injectable()
10
+ export class McpAuditLogService extends CRUDService<McpAuditLog> {
11
+ constructor(
12
+ @InjectEntityManager()
13
+ readonly entityManager: EntityManager,
14
+ readonly repo: McpAuditLogRepository,
15
+ readonly moduleRef: ModuleRef,
16
+ ) {
17
+ super(entityManager, repo, 'mcpAuditLog', 'solid-core', moduleRef);
18
+ }
19
+ }
@@ -27,6 +27,7 @@ import {
27
27
  REMOVE_FIELDS_COMMAND,
28
28
  SchematicService
29
29
  } from '../helpers/schematic.service';
30
+ import { CommandService } from '../helpers/command.service';
30
31
  import { CodeGenerationOptions } from '../interfaces';
31
32
  import { CrudHelperService } from './crud-helper.service';
32
33
  import { FieldMetadataService } from './field-metadata.service';
@@ -49,6 +50,7 @@ export class ModelMetadataService {
49
50
  private readonly modelMetadataRepo: ModelMetadataRepository,
50
51
  private readonly fieldMetadataRepo: FieldMetadataRepository,
51
52
  private readonly schematicService: SchematicService,
53
+ private readonly commandService: CommandService,
52
54
  @InjectDataSource()
53
55
  private readonly dataSource: DataSource,
54
56
  private readonly crudHelperService: CrudHelperService,
@@ -154,7 +156,7 @@ export class ModelMetadataService {
154
156
 
155
157
  return model
156
158
  });
157
- } catch (error) {
159
+ } catch (error: any) {
158
160
  // console.error('Transaction failed:', error);
159
161
  this.logger.error('Transaction failed:', error);
160
162
  throw error;
@@ -189,7 +191,7 @@ export class ModelMetadataService {
189
191
 
190
192
  // return model
191
193
  });
192
- } catch (error) {
194
+ } catch (error: any) {
193
195
  // console.error('Transaction failed:', error);
194
196
  this.logger.error('Transaction failed:', error);
195
197
  throw error;
@@ -309,7 +311,7 @@ export class ModelMetadataService {
309
311
  const updatedContent = JSON.stringify(metaData, null, 2);
310
312
  await fs.writeFile(filePath, updatedContent);
311
313
 
312
- } catch (error) {
314
+ } catch (error: any) {
313
315
  // console.error('File creation failed:', error);
314
316
  this.logger.error('File creation failed:', error);
315
317
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
@@ -490,7 +492,7 @@ export class ModelMetadataService {
490
492
  const updatedContent = JSON.stringify(metaData, null, 2);
491
493
  await fs.writeFile(filePath, updatedContent);
492
494
 
493
- } catch (error) {
495
+ } catch (error: any) {
494
496
  // console.error('File creation failed:', error);
495
497
  this.logger.error('File creation failed:', error);
496
498
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
@@ -524,7 +526,7 @@ export class ModelMetadataService {
524
526
  await this.cleanupOnDelete(entity.id);
525
527
  const r = await this.modelMetadataRepo.remove(entity);
526
528
  return r;
527
- } catch (error) {
529
+ } catch (error: any) {
528
530
  }
529
531
  }
530
532
 
@@ -621,7 +623,7 @@ export class ModelMetadataService {
621
623
  try {
622
624
  await fs.unlink(fileToDelete);
623
625
  this.logger.log(`Deleted file: ${fileToDelete}`);
624
- } catch (error) {
626
+ } catch (error: any) {
625
627
  this.logger.error(`Error deleting file: ${fileToDelete}`, error);
626
628
  }
627
629
  }
@@ -725,7 +727,7 @@ export class ModelMetadataService {
725
727
  );
726
728
  this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);
727
729
  await this.solidTsMorphService.commit();
728
- } catch (error) {
730
+ } catch (error: any) {
729
731
  this.solidTsMorphService.rollback();
730
732
  this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);
731
733
  }
@@ -735,6 +737,15 @@ export class ModelMetadataService {
735
737
 
736
738
  }
737
739
 
740
+ @DisallowInProduction()
741
+ async generateCodeViaCtl(modelId: number): Promise<string> {
742
+ return this.commandService.executeCommandWithArgs({
743
+ command: 'npx',
744
+ args: ['@solixai/solidctl@latest', 'generate', 'model', `--id=${modelId}`],
745
+ cwd: path.join(process.cwd(), '..'),
746
+ });
747
+ }
748
+
738
749
  @DisallowInProduction()
739
750
  async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {
740
751
  const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];
@@ -789,7 +800,7 @@ export class ModelMetadataService {
789
800
  await this.populateVAMConfigInDb(model);
790
801
  await this.populateVAMConfigInFile(model);
791
802
  });
792
- } catch (error) {
803
+ } catch (error: any) {
793
804
  this.logger.error('generateVAMConfig Transaction failed:', error);
794
805
  throw error;
795
806
  }
@@ -816,7 +827,7 @@ export class ModelMetadataService {
816
827
  const updatedContent = JSON.stringify(metaData, null, 2);
817
828
  await fs.writeFile(filePath, updatedContent);
818
829
 
819
- } catch (error) {
830
+ } catch (error: any) {
820
831
  // console.error('File creation failed:', error);
821
832
  this.logger.error('File updation failed for View, action, menus config:', error);
822
833
  throw new Error('File updation failed for View, action, menus config'); // Trigger rollback
@@ -826,15 +837,15 @@ export class ModelMetadataService {
826
837
  // Populate the View, Actions and Menus in the config file
827
838
  private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {
828
839
  const column1Fields = [];
829
- const column2Fields = [];
840
+ // const column2Fields = [];
830
841
 
831
842
  // Distribute fields between two columns
832
843
  for (let i = 0; i < formViewLayoutFields.length; i++) {
833
- if (i % 2 === 0) {
834
- column1Fields.push(formViewLayoutFields[i]);
835
- } else {
836
- column2Fields.push(formViewLayoutFields[i]);
837
- }
844
+ // if (i % 2 === 0) {
845
+ column1Fields.push(formViewLayoutFields[i]);
846
+ // } else {
847
+ // column2Fields.push(formViewLayoutFields[i]);
848
+ // }
838
849
  }
839
850
  const actionName = `${model.singularName}-list-action`;
840
851
  const treeViewActionName = `${model.singularName}-tree-action`;
@@ -842,6 +853,7 @@ export class ModelMetadataService {
842
853
  const treeViewName = `${model.singularName}-tree-view`;
843
854
  const formViewName = `${model.singularName}-form-view`;
844
855
  const menuName = `${model.singularName}-menu-item`;
856
+ const nextMenuSequenceNumber = (metaData.menus?.length ?? 0) + 1;
845
857
 
846
858
  const action = {
847
859
  displayName: `${model.displayName} List Action`,
@@ -874,7 +886,7 @@ export class ModelMetadataService {
874
886
  const menu = {
875
887
  displayName: `${model.displayName}`,
876
888
  name: menuName,
877
- sequenceNumber: 1,
889
+ sequenceNumber: nextMenuSequenceNumber,
878
890
  actionUserKey: actionName,
879
891
  moduleUserKey: `${model.module.name}`,
880
892
  parentMenuItemUserKey: "",
@@ -955,11 +967,11 @@ export class ModelMetadataService {
955
967
  attrs: { name: "group-1", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
956
968
  children: column1Fields
957
969
  },
958
- {
959
- type: "column",
960
- attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
961
- children: column2Fields
962
- }
970
+ // {
971
+ // type: "column",
972
+ // attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
973
+ // children: column2Fields
974
+ // }
963
975
  ]
964
976
  },
965
977
  ]
@@ -1274,24 +1286,13 @@ export class ModelMetadataService {
1274
1286
  };
1275
1287
  const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
1276
1288
 
1277
- let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1278
-
1279
- // If a list of field ids or field names is passed for refresh, use these fields only
1280
- if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {
1281
- fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));
1282
- } else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {
1283
- fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));
1284
- }
1285
- // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1286
-
1287
1289
  //Execute the schematic command to refresh the model
1288
- const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);
1290
+ const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);
1289
1291
 
1290
1292
  return `${refreshOuput}`;
1291
1293
  }
1292
1294
 
1293
- private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {
1294
- // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1295
+ private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
1295
1296
  const output = await this.schematicService.executeSchematicCommand(
1296
1297
  REFRESH_MODEL_COMMAND,
1297
1298
  {
@@ -22,6 +22,7 @@ import {
22
22
  ADD_MODULE_COMMAND,
23
23
  SchematicService,
24
24
  } from '../helpers/schematic.service';
25
+ import { CommandService } from '../helpers/command.service';
25
26
  import { SolidRegistry } from '../helpers/solid-registry';
26
27
  import { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';
27
28
  import { CrudHelperService } from './crud-helper.service';
@@ -40,6 +41,7 @@ export class ModuleMetadataService {
40
41
  private readonly moduleMetadataRepo: ModuleMetadataRepository,
41
42
  private readonly crudHelperService: CrudHelperService,
42
43
  private readonly schematicService: SchematicService,
44
+ private readonly commandService: CommandService,
43
45
  private readonly fileService: DiskFileService,
44
46
  private readonly settingService: SettingService,
45
47
 
@@ -123,7 +125,7 @@ export class ModuleMetadataService {
123
125
  await this.createInFile(module);
124
126
  return module
125
127
  });
126
- } catch (error) {
128
+ } catch (error: any) {
127
129
  // console.error('Transaction failed:', error);
128
130
  this.logger.error('Transaction failed:', error);
129
131
  throw error;
@@ -181,7 +183,7 @@ export class ModuleMetadataService {
181
183
  actionUserKey: `${module?.name}-home-action`,
182
184
  moduleUserKey: module?.name,
183
185
  parentMenuItemUserKey: "",
184
- iconName : "home"
186
+ iconName: "home"
185
187
  }
186
188
  ],
187
189
  views: [],
@@ -204,7 +206,7 @@ export class ModuleMetadataService {
204
206
  // Write the JSON to the file
205
207
  await fs.writeFile(filePath, metadataJson);
206
208
 
207
- } catch (error) {
209
+ } catch (error: any) {
208
210
  // console.error('File creation failed:', error);
209
211
  this.logger.error('File creation failed:', error);
210
212
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
@@ -219,7 +221,7 @@ export class ModuleMetadataService {
219
221
  await this.updateInFile(module);
220
222
  return module
221
223
  });
222
- } catch (error) {
224
+ } catch (error: any) {
223
225
  // console.error('Transaction failed:', error);
224
226
  this.logger.error('Transaction failed:', error);
225
227
  throw error;
@@ -255,7 +257,7 @@ export class ModuleMetadataService {
255
257
  try {
256
258
  metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
257
259
 
258
- } catch (error) {
260
+ } catch (error: any) {
259
261
  metaData = {
260
262
  moduleMetadata: {
261
263
  name: null,
@@ -290,7 +292,7 @@ export class ModuleMetadataService {
290
292
  const updatedContent = JSON.stringify(metaData, null, 2);
291
293
  await fs.writeFile(filePath, updatedContent);
292
294
 
293
- } catch (error) {
295
+ } catch (error: any) {
294
296
  // console.error('File creation failed:', error);
295
297
  this.logger.error('File creation failed:', error);
296
298
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
@@ -365,7 +367,7 @@ export class ModuleMetadataService {
365
367
  await fs.rm(modulePath, { recursive: true, force: true });
366
368
  await fs.rm(moduleMetadataPAth, { recursive: true, force: true });
367
369
  this.logger.log(`Deleted file: ${moduleMetadataPAth}`);
368
- } catch (error) {
370
+ } catch (error: any) {
369
371
  this.logger.error(`Error deleting file: ${moduleMetadataPAth}`, error);
370
372
  throw new Error(ERROR_MESSAGES.FILE_DELETE_FAILED); // Trigger rollback
371
373
  }
@@ -403,6 +405,15 @@ export class ModuleMetadataService {
403
405
  return true
404
406
  }
405
407
 
408
+ @DisallowInProduction()
409
+ async generateCodeViaCtl(moduleId: number): Promise<string> {
410
+ return this.commandService.executeCommandWithArgs({
411
+ command: 'npx',
412
+ args: ['@solixai/solidctl@latest', 'generate', 'module', `--id=${moduleId}`],
413
+ cwd: path.join(process.cwd(), '..'),
414
+ });
415
+ }
416
+
406
417
  @DisallowInProduction()
407
418
  async generateCode(options: CodeGenerationOptions): Promise<string> {
408
419
  if (!options.moduleId && !options.moduleUserKey) {
@@ -15,9 +15,9 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
15
15
  protected readonly mqMessageService: MqMessageService,
16
16
  protected readonly mqMessageQueueService: MqMessageQueueService,
17
17
  ) {
18
- this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
19
- if (!this.serviceRole) {
20
- this.logger.debug('Queue service Role is not defined in the environment variables');
18
+ this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
19
+ if (!process.env.QUEUES_SERVICE_ROLE) {
20
+ this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting DatabasePublisher service role to "both".');
21
21
  }
22
22
  // this.logger.debug(`DatabasePublisher instance created with options: ${JSON.stringify(this.options())}`);
23
23
  }
@@ -74,7 +74,7 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
74
74
  mqMessageQueueId: mqMessageQueue.id,
75
75
  });
76
76
  }
77
- catch (error) {
77
+ catch (error: any) {
78
78
  this.logger.error(error.message, error.stack);
79
79
  }
80
80