@solidstarters/solid-core 1.2.201 → 1.2.203

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 (262) hide show
  1. package/dist/config/cache.options.d.ts +1 -1
  2. package/dist/config/cache.options.d.ts.map +1 -1
  3. package/dist/config/cache.options.js +2 -2
  4. package/dist/config/cache.options.js.map +1 -1
  5. package/dist/config/iam.config.d.ts +4 -0
  6. package/dist/config/iam.config.d.ts.map +1 -1
  7. package/dist/config/iam.config.js +2 -0
  8. package/dist/config/iam.config.js.map +1 -1
  9. package/dist/controllers/model-metadata.controller.d.ts +25 -0
  10. package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
  11. package/dist/controllers/model-metadata.controller.js +23 -0
  12. package/dist/controllers/model-metadata.controller.js.map +1 -1
  13. package/dist/controllers/setting.controller.d.ts +1 -2
  14. package/dist/controllers/setting.controller.d.ts.map +1 -1
  15. package/dist/controllers/setting.controller.js +21 -42
  16. package/dist/controllers/setting.controller.js.map +1 -1
  17. package/dist/decorators/sms-provider.decorator.d.ts +3 -0
  18. package/dist/decorators/sms-provider.decorator.d.ts.map +1 -0
  19. package/dist/decorators/sms-provider.decorator.js +11 -0
  20. package/dist/decorators/sms-provider.decorator.js.map +1 -0
  21. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  22. package/dist/dtos/create-role-metadata.dto.js +1 -0
  23. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  24. package/dist/dtos/navigation.dto.d.ts +6 -0
  25. package/dist/dtos/navigation.dto.d.ts.map +1 -0
  26. package/dist/dtos/navigation.dto.js +33 -0
  27. package/dist/dtos/navigation.dto.js.map +1 -0
  28. package/dist/dtos/sign-in.dto.js +3 -3
  29. package/dist/dtos/sign-in.dto.js.map +1 -1
  30. package/dist/entities/common.entity.js +5 -4
  31. package/dist/entities/common.entity.js.map +1 -1
  32. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  33. package/dist/entities/field-metadata.entity.js +2 -1
  34. package/dist/entities/field-metadata.entity.js.map +1 -1
  35. package/dist/entities/legacy-common.entity.d.ts.map +1 -1
  36. package/dist/entities/legacy-common.entity.js +5 -4
  37. package/dist/entities/legacy-common.entity.js.map +1 -1
  38. package/dist/entities/model-metadata.entity.d.ts.map +1 -1
  39. package/dist/entities/model-metadata.entity.js +5 -1
  40. package/dist/entities/model-metadata.entity.js.map +1 -1
  41. package/dist/factories/mail.factory.d.ts.map +1 -1
  42. package/dist/factories/mail.factory.js.map +1 -1
  43. package/dist/factories/sms.factory.d.ts +14 -0
  44. package/dist/factories/sms.factory.d.ts.map +1 -0
  45. package/dist/factories/sms.factory.js +53 -0
  46. package/dist/factories/sms.factory.js.map +1 -0
  47. package/dist/helpers/date.helper.d.ts.map +1 -1
  48. package/dist/helpers/date.helper.js +13 -4
  49. package/dist/helpers/date.helper.js.map +1 -1
  50. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +3 -0
  51. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  52. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +99 -0
  53. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  54. package/dist/helpers/image-encoding.helper.d.ts +10 -0
  55. package/dist/helpers/image-encoding.helper.d.ts.map +1 -0
  56. package/dist/helpers/image-encoding.helper.js +44 -0
  57. package/dist/helpers/image-encoding.helper.js.map +1 -0
  58. package/dist/helpers/module.helper.d.ts.map +1 -1
  59. package/dist/helpers/module.helper.js +2 -0
  60. package/dist/helpers/module.helper.js.map +1 -1
  61. package/dist/helpers/solid-microservice-adapter.service.d.ts +31 -0
  62. package/dist/helpers/solid-microservice-adapter.service.d.ts.map +1 -0
  63. package/dist/helpers/solid-microservice-adapter.service.js +53 -0
  64. package/dist/helpers/solid-microservice-adapter.service.js.map +1 -0
  65. package/dist/helpers/solid-registry.d.ts +3 -0
  66. package/dist/helpers/solid-registry.d.ts.map +1 -1
  67. package/dist/helpers/solid-registry.js +7 -0
  68. package/dist/helpers/solid-registry.js.map +1 -1
  69. package/dist/index.d.ts +11 -6
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +11 -6
  72. package/dist/index.js.map +1 -1
  73. package/dist/jobs/database/{sms-publisher-database.service.d.ts → msg91-sms-publisher-database.service.d.ts} +2 -2
  74. package/dist/jobs/database/msg91-sms-publisher-database.service.d.ts.map +1 -0
  75. package/dist/jobs/database/{sms-publisher-database.service.js → msg91-sms-publisher-database.service.js} +8 -8
  76. package/dist/jobs/database/msg91-sms-publisher-database.service.js.map +1 -0
  77. package/dist/jobs/database/{sms-queue-database-options.d.ts → msg91-sms-queue-database-options.d.ts} +1 -1
  78. package/dist/jobs/database/msg91-sms-queue-database-options.d.ts.map +1 -0
  79. package/dist/jobs/database/{sms-queue-database-options.js → msg91-sms-queue-database-options.js} +1 -1
  80. package/dist/jobs/database/msg91-sms-queue-database-options.js.map +1 -0
  81. package/dist/jobs/database/{sms-subscriber-database.service.d.ts → msg91-sms-subscriber-database.service.d.ts} +5 -5
  82. package/dist/jobs/database/msg91-sms-subscriber-database.service.d.ts.map +1 -0
  83. package/dist/jobs/database/{sms-subscriber-database.service.js → msg91-sms-subscriber-database.service.js} +14 -12
  84. package/dist/jobs/database/msg91-sms-subscriber-database.service.js.map +1 -0
  85. package/dist/jobs/database/otp-subscriber-database.service.d.ts +4 -4
  86. package/dist/jobs/database/otp-subscriber-database.service.d.ts.map +1 -1
  87. package/dist/jobs/database/otp-subscriber-database.service.js +6 -4
  88. package/dist/jobs/database/otp-subscriber-database.service.js.map +1 -1
  89. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts +3 -3
  90. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts.map +1 -1
  91. package/dist/jobs/database/twilio-sms-subscriber-database.service.js +6 -4
  92. package/dist/jobs/database/twilio-sms-subscriber-database.service.js.map +1 -1
  93. package/dist/jobs/{sms-publisher.service.d.ts → msg91-otp-publisher.service.d.ts} +2 -2
  94. package/dist/jobs/msg91-otp-publisher.service.d.ts.map +1 -0
  95. package/dist/jobs/{sms-publisher.service.js → msg91-otp-publisher.service.js} +8 -8
  96. package/dist/jobs/msg91-otp-publisher.service.js.map +1 -0
  97. package/dist/jobs/{sms-queue-options.d.ts → msg91-otp-queue-options.d.ts} +1 -1
  98. package/dist/jobs/msg91-otp-queue-options.d.ts.map +1 -0
  99. package/dist/jobs/{otp-queue-options.js → msg91-otp-queue-options.js} +1 -1
  100. package/dist/jobs/msg91-otp-queue-options.js.map +1 -0
  101. package/dist/jobs/{sms-subscriber.service.d.ts → msg91-otp-subscriber.service.d.ts} +6 -6
  102. package/dist/jobs/msg91-otp-subscriber.service.d.ts.map +1 -0
  103. package/dist/jobs/{otp-subscriber.service.js → msg91-otp-subscriber.service.js} +14 -12
  104. package/dist/jobs/msg91-otp-subscriber.service.js.map +1 -0
  105. package/dist/jobs/{otp-publisher.service.d.ts → msg91-sms-publisher.service.d.ts} +2 -2
  106. package/dist/jobs/msg91-sms-publisher.service.d.ts.map +1 -0
  107. package/dist/jobs/{otp-publisher.service.js → msg91-sms-publisher.service.js} +8 -8
  108. package/dist/jobs/msg91-sms-publisher.service.js.map +1 -0
  109. package/dist/jobs/{otp-queue-options.d.ts → msg91-sms-queue-options.d.ts} +1 -1
  110. package/dist/jobs/msg91-sms-queue-options.d.ts.map +1 -0
  111. package/dist/jobs/{sms-queue-options.js → msg91-sms-queue-options.js} +1 -1
  112. package/dist/jobs/msg91-sms-queue-options.js.map +1 -0
  113. package/dist/jobs/{otp-subscriber.service.d.ts → msg91-sms-subscriber.service.d.ts} +7 -7
  114. package/dist/jobs/msg91-sms-subscriber.service.d.ts.map +1 -0
  115. package/dist/jobs/{sms-subscriber.service.js → msg91-sms-subscriber.service.js} +14 -12
  116. package/dist/jobs/msg91-sms-subscriber.service.js.map +1 -0
  117. package/dist/jobs/twilio-sms-subscriber.service.d.ts +3 -3
  118. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -1
  119. package/dist/jobs/twilio-sms-subscriber.service.js +6 -4
  120. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -1
  121. package/dist/mappers/list-of-values-mapper.d.ts.map +1 -1
  122. package/dist/mappers/list-of-values-mapper.js +1 -1
  123. package/dist/mappers/list-of-values-mapper.js.map +1 -1
  124. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  125. package/dist/repository/security-rule.repository.js +7 -2
  126. package/dist/repository/security-rule.repository.js.map +1 -1
  127. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  128. package/dist/seeders/module-metadata-seeder.service.js +24 -2
  129. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  130. package/dist/seeders/seed-data/solid-core-metadata.json +71 -25
  131. package/dist/seeders/user-seeder.service.d.ts.map +1 -1
  132. package/dist/seeders/user-seeder.service.js +5 -4
  133. package/dist/seeders/user-seeder.service.js.map +1 -1
  134. package/dist/services/authentication.service.d.ts +6 -3
  135. package/dist/services/authentication.service.d.ts.map +1 -1
  136. package/dist/services/authentication.service.js +53 -18
  137. package/dist/services/authentication.service.js.map +1 -1
  138. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  139. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  140. package/dist/services/crud.service.d.ts +1 -2
  141. package/dist/services/crud.service.d.ts.map +1 -1
  142. package/dist/services/crud.service.js +6 -1
  143. package/dist/services/crud.service.js.map +1 -1
  144. package/dist/services/excel.service.d.ts +1 -0
  145. package/dist/services/excel.service.d.ts.map +1 -1
  146. package/dist/services/excel.service.js +4 -0
  147. package/dist/services/excel.service.js.map +1 -1
  148. package/dist/services/model-metadata.service.d.ts +28 -1
  149. package/dist/services/model-metadata.service.d.ts.map +1 -1
  150. package/dist/services/model-metadata.service.js +109 -2
  151. package/dist/services/model-metadata.service.js.map +1 -1
  152. package/dist/services/setting.service.d.ts.map +1 -1
  153. package/dist/services/setting.service.js +3 -45
  154. package/dist/services/setting.service.js.map +1 -1
  155. package/dist/services/sms/Msg91BaseSMSService.js +6 -6
  156. package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
  157. package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
  158. package/dist/services/sms/Msg91OTPService.js +3 -1
  159. package/dist/services/sms/Msg91OTPService.js.map +1 -1
  160. package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
  161. package/dist/services/sms/Msg91SMSService.js +3 -1
  162. package/dist/services/sms/Msg91SMSService.js.map +1 -1
  163. package/dist/services/sms/TwilioSMSService.d.ts.map +1 -1
  164. package/dist/services/sms/TwilioSMSService.js +2 -0
  165. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  166. package/dist/services/solid-introspect.service.d.ts +1 -0
  167. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  168. package/dist/services/solid-introspect.service.js +14 -0
  169. package/dist/services/solid-introspect.service.js.map +1 -1
  170. package/dist/services/user.service.d.ts +8 -1
  171. package/dist/services/user.service.d.ts.map +1 -1
  172. package/dist/services/user.service.js +15 -4
  173. package/dist/services/user.service.js.map +1 -1
  174. package/dist/solid-core-cli.module.js +1 -1
  175. package/dist/solid-core-cli.module.js.map +1 -1
  176. package/dist/solid-core.module.d.ts.map +1 -1
  177. package/dist/solid-core.module.js +29 -13
  178. package/dist/solid-core.module.js.map +1 -1
  179. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  180. package/dist/subscribers/scheduled-job.subscriber.js +1 -1
  181. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  182. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +2 -2
  183. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -1
  184. package/dist/transformers/typeorm/local-date-time-transformer.js +28 -6
  185. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -1
  186. package/dist/tsconfig.tsbuildinfo +1 -1
  187. package/package.json +1 -1
  188. package/src/config/cache.options.ts +6 -3
  189. package/src/config/iam.config.ts +2 -1
  190. package/src/controllers/model-metadata.controller.ts +21 -1
  191. package/src/controllers/setting.controller.ts +32 -36
  192. package/src/decorators/sms-provider.decorator.ts +7 -0
  193. package/src/dtos/create-role-metadata.dto.ts +3 -0
  194. package/src/dtos/navigation.dto.ts +14 -0
  195. package/src/dtos/sign-in.dto.ts +3 -3
  196. package/src/entities/common.entity.ts +7 -7
  197. package/src/entities/field-metadata.entity.ts +1 -1
  198. package/src/entities/legacy-common.entity.ts +6 -5
  199. package/src/entities/model-metadata.entity.ts +1 -1
  200. package/src/factories/mail.factory.ts +0 -1
  201. package/src/factories/sms.factory.ts +43 -0
  202. package/src/helpers/date.helper.ts +38 -9
  203. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +138 -4
  204. package/src/helpers/image-encoding.helper.ts +71 -0
  205. package/src/helpers/module.helper.ts +3 -0
  206. package/src/helpers/solid-microservice-adapter.service.ts +68 -0
  207. package/src/helpers/solid-registry.ts +9 -0
  208. package/src/index.ts +11 -6
  209. package/src/jobs/database/{sms-publisher-database.service.ts → msg91-sms-publisher-database.service.ts} +2 -2
  210. package/src/jobs/database/{sms-subscriber-database.service.ts → msg91-sms-subscriber-database.service.ts} +9 -4
  211. package/src/jobs/database/otp-subscriber-database.service.ts +8 -2
  212. package/src/jobs/database/twilio-sms-subscriber-database.service.ts +5 -2
  213. package/src/jobs/{otp-publisher.service.ts → msg91-otp-publisher.service.ts} +2 -2
  214. package/src/jobs/{otp-subscriber.service.ts → msg91-otp-subscriber.service.ts} +10 -4
  215. package/src/jobs/{sms-publisher.service.ts → msg91-sms-publisher.service.ts} +2 -2
  216. package/src/jobs/{sms-subscriber.service.ts → msg91-sms-subscriber.service.ts} +9 -4
  217. package/src/jobs/twilio-sms-subscriber.service.ts +6 -2
  218. package/src/mappers/list-of-values-mapper.ts +2 -1
  219. package/src/repository/security-rule.repository.ts +7 -2
  220. package/src/seeders/module-metadata-seeder.service.ts +33 -6
  221. package/src/seeders/seed-data/email-templates/email-on-signup.handlebars.html +155 -0
  222. package/src/seeders/seed-data/sms-templates/text-on-signup.handlebars.txt +10 -0
  223. package/src/seeders/seed-data/solid-core-metadata.json +72 -26
  224. package/src/seeders/user-seeder.service.ts +5 -4
  225. package/src/services/1.js +6 -0
  226. package/src/services/authentication.service.ts +80 -15
  227. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +1 -2
  228. package/src/services/crud.service.ts +23 -19
  229. package/src/services/excel.service.ts +6 -0
  230. package/src/services/model-metadata.service.ts +151 -0
  231. package/src/services/setting.service.ts +12 -52
  232. package/src/services/sms/Msg91BaseSMSService.ts +6 -6
  233. package/src/services/sms/Msg91OTPService.ts +3 -2
  234. package/src/services/sms/Msg91SMSService.ts +3 -1
  235. package/src/services/sms/TwilioSMSService.ts +3 -3
  236. package/src/services/solid-introspect.service.ts +22 -0
  237. package/src/services/user.service.ts +19 -0
  238. package/src/solid-core-cli.module.ts +2 -2
  239. package/src/solid-core.module.ts +33 -13
  240. package/src/subscribers/scheduled-job.subscriber.ts +9 -2
  241. package/src/transformers/typeorm/local-date-time-transformer.ts +38 -13
  242. package/dist/jobs/database/sms-publisher-database.service.d.ts.map +0 -1
  243. package/dist/jobs/database/sms-publisher-database.service.js.map +0 -1
  244. package/dist/jobs/database/sms-queue-database-options.d.ts.map +0 -1
  245. package/dist/jobs/database/sms-queue-database-options.js.map +0 -1
  246. package/dist/jobs/database/sms-subscriber-database.service.d.ts.map +0 -1
  247. package/dist/jobs/database/sms-subscriber-database.service.js.map +0 -1
  248. package/dist/jobs/otp-publisher.service.d.ts.map +0 -1
  249. package/dist/jobs/otp-publisher.service.js.map +0 -1
  250. package/dist/jobs/otp-queue-options.d.ts.map +0 -1
  251. package/dist/jobs/otp-queue-options.js.map +0 -1
  252. package/dist/jobs/otp-subscriber.service.d.ts.map +0 -1
  253. package/dist/jobs/otp-subscriber.service.js.map +0 -1
  254. package/dist/jobs/sms-publisher.service.d.ts.map +0 -1
  255. package/dist/jobs/sms-publisher.service.js.map +0 -1
  256. package/dist/jobs/sms-queue-options.d.ts.map +0 -1
  257. package/dist/jobs/sms-queue-options.js.map +0 -1
  258. package/dist/jobs/sms-subscriber.service.d.ts.map +0 -1
  259. package/dist/jobs/sms-subscriber.service.js.map +0 -1
  260. /package/src/jobs/database/{sms-queue-database-options.ts → msg91-sms-queue-database-options.ts} +0 -0
  261. /package/src/jobs/{otp-queue-options.ts → msg91-otp-queue-options.ts} +0 -0
  262. /package/src/jobs/{sms-queue-options.ts → msg91-sms-queue-options.ts} +0 -0
@@ -0,0 +1,71 @@
1
+ import { Injectable, Logger } from '@nestjs/common';
2
+
3
+ export interface ImageToBase64Result {
4
+ base64: string;
5
+ mediaType: string;
6
+ }
7
+
8
+ @Injectable()
9
+ export class ImageEncodingService {
10
+ private readonly logger = new Logger(ImageEncodingService.name);
11
+
12
+ /**
13
+ * Fetch an image from a URL and return its Base64 representation.
14
+ *
15
+ * @param url - Public or signed image URL
16
+ * @param mimeTypeOverride - Optional MIME type (image/png, image/jpeg)
17
+ * @param maxSizeBytes - Optional max size guard (default 5MB)
18
+ */
19
+ async imageUrlToBase64(
20
+ url: string,
21
+ mimeTypeOverride?: string,
22
+ maxSizeBytes = 5 * 1024 * 1024,
23
+ ): Promise<ImageToBase64Result> {
24
+ this.logger.debug(`Fetching image from URL: ${url}`);
25
+
26
+ const response = await fetch(url);
27
+
28
+ if (!response.ok) {
29
+ throw new Error(
30
+ `Failed to fetch image (${response.status} ${response.statusText})`,
31
+ );
32
+ }
33
+
34
+ const contentType =
35
+ mimeTypeOverride ||
36
+ response.headers.get('content-type') ||
37
+ 'image/jpeg';
38
+
39
+ const arrayBuffer = await response.arrayBuffer();
40
+ const buffer = Buffer.from(arrayBuffer);
41
+
42
+ if (buffer.length > maxSizeBytes) {
43
+ throw new Error(
44
+ `Image size ${buffer.length} bytes exceeds limit of ${maxSizeBytes} bytes`,
45
+ );
46
+ }
47
+
48
+ return {
49
+ base64: buffer.toString('base64'),
50
+ mediaType: contentType,
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Convenience method that returns a data URL
56
+ * (useful for OpenAI Responses API).
57
+ */
58
+ async imageUrlToDataUrl(
59
+ url: string,
60
+ mimeTypeOverride?: string,
61
+ maxSizeBytes?: number,
62
+ ): Promise<string> {
63
+ const { base64, mediaType } = await this.imageUrlToBase64(
64
+ url,
65
+ mimeTypeOverride,
66
+ maxSizeBytes,
67
+ );
68
+
69
+ return `data:${mediaType};base64,${base64}`;
70
+ }
71
+ }
@@ -32,6 +32,8 @@ export const getDynamicModuleNames = (): string[] => {
32
32
  .map(dirent => dirent.name);
33
33
 
34
34
  // logger.debug(`Enabled dynamic modules:`, enabledModules);
35
+ console.log(`Dynamic Modules Are:`, enabledModules);
36
+
35
37
  return enabledModules;
36
38
  }
37
39
 
@@ -65,6 +67,7 @@ export const getDynamicModuleNamesBasedOnMetadata = (): string[] => {
65
67
  .map(dirent => dirent.name);
66
68
 
67
69
  // logger.debug(`Enabled dynamic modules basis src:`, enabledModules);
70
+ console.log(`Src Based Dynamic Modules Are:`, enabledModules);
68
71
  return enabledModules;
69
72
  }
70
73
 
@@ -0,0 +1,68 @@
1
+ import { Injectable, Logger, Scope } from '@nestjs/common';
2
+ import axios from 'axios';
3
+
4
+ export interface SolidxIamAuthRequest {
5
+ email?: string;
6
+ username?: string;
7
+ password: string;
8
+ }
9
+
10
+ export interface SolidxIamUser {
11
+ email: string;
12
+ mobile: string;
13
+ username: string;
14
+ forcePasswordChange: boolean;
15
+ id: number;
16
+ roles: string[];
17
+ }
18
+
19
+ export interface SolidxIamAuthData {
20
+ user: SolidxIamUser;
21
+ accessToken: string;
22
+ refreshToken: string;
23
+ }
24
+
25
+ export interface SolidxIamAuthResponse {
26
+ statusCode: number;
27
+ message: string[];
28
+ error: string;
29
+ data: SolidxIamAuthData;
30
+ }
31
+
32
+ @Injectable({ scope: Scope.TRANSIENT })
33
+ export class SolidMicroserviceAdapter {
34
+ private readonly logger = new Logger(SolidMicroserviceAdapter.name);
35
+ private baseUrl?: string;
36
+
37
+ setBaseUrl(baseUrl: string): this {
38
+ this.baseUrl = baseUrl;
39
+ return this;
40
+ }
41
+
42
+ async authenticate({ email, username, password }: SolidxIamAuthRequest): Promise<SolidxIamAuthResponse> {
43
+ if (!password) {
44
+ throw new Error('password is required for IAM authentication');
45
+ }
46
+ if (!email && !username) {
47
+ throw new Error('email or username is required for IAM authentication');
48
+ }
49
+ if (!this.baseUrl) {
50
+ throw new Error('baseUrl must be set before IAM authentication');
51
+ }
52
+
53
+ const payload: SolidxIamAuthRequest = { password };
54
+ if (email) payload.email = email;
55
+ if (username) payload.username = username;
56
+
57
+ this.logger.debug(`Requesting IAM access token from ${this.baseUrl}/api/iam/authenticate`);
58
+
59
+ const response = await axios.post(`${this.baseUrl}/api/iam/authenticate`, payload, {
60
+ timeout: 10000,
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ },
64
+ });
65
+
66
+ return response.data as SolidxIamAuthResponse;
67
+ }
68
+ }
@@ -81,6 +81,7 @@ export class SolidRegistry {
81
81
  private dashboardQuestionDataProviders: Set<InstanceWrapper> = new Set();
82
82
  private mailProviders: Set<InstanceWrapper> = new Set();
83
83
  private whatsappProviders: Set<InstanceWrapper> = new Set();
84
+ private smsProviders: Set<InstanceWrapper> = new Set();
84
85
  private securityRuleConfigProviders: Set<InstanceWrapper> = new Set();
85
86
  private errorCodeProviders: Set<InstanceWrapper> = new Set();
86
87
 
@@ -92,6 +93,10 @@ export class SolidRegistry {
92
93
  this.whatsappProviders.add(whatsappProvider);
93
94
  }
94
95
 
96
+ registerSmsProvider(smsProvider: InstanceWrapper): void {
97
+ this.smsProviders.add(smsProvider);
98
+ }
99
+
95
100
  registerSecurityRuleConfigProvider(securityRuleConfigProvider: InstanceWrapper): void {
96
101
  this.securityRuleConfigProviders.add(securityRuleConfigProvider);
97
102
  }
@@ -148,6 +153,10 @@ export class SolidRegistry {
148
153
  return Array.from(this.whatsappProviders);
149
154
  }
150
155
 
156
+ getSmsProviders(): Array<InstanceWrapper> {
157
+ return Array.from(this.smsProviders);
158
+ }
159
+
151
160
  getSecurityRuleConfigProviders(): Array<InstanceWrapper> {
152
161
  return Array.from(this.securityRuleConfigProviders);
153
162
  }
package/src/index.ts CHANGED
@@ -24,6 +24,7 @@ export * from './decorators/solid-database-module.decorator'
24
24
  export * from './decorators/solid-service.decorator'
25
25
  export * from './decorators/mail-provider.decorator'
26
26
  export * from './decorators/security-rule-config-provider.decorator'
27
+ export * from './decorators/sms-provider.decorator'
27
28
 
28
29
  export * from './dtos/post-chatter-message.dto'
29
30
  export * from './dtos/security-rule-config.dto'
@@ -177,6 +178,8 @@ export * from './helpers/environment.helper'
177
178
  export * from './helpers/cors.helper'
178
179
  export * from './helpers/security.helper'
179
180
  export * from './helpers/model-metadata-helper.service'
181
+ export * from './helpers/image-encoding.helper'
182
+ export * from './helpers/solid-microservice-adapter.service'
180
183
 
181
184
  export * from './services/crud.service'
182
185
  export * from './interceptors/logging.interceptor'
@@ -194,12 +197,12 @@ export * from './jobs/api-email-subscriber.service'
194
197
  export { SmtpEmailQueuePublisherRabbitmq, SmtpEmailQueuePublisherRabbitmq as EmailQueuePublisher } from './jobs/smtp-email-publisher.service' // alias for backward compatibility
195
198
  export * from './jobs/smtp-email-queue-options'
196
199
  export { SmtpEmailQueueSubscriberRabbitmq, SmtpEmailQueueSubscriberRabbitmq as EmailQueueSubscriber } from './jobs/smtp-email-subscriber.service' // alias for backward compatibility
197
- export * from './jobs/otp-publisher.service'
198
- export * from './jobs/otp-queue-options'
199
- export * from './jobs/otp-subscriber.service'
200
- export * from './jobs/sms-publisher.service'
201
- export * from './jobs/sms-queue-options'
202
- export * from './jobs/sms-subscriber.service'
200
+ export * from './jobs/msg91-otp-publisher.service'
201
+ export * from './jobs/msg91-otp-queue-options'
202
+ export * from './jobs/msg91-otp-subscriber.service'
203
+ export * from './jobs/msg91-sms-publisher.service'
204
+ export * from './jobs/msg91-sms-queue-options'
205
+ export * from './jobs/msg91-sms-subscriber.service'
203
206
  export * from './jobs/msg91-whatsapp-publisher.service'
204
207
  export * from './jobs/msg91-whatsapp-queue-options'
205
208
  export * from './jobs/msg91-whatsapp-subscriber.service'
@@ -281,6 +284,8 @@ export * from './services/ai-interaction.service'
281
284
 
282
285
  // Factories
283
286
  export * from './factories/mail.factory'
287
+ export * from './factories/sms.factory'
288
+ export * from './factories/whatsapp.factory'
284
289
 
285
290
  // Repositories
286
291
  export * from './repository/solid-base.repository'
@@ -1,13 +1,13 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
 
3
- import smsQueueOptions from './sms-queue-database-options';
3
+ import smsQueueOptions from './msg91-sms-queue-database-options';
4
4
  import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
5
5
  import { MqMessageService } from 'src/services/mq-message.service';
6
6
  import { QueuesModuleOptions } from 'src/interfaces';
7
7
  import { DatabasePublisher } from 'src/services/queues/database-publisher.service';
8
8
 
9
9
  @Injectable()
10
- export class SmsQueuePublisherDatabase extends DatabasePublisher<any> {
10
+ export class Msg91SmsQueuePublisherDatabase extends DatabasePublisher<any> {
11
11
  constructor(
12
12
  protected readonly mqMessageService: MqMessageService,
13
13
  protected readonly mqMessageQueueService: MqMessageQueueService,
@@ -1,18 +1,20 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
 
3
3
  import { QueueMessage } from 'src/interfaces/mq';
4
- import smsQueueOptions from './sms-queue-database-options';
4
+ import smsQueueOptions from './msg91-sms-queue-database-options';
5
5
  import { MqMessageService } from 'src/services/mq-message.service';
6
6
  import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
7
7
  import { Msg91SMSService } from 'src/services/sms/Msg91SMSService';
8
8
  import { QueuesModuleOptions } from 'src/interfaces';
9
9
  import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';
10
10
  import { PollerService } from 'src/services/poller.service';
11
+ import { SmsFactory } from 'src/factories/sms.factory';
11
12
 
12
13
  @Injectable()
13
- export class SmsQueueSubscriberDatabase extends DatabaseSubscriber<any> {
14
+ export class Msg91SmsQueueSubscriberDatabase extends DatabaseSubscriber<any> {
14
15
  constructor(
15
- private readonly smsService: Msg91SMSService,
16
+ // private readonly smsService: Msg91SMSService,
17
+ private readonly smsFactory: SmsFactory,
16
18
  readonly mqMessageService: MqMessageService,
17
19
  readonly mqMessageQueueService: MqMessageQueueService,
18
20
  readonly poller: PollerService,
@@ -27,6 +29,9 @@ export class SmsQueueSubscriberDatabase extends DatabaseSubscriber<any> {
27
29
  }
28
30
 
29
31
  subscribe(message: QueueMessage<any>) {
30
- return this.smsService.sendSMSSynchronously(message);
32
+ const smsService: Msg91SMSService = this.smsFactory.getSmsService(Msg91SMSService.name) as Msg91SMSService;
33
+ return smsService.sendSMSSynchronously(message);
34
+
35
+ // return this.smsService.sendSMSSynchronously(message);
31
36
  }
32
37
  }
@@ -8,11 +8,14 @@ import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.serv
8
8
  import { Msg91OTPService } from 'src/services/sms/Msg91OTPService';
9
9
  import { QueuesModuleOptions } from 'src/interfaces';
10
10
  import { PollerService } from 'src/services/poller.service';
11
+ import { SmsFactory } from 'src/factories/sms.factory';
11
12
 
12
13
  @Injectable()
13
14
  export class OTPQueueSubscriberDatabase extends DatabaseSubscriber<any> {
14
15
  constructor(
15
- private readonly otpService: Msg91OTPService,
16
+ // private readonly otpService: Msg91OTPService,
17
+ private readonly smsFactory: SmsFactory,
18
+
16
19
  readonly mqMessageService: MqMessageService,
17
20
  readonly poller: PollerService,
18
21
  readonly mqMessageQueueService: MqMessageQueueService,
@@ -27,6 +30,9 @@ export class OTPQueueSubscriberDatabase extends DatabaseSubscriber<any> {
27
30
  }
28
31
 
29
32
  subscribe(message: QueueMessage<any>) {
30
- this.otpService.sendSMSSynchronously(message);
33
+ const otpService: Msg91OTPService = this.smsFactory.getSmsService(Msg91OTPService.name) as Msg91OTPService;
34
+ return otpService.sendSMSSynchronously(message);
35
+
36
+ // this.otpService.sendSMSSynchronously(message);
31
37
  }
32
38
  }
@@ -8,11 +8,13 @@ import { QueuesModuleOptions } from 'src/interfaces';
8
8
  import { DatabaseSubscriber } from 'src/services/queues/database-subscriber.service';
9
9
  import { TwilioSMSService } from 'src/services/sms/TwilioSMSService';
10
10
  import { PollerService } from 'src/services/poller.service';
11
+ import { SmsFactory } from 'src/factories/sms.factory';
11
12
 
12
13
  @Injectable()
13
14
  export class TwilioSmsQueueSubscriberDatabase extends DatabaseSubscriber<any> {
14
15
  constructor(
15
- private readonly smsService: TwilioSMSService,
16
+ // private readonly smsService: TwilioSMSService,
17
+ private readonly smsFactory: SmsFactory,
16
18
  readonly mqMessageService: MqMessageService,
17
19
  readonly mqMessageQueueService: MqMessageQueueService,
18
20
  readonly poller: PollerService,
@@ -27,6 +29,7 @@ export class TwilioSmsQueueSubscriberDatabase extends DatabaseSubscriber<any> {
27
29
  }
28
30
 
29
31
  subscribe(message: QueueMessage<any>) {
30
- return this.smsService.sendSMSSynchronously(message);
32
+ const smsService: TwilioSMSService = this.smsFactory.getSmsService(TwilioSMSService.name) as TwilioSMSService;
33
+ return smsService.sendSMSSynchronously(message);
31
34
  }
32
35
  }
@@ -1,13 +1,13 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
 
3
3
  import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
4
- import otpQueueOptions from './otp-queue-options';
4
+ import otpQueueOptions from './msg91-otp-queue-options';
5
5
  import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
6
6
  import { MqMessageService } from 'src/services/mq-message.service';
7
7
  import { QueuesModuleOptions } from "../interfaces";
8
8
 
9
9
  @Injectable()
10
- export class OTPQueuePublisher extends RabbitMqPublisher<any> {
10
+ export class Msg91OTPQueuePublisher extends RabbitMqPublisher<any> {
11
11
  constructor(
12
12
  protected readonly mqMessageService: MqMessageService,
13
13
  protected readonly mqMessageQueueService: MqMessageQueueService,
@@ -3,15 +3,18 @@ import { Injectable } from '@nestjs/common';
3
3
  import { QueueMessage } from 'src/interfaces/mq';
4
4
  import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
5
5
  import { Msg91OTPService } from '../services/sms/Msg91OTPService';
6
- import otpQueueOptions from './otp-queue-options';
6
+ import otpQueueOptions from './msg91-otp-queue-options';
7
7
  import { MqMessageService } from 'src/services/mq-message.service';
8
8
  import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
9
9
  import { QueuesModuleOptions } from "../interfaces";
10
+ import { SmsFactory } from 'src/factories/sms.factory';
10
11
 
11
12
  @Injectable()
12
- export class OTPQueueSubscriber extends RabbitMqSubscriber<any> {
13
+ export class Msg91OTPQueueSubscriber extends RabbitMqSubscriber<any> {
13
14
  constructor(
14
- private readonly otpService: Msg91OTPService,
15
+ // private readonly otpService: Msg91OTPService,
16
+ private readonly smsFactory: SmsFactory,
17
+
15
18
  readonly mqMessageService: MqMessageService,
16
19
  readonly mqMessageQueueService: MqMessageQueueService,
17
20
  ) {
@@ -25,6 +28,9 @@ export class OTPQueueSubscriber extends RabbitMqSubscriber<any> {
25
28
  }
26
29
 
27
30
  subscribe(message: QueueMessage<any>) {
28
- this.otpService.sendSMSSynchronously(message);
31
+ const otpService: Msg91OTPService = this.smsFactory.getSmsService(Msg91OTPService.name) as Msg91OTPService;
32
+ return otpService.sendSMSSynchronously(message);
33
+
34
+ // this.otpService.sendSMSSynchronously(message);
29
35
  }
30
36
  }
@@ -1,13 +1,13 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
 
3
3
  import { RabbitMqPublisher } from 'src/services/queues/rabbitmq-publisher.service';
4
- import smsQueueOptions from './sms-queue-options';
4
+ import smsQueueOptions from './msg91-sms-queue-options';
5
5
  import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
6
6
  import { MqMessageService } from 'src/services/mq-message.service';
7
7
  import { QueuesModuleOptions } from "../interfaces";
8
8
 
9
9
  @Injectable()
10
- export class SmsQueuePublisher extends RabbitMqPublisher<any> {
10
+ export class Msg91SmsQueuePublisher extends RabbitMqPublisher<any> {
11
11
  constructor(
12
12
  protected readonly mqMessageService: MqMessageService,
13
13
  protected readonly mqMessageQueueService: MqMessageQueueService,
@@ -2,16 +2,18 @@ import { Injectable } from '@nestjs/common';
2
2
 
3
3
  import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
4
4
  import { QueueMessage } from 'src/interfaces/mq';
5
- import smsQueueOptions from './sms-queue-options';
5
+ import smsQueueOptions from './msg91-sms-queue-options';
6
6
  import { Msg91SMSService } from '../services/sms/Msg91SMSService';
7
7
  import { MqMessageService } from 'src/services/mq-message.service';
8
8
  import { MqMessageQueueService } from 'src/services/mq-message-queue.service';
9
9
  import { QueuesModuleOptions } from "../interfaces";
10
+ import { SmsFactory } from 'src/factories/sms.factory';
10
11
 
11
12
  @Injectable()
12
- export class SmsQueueSubscriber extends RabbitMqSubscriber<any> {
13
+ export class Msg91SmsQueueSubscriber extends RabbitMqSubscriber<any> {
13
14
  constructor(
14
- private readonly smsService: Msg91SMSService,
15
+ // private readonly smsService: Msg91SMSService,
16
+ private readonly smsFactory: SmsFactory,
15
17
  readonly mqMessageService: MqMessageService,
16
18
  readonly mqMessageQueueService: MqMessageQueueService,
17
19
  ) {
@@ -25,6 +27,9 @@ export class SmsQueueSubscriber extends RabbitMqSubscriber<any> {
25
27
  }
26
28
 
27
29
  subscribe(message: QueueMessage<any>) {
28
- return this.smsService.sendSMSSynchronously(message);
30
+ const smsService: Msg91SMSService = this.smsFactory.getSmsService(Msg91SMSService.name) as Msg91SMSService;
31
+ return smsService.sendSMSSynchronously(message);
32
+
33
+ // return this.smsService.sendSMSSynchronously(message);
29
34
  }
30
35
  }
@@ -8,11 +8,13 @@ import { PollerService } from 'src/services/poller.service';
8
8
  import { TwilioSMSService } from 'src/services/sms/TwilioSMSService';
9
9
  import smsQueueOptions from './twilio-sms-queue-options';
10
10
  import { RabbitMqSubscriber } from 'src/services/queues/rabbitmq-subscriber.service';
11
+ import { SmsFactory } from 'src/factories/sms.factory';
11
12
 
12
13
  @Injectable()
13
14
  export class TwilioSmsQueueSubscriberRabbitmq extends RabbitMqSubscriber<any> {
14
15
  constructor(
15
- private readonly smsService: TwilioSMSService,
16
+ // private readonly smsService: TwilioSMSService,
17
+ private readonly smsFactory: SmsFactory,
16
18
  readonly mqMessageService: MqMessageService,
17
19
  readonly mqMessageQueueService: MqMessageQueueService,
18
20
  readonly poller: PollerService,
@@ -27,6 +29,8 @@ export class TwilioSmsQueueSubscriberRabbitmq extends RabbitMqSubscriber<any> {
27
29
  }
28
30
 
29
31
  subscribe(message: QueueMessage<any>) {
30
- return this.smsService.sendSMSSynchronously(message);
32
+ const smsService: TwilioSMSService = this.smsFactory.getSmsService(TwilioSMSService.name) as TwilioSMSService;
33
+ return smsService.sendSMSSynchronously(message);
34
+ // return this.smsService.sendSMSSynchronously(message);
31
35
  }
32
36
  }
@@ -11,7 +11,8 @@ export class ListOfValuesMapper {
11
11
  description: listOfValue.description,
12
12
  default: listOfValue.default,
13
13
  sequence: listOfValue.sequence,
14
- module: listOfValue.module ? listOfValue.module.id : null
14
+ // module: listOfValue.module ? listOfValue.module.id : null
15
+ moduleUserKey: listOfValue.module ? listOfValue.module.name : null
15
16
  };
16
17
  }
17
18
  }
@@ -43,6 +43,9 @@ export class SecurityRuleRepository extends SolidBaseRepository<SecurityRule> {
43
43
  if (rule.securityRuleConfigProvider) {
44
44
  // TODO: Evaluation of the securityRuleConfig Provider should happen outside first...
45
45
  const securityRuleConfigProviderInstance = this.solidRegistry.getSecurityRuleConfigProviderInstance(rule.securityRuleConfigProvider);
46
+ if (!securityRuleConfigProviderInstance) {
47
+ throw new Error(`Unable to resolve instance for security rule config provider: ${rule.securityRuleConfigProvider}`);
48
+ }
46
49
  evaluatedRule = await securityRuleConfigProviderInstance.securityRuleConfig(activeUser, rule);
47
50
  }
48
51
  else {
@@ -54,7 +57,9 @@ export class SecurityRuleRepository extends SolidBaseRepository<SecurityRule> {
54
57
  evaluatedRules.push(evaluatedRule);
55
58
 
56
59
  } catch (error) {
57
- this.logger.warn(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
60
+ this.logger.error(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
61
+ this.logger.error(error.stack);
62
+ throw error;
58
63
  }
59
64
  }
60
65
 
@@ -104,7 +109,7 @@ export class SecurityRuleRepository extends SolidBaseRepository<SecurityRule> {
104
109
  modelMetadataId: populatedSecurityRule.modelMetadata.id,
105
110
  modelMetadataUserKey: populatedSecurityRule.modelMetadata.singularName,
106
111
  securityRuleConfig: populatedSecurityRule.securityRuleConfig,
107
- securityRuleConfigProvider: ""
112
+ securityRuleConfigProvider: populatedSecurityRule.securityRuleConfigProvider,
108
113
  };
109
114
  }
110
115
 
@@ -1,6 +1,7 @@
1
1
  import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
2
  import * as fs from 'fs';
3
3
  import * as path from 'path';
4
+ import { v4 as uuidv4 } from 'uuid';
4
5
 
5
6
  import { CreateDashboardDto } from 'src/dtos/create-dashboard.dto';
6
7
  import { CreateEmailTemplateDto } from 'src/dtos/create-email-template.dto';
@@ -33,7 +34,7 @@ import { ViewMetadataService } from '../services/view-metadata.service';
33
34
  import solidCoreMetadata from './seed-data/solid-core-metadata.json';
34
35
  import { SystemFieldsSeederService } from './system-fields-seeder.service';
35
36
  // import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';
36
- import { ActionMetadata, MENU_ROLE_JOIN_TABLE_NAME, MENU_ROLE_JOIN_TABLE_NAME_MENU_COL, MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL, MenuItemMetadata, ModuleMetadata, RoleMetadata } from 'src';
37
+ import { ActionMetadata, MENU_ROLE_JOIN_TABLE_NAME, MENU_ROLE_JOIN_TABLE_NAME_MENU_COL, MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL, MenuItemMetadata, ModuleMetadata, RoleMetadata, SignUpDto } from 'src';
37
38
  import { ADMIN_ROLE_NAME, INTERNAL_ROLE_NAME, INTERNAL_ROLE_PERMISSIONS, PUBLIC_ROLE_NAME } from 'src/dtos/create-role-metadata.dto';
38
39
  import { CreateSavedFiltersDto } from 'src/dtos/create-saved-filters.dto';
39
40
  import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';
@@ -195,7 +196,9 @@ export class ModuleMetadataSeederService {
195
196
  // Setup default roles with permissions.
196
197
  await this.setupDefaultRolesWithPermissions();
197
198
 
198
- this.logger.log(`All Seeders finished`);
199
+ // Add a console log indicating seeding is finished. This needs to be console.log so that it looks proper when this code is run via CLI.
200
+ console.log(`Seeding completed.`);
201
+ //this.logger.log(`All Seeders finished`);
199
202
 
200
203
  //FIXME: Handle displaying the created users credentials in a better way.
201
204
  // this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
@@ -718,12 +721,36 @@ export class ModuleMetadataSeederService {
718
721
  }
719
722
 
720
723
  for (let l = 0; l < users.length; l++) {
721
- const user = users[l];
724
+ const user: SignUpDto = users[l];
722
725
  let exisitingUser = await this.userService.findOneByUsername(user.username);
723
726
  if (!exisitingUser) {
724
- exisitingUser = await this.authenticationService.signUp(user);
727
+ let generatedAdminPassword: string | null = null;
728
+ if (user.username === 'sa') {
729
+ generatedAdminPassword = uuidv4();
730
+ user.password = generatedAdminPassword;
731
+ }
725
732
 
726
- this.logger.log(`Newly created user is ${user}`);
733
+ exisitingUser = await this.authenticationService.signUp(user);
734
+ this.logger.log(`Newly created user ${user.username}`);
735
+
736
+ // Surface the generated SA password clearly to the operator.
737
+ if (generatedAdminPassword) {
738
+ const banner = [
739
+ '',
740
+ '============================================================',
741
+ ' SYSTEM ADMIN USER CREATED',
742
+ '------------------------------------------------------------',
743
+ ' Username : sa',
744
+ ` Password : ${generatedAdminPassword}`,
745
+ '',
746
+ ' Copy and store this password securely now.',
747
+ ' It is shown only once during seeding.',
748
+ '============================================================',
749
+ ''
750
+ ].join('\n');
751
+ // Use console.log to ensure visibility even if logger formatting changes.
752
+ console.log(banner);
753
+ }
727
754
  }
728
755
  //FIXME: Create the user roles assignment logic here.
729
756
  // now add Roles to user.
@@ -857,4 +884,4 @@ export class ModuleMetadataSeederService {
857
884
  }
858
885
  }
859
886
 
860
- }
887
+ }