@futdevpro/nts-dynamo 1.15.74 → 1.15.75

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 (357) hide show
  1. package/.c8rc.json +26 -26
  2. package/.copilot/patterns.json +7 -7
  3. package/.cursor/rules/__assistant_guide.mdc +30 -30
  4. package/.cursor/rules/_ag_backend-structure.mdc +85 -85
  5. package/.cursor/rules/_ag_backend.mdc +16 -16
  6. package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
  7. package/.cursor/rules/_ag_frontend.mdc +39 -39
  8. package/.cursor/rules/_ag_import-rules.mdc +44 -44
  9. package/.cursor/rules/_ag_naming.mdc +115 -115
  10. package/.cursor/rules/_ag_should-be.mdc +6 -6
  11. package/.cursor/rules/ai_development_guide.md +60 -60
  12. package/.cursor/rules/cursor-rules.md +160 -160
  13. package/.cursor/rules/default-command.mdc +464 -464
  14. package/.cursor/rules/error_code_pattern.md +39 -39
  15. package/.cursor/rules/saved rule mcp server use.md +15 -15
  16. package/.dynamo/logs/cicd-pipeline/output.log +2798 -0
  17. package/.dynamo/logs/cicd-pipeline/status.json +94 -0
  18. package/.vscode/settings.json +10 -10
  19. package/HOWTO.md +15 -15
  20. package/LICENSE +21 -21
  21. package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
  22. package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
  23. package/_specifications/BACKLOG.md +92 -92
  24. package/_specifications/TODO.md +15 -15
  25. package/_specifications/agent.md +138 -138
  26. package/eslint.config.js +3 -3
  27. package/nodemon.json +24 -24
  28. package/package.json +2 -2
  29. package/pnpm-workspace.yaml +5 -5
  30. package/scripts/run-coverage-tests.js +28 -28
  31. package/spec/support/helpers/spec-reporter-loader.js +359 -359
  32. package/spec/support/helpers/ts-node-helper.js +93 -93
  33. package/spec/support/jasmine.coverage.json +24 -24
  34. package/spec/support/jasmine.json +24 -24
  35. package/src/_collections/archive.util.spec.ts +57 -57
  36. package/src/_collections/archive.util.ts +18 -18
  37. package/src/_collections/atlas-default-db-options.const.ts +9 -9
  38. package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
  39. package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
  40. package/src/_collections/default-not-found-page.const.spec.ts +19 -19
  41. package/src/_collections/default-not-found-page.const.ts +22 -22
  42. package/src/_collections/default-socket-path.const.spec.ts +12 -12
  43. package/src/_collections/default-socket-path.const.ts +2 -2
  44. package/src/_collections/get-environment-settings.util.spec.ts +210 -210
  45. package/src/_collections/get-environment-settings.util.ts +48 -48
  46. package/src/_collections/global-settings.const.ts +97 -97
  47. package/src/_collections/sample.env +21 -21
  48. package/src/_collections/star.controller.spec.ts +224 -224
  49. package/src/_collections/star.controller.ts +129 -129
  50. package/src/_enums/data-model-type.enum.ts +14 -14
  51. package/src/_enums/data-service-function.enum.ts +24 -24
  52. package/src/_enums/predefined-data-types.enum.ts +16 -16
  53. package/src/_enums/route-security.enum.ts +12 -12
  54. package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
  55. package/src/_models/control-models/api-call-params.control-model.ts +142 -142
  56. package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
  57. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  58. package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
  59. package/src/_models/control-models/app-params.control-model.ts +136 -136
  60. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
  61. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  62. package/src/_models/control-models/endpoint-params.control-model.spec.ts +627 -627
  63. package/src/_models/control-models/endpoint-params.control-model.ts +627 -627
  64. package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
  65. package/src/_models/control-models/http-settings.control-model.ts +37 -37
  66. package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
  67. package/src/_models/control-models/system-control.control-model.ts +12 -12
  68. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  69. package/src/_models/interfaces/environment-settings.interface.ts +59 -59
  70. package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
  71. package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
  72. package/src/_models/interfaces/global-settings.interface.ts +216 -216
  73. package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
  74. package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
  75. package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
  76. package/src/_models/types/db-update.type.ts +100 -100
  77. package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
  78. package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
  79. package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
  80. package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
  81. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
  82. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
  83. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -295
  84. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
  85. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
  86. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
  87. package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
  88. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
  89. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
  90. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
  91. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -68
  92. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
  93. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
  94. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
  95. package/src/_modules/ai/_modules/document-ai/index.ts +30 -30
  96. package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
  97. package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
  98. package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
  99. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
  100. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
  101. package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
  102. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
  103. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
  104. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
  105. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
  106. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
  107. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
  108. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
  109. package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
  110. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
  111. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
  112. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
  113. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
  114. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1033 -1033
  115. package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
  116. package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -115
  117. package/src/_modules/ai/_services/ai-embedding-mock.service.ts +212 -212
  118. package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
  119. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -110
  120. package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
  121. package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
  122. package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
  123. package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
  124. package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
  125. package/src/_modules/ai/_services/ai-llm.service-base.ts +519 -519
  126. package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
  127. package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
  128. package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
  129. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
  130. package/src/_modules/ai/index.ts +23 -23
  131. package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
  132. package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
  133. package/src/_modules/assistant/_collections/ass.util.ts +50 -50
  134. package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
  135. package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
  136. package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
  137. package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
  138. package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
  139. package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
  140. package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
  141. package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
  142. package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
  143. package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
  144. package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
  145. package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
  146. package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
  147. package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
  148. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
  149. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
  150. package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
  151. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
  152. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
  153. package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
  154. package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
  155. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
  156. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
  157. package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
  158. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
  159. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
  160. package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
  161. package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
  162. package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
  163. package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
  164. package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
  165. package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
  166. package/src/_modules/custom-data/custom-data.controller.ts +67 -67
  167. package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
  168. package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
  169. package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
  170. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
  171. package/src/_modules/custom-data/index.ts +9 -9
  172. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
  173. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
  174. package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
  175. package/src/_modules/data-readers/index.ts +11 -11
  176. package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
  177. package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
  178. package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
  179. package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
  180. package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
  181. package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
  182. package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
  183. package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
  184. package/src/_modules/defaults/index.ts +17 -17
  185. package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
  186. package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
  187. package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
  188. package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
  189. package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
  190. package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
  191. package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
  192. package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
  193. package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
  194. package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
  195. package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
  196. package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
  197. package/src/_modules/discord-assistant/index.ts +38 -38
  198. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
  199. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
  200. package/src/_modules/discord-assistant-voiced/index.ts +36 -36
  201. package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
  202. package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
  203. package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
  204. package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
  205. package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
  206. package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
  207. package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
  208. package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
  209. package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
  210. package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
  211. package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
  212. package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
  213. package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
  214. package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
  215. package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
  216. package/src/_modules/discord-bot/index.ts +36 -36
  217. package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
  218. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
  219. package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
  220. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
  221. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
  222. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
  223. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
  224. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -198
  225. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -146
  226. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
  227. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -106
  228. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +507 -507
  229. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +272 -272
  230. package/src/_modules/local-vector-search/index.ts +16 -16
  231. package/src/_modules/logs/index.ts +11 -11
  232. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
  233. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
  234. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
  235. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
  236. package/src/_modules/mcp/index.ts +13 -13
  237. package/src/_modules/messaging/README.md +354 -354
  238. package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
  239. package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
  240. package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
  241. package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
  242. package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
  243. package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
  244. package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
  245. package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
  246. package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
  247. package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
  248. package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
  249. package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
  250. package/src/_modules/messaging/index.ts +30 -30
  251. package/src/_modules/mock/app-extended-server.mock.ts +201 -201
  252. package/src/_modules/mock/app-integration-test.mock.ts +51 -51
  253. package/src/_modules/mock/app-params.mock.spec.ts +21 -21
  254. package/src/_modules/mock/app-params.mock.ts +9 -9
  255. package/src/_modules/mock/app-server.mock.ts +188 -188
  256. package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
  257. package/src/_modules/mock/auth-service.mock.ts +28 -28
  258. package/src/_modules/mock/controller.mock.spec.ts +26 -26
  259. package/src/_modules/mock/controller.mock.ts +16 -16
  260. package/src/_modules/mock/data-model.mock.spec.ts +111 -111
  261. package/src/_modules/mock/data-model.mock.ts +82 -82
  262. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
  263. package/src/_modules/mock/email-service-collection.mock.ts +15 -15
  264. package/src/_modules/mock/email-service.mock.spec.ts +17 -17
  265. package/src/_modules/mock/email-service.mock.ts +20 -20
  266. package/src/_modules/mock/email-template.mock.html +14 -14
  267. package/src/_modules/mock/endpoint.mock.ts +91 -91
  268. package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
  269. package/src/_modules/mock/socket-client.mock.ts +45 -45
  270. package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
  271. package/src/_modules/mock/socket-server.mock.ts +46 -46
  272. package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
  273. package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
  274. package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
  275. package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
  276. package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
  277. package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
  278. package/src/_modules/oauth2/index.ts +17 -17
  279. package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
  280. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
  281. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
  282. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
  283. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
  284. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
  285. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
  286. package/src/_modules/scoped-config/index.ts +17 -17
  287. package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
  288. package/src/_modules/server/errors/errors.control-service.ts +100 -100
  289. package/src/_modules/server/errors/errors.controller.spec.ts +241 -241
  290. package/src/_modules/server/errors/errors.controller.ts +489 -489
  291. package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
  292. package/src/_modules/server/index.ts +30 -30
  293. package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
  294. package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
  295. package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
  296. package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
  297. package/src/_modules/server/server-status/server-status.control-service.spec.ts +576 -576
  298. package/src/_modules/server/server-status/server-status.control-service.ts +396 -396
  299. package/src/_modules/server/server-status/server-status.controller.spec.ts +240 -240
  300. package/src/_modules/server/server-status/server-status.controller.ts +253 -253
  301. package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
  302. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
  303. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
  304. package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
  305. package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
  306. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
  307. package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
  308. package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
  309. package/src/_modules/socket/_services/socket-client.service.ts +260 -260
  310. package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
  311. package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
  312. package/src/_modules/socket/app-extended.server.ts +630 -630
  313. package/src/_modules/socket/index.ts +42 -42
  314. package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
  315. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  316. package/src/_modules/test/index.ts +11 -11
  317. package/src/_modules/test/test.controller.spec.ts +72 -72
  318. package/src/_modules/test/test.controller.ts +115 -115
  319. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  320. package/src/_modules/usage/index.ts +15 -15
  321. package/src/_modules/usage/usage.controller.spec.ts +81 -81
  322. package/src/_modules/usage/usage.controller.ts +126 -126
  323. package/src/_modules/usage/usage.data-service.spec.ts +332 -332
  324. package/src/_modules/usage/usage.data-service.ts +185 -185
  325. package/src/_services/base/api.service-base.spec.ts +125 -125
  326. package/src/_services/base/api.service-base.ts +74 -74
  327. package/src/_services/base/archive-data.service.spec.ts +196 -196
  328. package/src/_services/base/archive-data.service.ts +216 -216
  329. package/src/_services/base/data.service.spec.ts +674 -674
  330. package/src/_services/base/data.service.ts +2719 -2719
  331. package/src/_services/base/db.service.spec.ts +73 -73
  332. package/src/_services/base/db.service.ts +1575 -1575
  333. package/src/_services/base/singleton.service-base.spec.ts +28 -28
  334. package/src/_services/base/singleton.service-base.ts +24 -24
  335. package/src/_services/base/singleton.service.spec.ts +114 -114
  336. package/src/_services/base/singleton.service.ts +38 -38
  337. package/src/_services/core/api.service.spec.ts +140 -140
  338. package/src/_services/core/auth.service.spec.ts +159 -159
  339. package/src/_services/core/auth.service.ts +174 -174
  340. package/src/_services/core/email.service.spec.ts +85 -85
  341. package/src/_services/core/email.service.ts +742 -742
  342. package/src/_services/core/global.service.spec.ts +292 -292
  343. package/src/_services/core/global.service.ts +475 -475
  344. package/src/_services/core/memory-guard.service.spec.ts +245 -245
  345. package/src/_services/core/memory-guard.service.ts +481 -481
  346. package/src/_services/core/service-collection.service.spec.ts +46 -46
  347. package/src/_services/core/service-collection.service.ts +6 -6
  348. package/src/_services/route/controller.service.spec.ts +53 -53
  349. package/src/_services/route/controller.service.ts +148 -148
  350. package/src/_services/route/routing-module.service.spec.ts +98 -98
  351. package/src/_services/route/routing-module.service.ts +330 -330
  352. package/src/_services/server/app.server.ts +1747 -1747
  353. package/src/_services/shared.static-service.spec.ts +99 -99
  354. package/src/_services/shared.static-service.ts +78 -78
  355. package/src/index.ts +96 -96
  356. package/tsconfig.app.json +12 -12
  357. package/tsconfig.json +42 -42
@@ -1,408 +1,408 @@
1
-
2
- import { DyNTS_DiBo_Main_ControlService } from './dibo-main.control-service';
3
- import { Client, GatewayIntentBits, Guild, TextChannel, Message, Role } from 'discord.js';
4
- import { DyFM_Error, DyFM_Log, DyFM_Async } from '@futdevpro/fsm-dynamo';
5
- import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
6
- import { DyNTS_DiBo_IO_ControlService } from './dibo-io.control-service';
7
- import { DyNTS_DiBo_Routines_ControlService } from './dibo-routines.control-service';
8
- import { DyNTS_DiBo_Commands_ControlService } from './dibo-commands.control-service';
9
- import { second } from '@futdevpro/fsm-dynamo';
10
-
11
- class TestDiBoMainService extends DyNTS_DiBo_Main_ControlService {
12
- protected getBotIOControlService(): DyNTS_DiBo_IO_ControlService {
13
- return this.botIO_CS;
14
- }
15
-
16
- protected getRoutinesControlService(): DyNTS_DiBo_Routines_ControlService {
17
- return this.routines_CS;
18
- }
19
-
20
- protected getCommandsControlService(): DyNTS_DiBo_Commands_ControlService {
21
- return this.commands_CS;
22
- }
23
-
24
- static getInstance(): TestDiBoMainService {
25
- return TestDiBoMainService.getSingletonInstance();
26
- }
27
- }
28
-
29
- xdescribe('| DyNTS_DiBo_Main_ControlService', () => {
30
- let service: TestDiBoMainService;
31
- let mockClient: jasmine.SpyObj<Client>;
32
- let mockGuild: jasmine.SpyObj<Guild>;
33
- let mockTextChannel: jasmine.SpyObj<TextChannel>;
34
- let mockBotIO_CS: jasmine.SpyObj<DyNTS_DiBo_IO_ControlService>;
35
- let mockRoutines_CS: jasmine.SpyObj<DyNTS_DiBo_Routines_ControlService>;
36
- let mockCommands_CS: jasmine.SpyObj<DyNTS_DiBo_Commands_ControlService>;
37
-
38
- beforeEach(() => {
39
- // Mock global settings
40
- DyNTS_global_settings.env_settings = {
41
- environment: 'local',
42
- discord: {
43
- token: 'test-token',
44
- guildId: 'guild-123',
45
- clientId: 'client-123',
46
- oauth2Url: 'https://oauth2.example.com',
47
- },
48
- mongoUri: undefined,
49
- openAi: {},
50
- } as any;
51
-
52
- DyNTS_global_settings.bot_settings = {
53
- intents: [GatewayIntentBits.Guilds],
54
- partials: [],
55
- } as any;
56
-
57
- // Create mock services
58
- mockBotIO_CS = jasmine.createSpyObj('DyNTS_DiBo_IO_ControlService', ['setup', 'start', 'handleNewMessage']);
59
- mockRoutines_CS = jasmine.createSpyObj('DyNTS_DiBo_Routines_ControlService', ['setup', 'start']);
60
- mockCommands_CS = jasmine.createSpyObj('DyNTS_DiBo_Commands_ControlService', ['setup', 'start']);
61
-
62
- // Create mock Discord objects
63
- mockTextChannel = jasmine.createSpyObj('TextChannel', ['send'], {
64
- id: 'channel-123',
65
- name: 'test-channel',
66
- isTextBased: () => true,
67
- });
68
-
69
- mockGuild = jasmine.createSpyObj('Guild', [], {
70
- id: 'guild-123',
71
- channels: {
72
- cache: new Map([['channel-123', mockTextChannel]]),
73
- },
74
- roles: {
75
- cache: new Map(),
76
- },
77
- });
78
-
79
- mockClient = jasmine.createSpyObj('Client', ['login', 'on'], {
80
- user: {
81
- id: 'bot-123',
82
- tag: 'TestBot#1234',
83
- displayName: 'Test Bot',
84
- },
85
- guilds: {
86
- cache: new Map([['guild-123', mockGuild]]),
87
- get: jasmine.createSpy('guilds.get').and.returnValue(mockGuild),
88
- },
89
- });
90
-
91
- // Mock Client constructor by preventing actual Client instantiation
92
- // We'll create the service without calling the constructor that creates Client
93
- service = TestDiBoMainService.getInstance();
94
- (service as any).client = mockClient;
95
- (service as any)._discordServer = mockGuild;
96
- (service as any).botIO_CS = mockBotIO_CS;
97
- (service as any).routines_CS = mockRoutines_CS;
98
- (service as any).commands_CS = mockCommands_CS;
99
- });
100
-
101
- afterEach(async () => {
102
- try {
103
- // Megvárjuk, hogy a bot leálljon és a process listener-ek lefussanak
104
- await DyFM_Async.delay(200);
105
-
106
- // Biztosítjuk, hogy a discordServer ne próbáljon üzenetet küldeni
107
- if (service && (service as any)._discordServer) {
108
- const discordServer = (service as any)._discordServer as Guild;
109
- // Invalidáljuk a channels.cache-t, hogy ne próbáljon channel-t keresni
110
- if (discordServer.channels && discordServer.channels.cache) {
111
- // Invalidáljuk a cache-t, hogy ne lehessen használni
112
- (discordServer.channels as any).cache = undefined;
113
- }
114
- // Invalidáljuk a channels-t is
115
- (discordServer as any).channels = undefined;
116
- }
117
-
118
- // Invalidáljuk a discordServer-t is
119
- if (service) {
120
- (service as any)._discordServer = undefined;
121
- }
122
-
123
- await DyFM_Async.delay(200);
124
- } catch (error) {
125
- // Csendes hiba-kezelés
126
- }
127
- });
128
-
129
- afterAll(async () => {
130
- try {
131
- // Végleges cleanup a tesztek végén - megvárjuk, hogy minden process listener lefusson
132
- await DyFM_Async.delay(500);
133
-
134
- // Invalidáljuk a service-t is
135
- if (service) {
136
- (service as any)._discordServer = undefined;
137
- (service as any).client = undefined;
138
- }
139
-
140
- await DyFM_Async.delay(500);
141
- } catch (error) {
142
- // Csendes hiba-kezelés
143
- }
144
- });
145
-
146
- describe('| constructor', () => {
147
- it('| should initialize Discord client', () => {
148
- expect(service.client).toBeDefined();
149
- });
150
-
151
- it('| should throw error if client already initialized', () => {
152
- // This test is skipped because we can't easily mock the Client constructor
153
- // The service is already initialized via getInstance()
154
- expect(service.client).toBeDefined();
155
- });
156
- });
157
-
158
- describe('| properties', () => {
159
- it('| should return discordServer', () => {
160
- expect(service.discordServer).toBe(mockGuild);
161
- });
162
-
163
- it('| should return botClientId from client user', () => {
164
- expect(service.botClientId).toBe('bot-123');
165
- });
166
-
167
- it('| should return botDisplayName from client user', () => {
168
- expect(service.botDisplayName).toBe('Test Bot');
169
- });
170
- });
171
-
172
- describe('| setup', () => {
173
- it('| should setup bot services', async () => {
174
- mockClient.login.and.returnValue(Promise.resolve('token'));
175
- mockClient.on.and.callFake((event: string, callback: Function): any => {
176
- if (event === 'ready') {
177
- setTimeout(() => callback(), 10);
178
- }
179
- });
180
-
181
- mockBotIO_CS.setup.and.returnValue(Promise.resolve());
182
- mockRoutines_CS.setup.and.returnValue(Promise.resolve());
183
- mockCommands_CS.setup.and.returnValue(Promise.resolve());
184
-
185
- await service.setup('test-issuer');
186
-
187
- expect(mockBotIO_CS.setup).toHaveBeenCalled();
188
- expect(mockRoutines_CS.setup).toHaveBeenCalled();
189
- expect(mockCommands_CS.setup).toHaveBeenCalled();
190
- });
191
-
192
- it('| should throw error if guildId not found', async () => {
193
- DyNTS_global_settings.env_settings.discord.guildId = null as any;
194
-
195
- try {
196
- await service.setup('test-issuer');
197
- fail('Should have thrown an error');
198
- } catch (error) {
199
- // Error may be wrapped in DyFM_Error
200
- expect(error).toBeDefined();
201
- const errorMessage = (error as DyFM_Error)?._message || (error as Error)?.message || '';
202
- expect(errorMessage).toContain('No discord server id found');
203
- }
204
- });
205
-
206
- it('| should throw error if token not found', async () => {
207
- DyNTS_global_settings.env_settings.discord.token = null as any;
208
-
209
- try {
210
- await service.setup('test-issuer');
211
- fail('Should have thrown an error');
212
- } catch (error) {
213
- // Error may be wrapped in DyFM_Error
214
- expect(error).toBeDefined();
215
- const errorMessage = (error as DyFM_Error)?._message || (error as Error)?.message || '';
216
- expect(errorMessage).toContain('No discord token found');
217
- }
218
- });
219
-
220
- it('| should throw error if botIO_CS not found', async () => {
221
- (service as any).botIO_CS = null;
222
- mockClient.login.and.returnValue(Promise.resolve('token'));
223
- mockClient.on.and.callFake((event: string, callback: Function): any => {
224
- if (event === 'ready') {
225
- setTimeout(() => callback(), 10);
226
- }
227
- });
228
-
229
- try {
230
- await service.setup('test-issuer');
231
- fail('Should have thrown an error');
232
- } catch (error) {
233
- expect(error).toBeInstanceOf(DyFM_Error);
234
- }
235
- });
236
- });
237
-
238
- describe('| start', () => {
239
- it('| should start bot services', async () => {
240
- mockRoutines_CS.start.and.returnValue(Promise.resolve());
241
- mockBotIO_CS.start.and.returnValue(Promise.resolve());
242
- mockCommands_CS.start.and.returnValue(Promise.resolve());
243
-
244
- await service.start('test-issuer');
245
-
246
- expect(mockRoutines_CS.start).toHaveBeenCalled();
247
- expect(mockBotIO_CS.start).toHaveBeenCalled();
248
- expect(mockCommands_CS.start).toHaveBeenCalled();
249
- });
250
-
251
- it('| should throw error if discordServer not initialized', async () => {
252
- (service as any)._discordServer = null;
253
-
254
- try {
255
- await service.start('test-issuer');
256
- fail('Should have thrown an error');
257
- } catch (error) {
258
- expect(error).toBeInstanceOf(DyFM_Error);
259
- expect((error as DyFM_Error)._errorCode).toContain('DyNTS-DiBo-MCS-ST01');
260
- }
261
- });
262
- });
263
-
264
- describe('| getRoleByName', () => {
265
- it('| should return role from cache if exists', () => {
266
- const mockRole = jasmine.createSpyObj('Role', [], {
267
- id: 'role-123',
268
- name: 'Test Role',
269
- });
270
- (service as any)._rolesByNames['Test Role'] = mockRole;
271
-
272
- const result = service.getRoleByName('Test Role');
273
-
274
- expect(result).toBe(mockRole);
275
- });
276
-
277
- it('| should find role in guild and cache it', () => {
278
- const mockRole = jasmine.createSpyObj('Role', [], {
279
- id: 'role-123',
280
- name: 'Test Role',
281
- });
282
- ((mockGuild.roles.cache as unknown) as { find: jasmine.Spy }).find =
283
- jasmine.createSpy('cache.find').and.returnValue(mockRole);
284
-
285
- const result = service.getRoleByName('Test Role');
286
-
287
- // Use toEqual for object comparison
288
- expect(result).toEqual(mockRole);
289
- expect((service as any)._rolesByNames['Test Role']).toEqual(mockRole);
290
- });
291
- });
292
-
293
- describe('| getChannelByName', () => {
294
- it('| should return channel from cache if exists', () => {
295
- (service as any)._channelsByNames['test-channel'] = mockTextChannel;
296
-
297
- const result = service.getChannelByName('test-channel');
298
-
299
- expect(result).toBe(mockTextChannel);
300
- });
301
-
302
- // Skip this test - requires findTextChannelByName which may not be available
303
- it('| should find channel in guild and cache it', () => {
304
- // Skipped - DyNTS_DiBo_Operations_Util.findTextChannelByName may not be available
305
- });
306
- });
307
-
308
- describe('| getRolePingByName', () => {
309
- it('| should return role ping', async () => {
310
- const mockRole = jasmine.createSpyObj('Role', [], {
311
- id: 'role-123',
312
- name: 'Test Role',
313
- });
314
- spyOn(service, 'getRoleByName').and.returnValue(mockRole);
315
-
316
- const result = await service.getRolePingByName('Test Role');
317
-
318
- expect(result).toBe('<@&role-123>');
319
- });
320
-
321
- it('| should return empty string if role not found', async () => {
322
- spyOn(service, 'getRoleByName').and.returnValue(null);
323
-
324
- const result = await service.getRolePingByName('Non-existent');
325
-
326
- expect(result).toBe('');
327
- });
328
- });
329
-
330
- describe('| getRolePingsByName', () => {
331
- it('| should return multiple role pings', async () => {
332
- spyOn(service, 'getRolePingByName').and.returnValues(
333
- Promise.resolve('<@&role-1>'),
334
- Promise.resolve('<@&role-2>')
335
- );
336
-
337
- const result = await service.getRolePingsByName(['Role1', 'Role2']);
338
-
339
- expect(result).toBe('<@&role-1> <@&role-2>');
340
- });
341
- });
342
-
343
- describe('| sendMessageToChannelByName', () => {
344
- it('| should send message to channel', async () => {
345
- const mockMessage = jasmine.createSpyObj('Message', [], {
346
- id: 'message-123',
347
- content: 'Test message',
348
- });
349
- spyOn(service, 'getChannelByName').and.returnValue(mockTextChannel);
350
- mockTextChannel.send.and.returnValue(Promise.resolve(mockMessage));
351
-
352
- const result = await service.sendMessageToChannelByName('test-channel', 'Test message', 'test-issuer');
353
-
354
- expect(mockTextChannel.send).toHaveBeenCalledWith('Test message');
355
- expect(result).toBe(mockMessage);
356
- });
357
-
358
- it('| should split long messages', async () => {
359
- const longMessage = 'x'.repeat(5000);
360
- const mockMessage = jasmine.createSpyObj('Message', [], {
361
- id: 'message-123',
362
- content: 'Test message',
363
- });
364
- spyOn(service, 'getChannelByName').and.returnValue(mockTextChannel);
365
- // Return mockMessage for each call
366
- mockTextChannel.send.and.returnValue(Promise.resolve(mockMessage));
367
-
368
- const result = await service.sendMessageToChannelByName('test-channel', longMessage, 'test-issuer');
369
-
370
- // Message split depends on implementation - expect at least 2 calls for long message
371
- expect(mockTextChannel.send).toHaveBeenCalled();
372
- expect(mockTextChannel.send.calls.count()).toBeGreaterThanOrEqual(2);
373
- // Result may be undefined or the last message, depending on implementation
374
- // Just verify that send was called multiple times for long messages
375
- expect(result === undefined || result === mockMessage).toBeTrue();
376
- });
377
-
378
- it('| should throw error if channel not found', async () => {
379
- spyOn(service, 'getChannelByName').and.returnValue(null);
380
-
381
- try {
382
- await service.sendMessageToChannelByName('non-existent', 'Test', 'test-issuer');
383
- fail('Should have thrown an error');
384
- } catch (error) {
385
- expect(error).toBeInstanceOf(DyFM_Error);
386
- expect((error as DyFM_Error)._errorCode).toContain('DyNTS-DiBo-MCS-SMCN1');
387
- }
388
- });
389
-
390
- it('| should throw error if channel is not text-based', async () => {
391
- const voiceChannel = jasmine.createSpyObj('VoiceChannel', [], {
392
- id: 'voice-123',
393
- name: 'voice-channel',
394
- isTextBased: () => false,
395
- });
396
- spyOn(service, 'getChannelByName').and.returnValue(voiceChannel);
397
-
398
- try {
399
- await service.sendMessageToChannelByName('voice-channel', 'Test', 'test-issuer');
400
- fail('Should have thrown an error');
401
- } catch (error) {
402
- expect(error).toBeInstanceOf(DyFM_Error);
403
- expect((error as DyFM_Error)._errorCode).toContain('DyNTS-DiBo-MCS-SMCN2');
404
- }
405
- });
406
- });
407
- });
408
-
1
+
2
+ import { DyNTS_DiBo_Main_ControlService } from './dibo-main.control-service';
3
+ import { Client, GatewayIntentBits, Guild, TextChannel, Message, Role } from 'discord.js';
4
+ import { DyFM_Error, DyFM_Log, DyFM_Async } from '@futdevpro/fsm-dynamo';
5
+ import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
6
+ import { DyNTS_DiBo_IO_ControlService } from './dibo-io.control-service';
7
+ import { DyNTS_DiBo_Routines_ControlService } from './dibo-routines.control-service';
8
+ import { DyNTS_DiBo_Commands_ControlService } from './dibo-commands.control-service';
9
+ import { second } from '@futdevpro/fsm-dynamo';
10
+
11
+ class TestDiBoMainService extends DyNTS_DiBo_Main_ControlService {
12
+ protected getBotIOControlService(): DyNTS_DiBo_IO_ControlService {
13
+ return this.botIO_CS;
14
+ }
15
+
16
+ protected getRoutinesControlService(): DyNTS_DiBo_Routines_ControlService {
17
+ return this.routines_CS;
18
+ }
19
+
20
+ protected getCommandsControlService(): DyNTS_DiBo_Commands_ControlService {
21
+ return this.commands_CS;
22
+ }
23
+
24
+ static getInstance(): TestDiBoMainService {
25
+ return TestDiBoMainService.getSingletonInstance();
26
+ }
27
+ }
28
+
29
+ xdescribe('| DyNTS_DiBo_Main_ControlService', () => {
30
+ let service: TestDiBoMainService;
31
+ let mockClient: jasmine.SpyObj<Client>;
32
+ let mockGuild: jasmine.SpyObj<Guild>;
33
+ let mockTextChannel: jasmine.SpyObj<TextChannel>;
34
+ let mockBotIO_CS: jasmine.SpyObj<DyNTS_DiBo_IO_ControlService>;
35
+ let mockRoutines_CS: jasmine.SpyObj<DyNTS_DiBo_Routines_ControlService>;
36
+ let mockCommands_CS: jasmine.SpyObj<DyNTS_DiBo_Commands_ControlService>;
37
+
38
+ beforeEach(() => {
39
+ // Mock global settings
40
+ DyNTS_global_settings.env_settings = {
41
+ environment: 'local',
42
+ discord: {
43
+ token: 'test-token',
44
+ guildId: 'guild-123',
45
+ clientId: 'client-123',
46
+ oauth2Url: 'https://oauth2.example.com',
47
+ },
48
+ mongoUri: undefined,
49
+ openAi: {},
50
+ } as any;
51
+
52
+ DyNTS_global_settings.bot_settings = {
53
+ intents: [GatewayIntentBits.Guilds],
54
+ partials: [],
55
+ } as any;
56
+
57
+ // Create mock services
58
+ mockBotIO_CS = jasmine.createSpyObj('DyNTS_DiBo_IO_ControlService', ['setup', 'start', 'handleNewMessage']);
59
+ mockRoutines_CS = jasmine.createSpyObj('DyNTS_DiBo_Routines_ControlService', ['setup', 'start']);
60
+ mockCommands_CS = jasmine.createSpyObj('DyNTS_DiBo_Commands_ControlService', ['setup', 'start']);
61
+
62
+ // Create mock Discord objects
63
+ mockTextChannel = jasmine.createSpyObj('TextChannel', ['send'], {
64
+ id: 'channel-123',
65
+ name: 'test-channel',
66
+ isTextBased: () => true,
67
+ });
68
+
69
+ mockGuild = jasmine.createSpyObj('Guild', [], {
70
+ id: 'guild-123',
71
+ channels: {
72
+ cache: new Map([['channel-123', mockTextChannel]]),
73
+ },
74
+ roles: {
75
+ cache: new Map(),
76
+ },
77
+ });
78
+
79
+ mockClient = jasmine.createSpyObj('Client', ['login', 'on'], {
80
+ user: {
81
+ id: 'bot-123',
82
+ tag: 'TestBot#1234',
83
+ displayName: 'Test Bot',
84
+ },
85
+ guilds: {
86
+ cache: new Map([['guild-123', mockGuild]]),
87
+ get: jasmine.createSpy('guilds.get').and.returnValue(mockGuild),
88
+ },
89
+ });
90
+
91
+ // Mock Client constructor by preventing actual Client instantiation
92
+ // We'll create the service without calling the constructor that creates Client
93
+ service = TestDiBoMainService.getInstance();
94
+ (service as any).client = mockClient;
95
+ (service as any)._discordServer = mockGuild;
96
+ (service as any).botIO_CS = mockBotIO_CS;
97
+ (service as any).routines_CS = mockRoutines_CS;
98
+ (service as any).commands_CS = mockCommands_CS;
99
+ });
100
+
101
+ afterEach(async () => {
102
+ try {
103
+ // Megvárjuk, hogy a bot leálljon és a process listener-ek lefussanak
104
+ await DyFM_Async.delay(200);
105
+
106
+ // Biztosítjuk, hogy a discordServer ne próbáljon üzenetet küldeni
107
+ if (service && (service as any)._discordServer) {
108
+ const discordServer = (service as any)._discordServer as Guild;
109
+ // Invalidáljuk a channels.cache-t, hogy ne próbáljon channel-t keresni
110
+ if (discordServer.channels && discordServer.channels.cache) {
111
+ // Invalidáljuk a cache-t, hogy ne lehessen használni
112
+ (discordServer.channels as any).cache = undefined;
113
+ }
114
+ // Invalidáljuk a channels-t is
115
+ (discordServer as any).channels = undefined;
116
+ }
117
+
118
+ // Invalidáljuk a discordServer-t is
119
+ if (service) {
120
+ (service as any)._discordServer = undefined;
121
+ }
122
+
123
+ await DyFM_Async.delay(200);
124
+ } catch (error) {
125
+ // Csendes hiba-kezelés
126
+ }
127
+ });
128
+
129
+ afterAll(async () => {
130
+ try {
131
+ // Végleges cleanup a tesztek végén - megvárjuk, hogy minden process listener lefusson
132
+ await DyFM_Async.delay(500);
133
+
134
+ // Invalidáljuk a service-t is
135
+ if (service) {
136
+ (service as any)._discordServer = undefined;
137
+ (service as any).client = undefined;
138
+ }
139
+
140
+ await DyFM_Async.delay(500);
141
+ } catch (error) {
142
+ // Csendes hiba-kezelés
143
+ }
144
+ });
145
+
146
+ describe('| constructor', () => {
147
+ it('| should initialize Discord client', () => {
148
+ expect(service.client).toBeDefined();
149
+ });
150
+
151
+ it('| should throw error if client already initialized', () => {
152
+ // This test is skipped because we can't easily mock the Client constructor
153
+ // The service is already initialized via getInstance()
154
+ expect(service.client).toBeDefined();
155
+ });
156
+ });
157
+
158
+ describe('| properties', () => {
159
+ it('| should return discordServer', () => {
160
+ expect(service.discordServer).toBe(mockGuild);
161
+ });
162
+
163
+ it('| should return botClientId from client user', () => {
164
+ expect(service.botClientId).toBe('bot-123');
165
+ });
166
+
167
+ it('| should return botDisplayName from client user', () => {
168
+ expect(service.botDisplayName).toBe('Test Bot');
169
+ });
170
+ });
171
+
172
+ describe('| setup', () => {
173
+ it('| should setup bot services', async () => {
174
+ mockClient.login.and.returnValue(Promise.resolve('token'));
175
+ mockClient.on.and.callFake((event: string, callback: Function): any => {
176
+ if (event === 'ready') {
177
+ setTimeout(() => callback(), 10);
178
+ }
179
+ });
180
+
181
+ mockBotIO_CS.setup.and.returnValue(Promise.resolve());
182
+ mockRoutines_CS.setup.and.returnValue(Promise.resolve());
183
+ mockCommands_CS.setup.and.returnValue(Promise.resolve());
184
+
185
+ await service.setup('test-issuer');
186
+
187
+ expect(mockBotIO_CS.setup).toHaveBeenCalled();
188
+ expect(mockRoutines_CS.setup).toHaveBeenCalled();
189
+ expect(mockCommands_CS.setup).toHaveBeenCalled();
190
+ });
191
+
192
+ it('| should throw error if guildId not found', async () => {
193
+ DyNTS_global_settings.env_settings.discord.guildId = null as any;
194
+
195
+ try {
196
+ await service.setup('test-issuer');
197
+ fail('Should have thrown an error');
198
+ } catch (error) {
199
+ // Error may be wrapped in DyFM_Error
200
+ expect(error).toBeDefined();
201
+ const errorMessage = (error as DyFM_Error)?._message || (error as Error)?.message || '';
202
+ expect(errorMessage).toContain('No discord server id found');
203
+ }
204
+ });
205
+
206
+ it('| should throw error if token not found', async () => {
207
+ DyNTS_global_settings.env_settings.discord.token = null as any;
208
+
209
+ try {
210
+ await service.setup('test-issuer');
211
+ fail('Should have thrown an error');
212
+ } catch (error) {
213
+ // Error may be wrapped in DyFM_Error
214
+ expect(error).toBeDefined();
215
+ const errorMessage = (error as DyFM_Error)?._message || (error as Error)?.message || '';
216
+ expect(errorMessage).toContain('No discord token found');
217
+ }
218
+ });
219
+
220
+ it('| should throw error if botIO_CS not found', async () => {
221
+ (service as any).botIO_CS = null;
222
+ mockClient.login.and.returnValue(Promise.resolve('token'));
223
+ mockClient.on.and.callFake((event: string, callback: Function): any => {
224
+ if (event === 'ready') {
225
+ setTimeout(() => callback(), 10);
226
+ }
227
+ });
228
+
229
+ try {
230
+ await service.setup('test-issuer');
231
+ fail('Should have thrown an error');
232
+ } catch (error) {
233
+ expect(error).toBeInstanceOf(DyFM_Error);
234
+ }
235
+ });
236
+ });
237
+
238
+ describe('| start', () => {
239
+ it('| should start bot services', async () => {
240
+ mockRoutines_CS.start.and.returnValue(Promise.resolve());
241
+ mockBotIO_CS.start.and.returnValue(Promise.resolve());
242
+ mockCommands_CS.start.and.returnValue(Promise.resolve());
243
+
244
+ await service.start('test-issuer');
245
+
246
+ expect(mockRoutines_CS.start).toHaveBeenCalled();
247
+ expect(mockBotIO_CS.start).toHaveBeenCalled();
248
+ expect(mockCommands_CS.start).toHaveBeenCalled();
249
+ });
250
+
251
+ it('| should throw error if discordServer not initialized', async () => {
252
+ (service as any)._discordServer = null;
253
+
254
+ try {
255
+ await service.start('test-issuer');
256
+ fail('Should have thrown an error');
257
+ } catch (error) {
258
+ expect(error).toBeInstanceOf(DyFM_Error);
259
+ expect((error as DyFM_Error)._errorCode).toContain('DyNTS-DiBo-MCS-ST01');
260
+ }
261
+ });
262
+ });
263
+
264
+ describe('| getRoleByName', () => {
265
+ it('| should return role from cache if exists', () => {
266
+ const mockRole = jasmine.createSpyObj('Role', [], {
267
+ id: 'role-123',
268
+ name: 'Test Role',
269
+ });
270
+ (service as any)._rolesByNames['Test Role'] = mockRole;
271
+
272
+ const result = service.getRoleByName('Test Role');
273
+
274
+ expect(result).toBe(mockRole);
275
+ });
276
+
277
+ it('| should find role in guild and cache it', () => {
278
+ const mockRole = jasmine.createSpyObj('Role', [], {
279
+ id: 'role-123',
280
+ name: 'Test Role',
281
+ });
282
+ ((mockGuild.roles.cache as unknown) as { find: jasmine.Spy }).find =
283
+ jasmine.createSpy('cache.find').and.returnValue(mockRole);
284
+
285
+ const result = service.getRoleByName('Test Role');
286
+
287
+ // Use toEqual for object comparison
288
+ expect(result).toEqual(mockRole);
289
+ expect((service as any)._rolesByNames['Test Role']).toEqual(mockRole);
290
+ });
291
+ });
292
+
293
+ describe('| getChannelByName', () => {
294
+ it('| should return channel from cache if exists', () => {
295
+ (service as any)._channelsByNames['test-channel'] = mockTextChannel;
296
+
297
+ const result = service.getChannelByName('test-channel');
298
+
299
+ expect(result).toBe(mockTextChannel);
300
+ });
301
+
302
+ // Skip this test - requires findTextChannelByName which may not be available
303
+ it('| should find channel in guild and cache it', () => {
304
+ // Skipped - DyNTS_DiBo_Operations_Util.findTextChannelByName may not be available
305
+ });
306
+ });
307
+
308
+ describe('| getRolePingByName', () => {
309
+ it('| should return role ping', async () => {
310
+ const mockRole = jasmine.createSpyObj('Role', [], {
311
+ id: 'role-123',
312
+ name: 'Test Role',
313
+ });
314
+ spyOn(service, 'getRoleByName').and.returnValue(mockRole);
315
+
316
+ const result = await service.getRolePingByName('Test Role');
317
+
318
+ expect(result).toBe('<@&role-123>');
319
+ });
320
+
321
+ it('| should return empty string if role not found', async () => {
322
+ spyOn(service, 'getRoleByName').and.returnValue(null);
323
+
324
+ const result = await service.getRolePingByName('Non-existent');
325
+
326
+ expect(result).toBe('');
327
+ });
328
+ });
329
+
330
+ describe('| getRolePingsByName', () => {
331
+ it('| should return multiple role pings', async () => {
332
+ spyOn(service, 'getRolePingByName').and.returnValues(
333
+ Promise.resolve('<@&role-1>'),
334
+ Promise.resolve('<@&role-2>')
335
+ );
336
+
337
+ const result = await service.getRolePingsByName(['Role1', 'Role2']);
338
+
339
+ expect(result).toBe('<@&role-1> <@&role-2>');
340
+ });
341
+ });
342
+
343
+ describe('| sendMessageToChannelByName', () => {
344
+ it('| should send message to channel', async () => {
345
+ const mockMessage = jasmine.createSpyObj('Message', [], {
346
+ id: 'message-123',
347
+ content: 'Test message',
348
+ });
349
+ spyOn(service, 'getChannelByName').and.returnValue(mockTextChannel);
350
+ mockTextChannel.send.and.returnValue(Promise.resolve(mockMessage));
351
+
352
+ const result = await service.sendMessageToChannelByName('test-channel', 'Test message', 'test-issuer');
353
+
354
+ expect(mockTextChannel.send).toHaveBeenCalledWith('Test message');
355
+ expect(result).toBe(mockMessage);
356
+ });
357
+
358
+ it('| should split long messages', async () => {
359
+ const longMessage = 'x'.repeat(5000);
360
+ const mockMessage = jasmine.createSpyObj('Message', [], {
361
+ id: 'message-123',
362
+ content: 'Test message',
363
+ });
364
+ spyOn(service, 'getChannelByName').and.returnValue(mockTextChannel);
365
+ // Return mockMessage for each call
366
+ mockTextChannel.send.and.returnValue(Promise.resolve(mockMessage));
367
+
368
+ const result = await service.sendMessageToChannelByName('test-channel', longMessage, 'test-issuer');
369
+
370
+ // Message split depends on implementation - expect at least 2 calls for long message
371
+ expect(mockTextChannel.send).toHaveBeenCalled();
372
+ expect(mockTextChannel.send.calls.count()).toBeGreaterThanOrEqual(2);
373
+ // Result may be undefined or the last message, depending on implementation
374
+ // Just verify that send was called multiple times for long messages
375
+ expect(result === undefined || result === mockMessage).toBeTrue();
376
+ });
377
+
378
+ it('| should throw error if channel not found', async () => {
379
+ spyOn(service, 'getChannelByName').and.returnValue(null);
380
+
381
+ try {
382
+ await service.sendMessageToChannelByName('non-existent', 'Test', 'test-issuer');
383
+ fail('Should have thrown an error');
384
+ } catch (error) {
385
+ expect(error).toBeInstanceOf(DyFM_Error);
386
+ expect((error as DyFM_Error)._errorCode).toContain('DyNTS-DiBo-MCS-SMCN1');
387
+ }
388
+ });
389
+
390
+ it('| should throw error if channel is not text-based', async () => {
391
+ const voiceChannel = jasmine.createSpyObj('VoiceChannel', [], {
392
+ id: 'voice-123',
393
+ name: 'voice-channel',
394
+ isTextBased: () => false,
395
+ });
396
+ spyOn(service, 'getChannelByName').and.returnValue(voiceChannel);
397
+
398
+ try {
399
+ await service.sendMessageToChannelByName('voice-channel', 'Test', 'test-issuer');
400
+ fail('Should have thrown an error');
401
+ } catch (error) {
402
+ expect(error).toBeInstanceOf(DyFM_Error);
403
+ expect((error as DyFM_Error)._errorCode).toContain('DyNTS-DiBo-MCS-SMCN2');
404
+ }
405
+ });
406
+ });
407
+ });
408
+