@futdevpro/nts-dynamo 1.15.13 → 1.15.15
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.
- package/.c8rc.json +26 -26
- package/.copilot/patterns.json +7 -7
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/_specifications/BACKLOG.md +50 -22
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +4 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_models/interfaces/global-log-settings.interface.d.ts +11 -0
- package/build/_models/interfaces/global-log-settings.interface.d.ts.map +1 -1
- package/build/_modules/logs/get-logs-routing-module.util.d.ts +19 -0
- package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +1 -0
- package/build/_modules/logs/get-logs-routing-module.util.js +32 -0
- package/build/_modules/logs/get-logs-routing-module.util.js.map +1 -0
- package/build/_modules/logs/index.d.ts +4 -0
- package/build/_modules/logs/index.d.ts.map +1 -0
- package/build/_modules/logs/index.js +10 -0
- package/build/_modules/logs/index.js.map +1 -0
- package/build/_modules/logs/log-buffer.service.d.ts +38 -0
- package/build/_modules/logs/log-buffer.service.d.ts.map +1 -0
- package/build/_modules/logs/log-buffer.service.js +97 -0
- package/build/_modules/logs/log-buffer.service.js.map +1 -0
- package/build/_modules/logs/logs.controller.d.ts +27 -0
- package/build/_modules/logs/logs.controller.d.ts.map +1 -0
- package/build/_modules/logs/logs.controller.js +90 -0
- package/build/_modules/logs/logs.controller.js.map +1 -0
- package/build/_modules/logs/logs.service.d.ts +40 -0
- package/build/_modules/logs/logs.service.d.ts.map +1 -0
- package/build/_modules/logs/logs.service.js +97 -0
- package/build/_modules/logs/logs.service.js.map +1 -0
- package/build/_modules/server/errors/errors.data-service.d.ts.map +1 -1
- package/build/_modules/server/errors/errors.data-service.js +2 -1
- package/build/_modules/server/errors/errors.data-service.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +362 -353
- package/scripts/run-coverage-tests.js +28 -28
- package/spec/support/helpers/spec-reporter-loader.js +359 -359
- package/spec/support/helpers/ts-node-helper.js +93 -93
- package/spec/support/jasmine.coverage.json +24 -24
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/archive.util.spec.ts +57 -57
- package/src/_collections/archive.util.ts +18 -18
- package/src/_collections/atlas-default-db-options.const.ts +9 -9
- package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
- package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
- package/src/_collections/default-not-found-page.const.spec.ts +19 -19
- package/src/_collections/default-not-found-page.const.ts +22 -22
- package/src/_collections/default-socket-path.const.spec.ts +12 -12
- package/src/_collections/default-socket-path.const.ts +2 -2
- package/src/_collections/get-environment-settings.util.spec.ts +210 -210
- package/src/_collections/get-environment-settings.util.ts +48 -48
- package/src/_collections/global-settings.const.ts +5 -0
- package/src/_collections/sample.env +21 -21
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +24 -24
- package/src/_enums/predefined-data-types.enum.ts +16 -16
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
- package/src/_models/control-models/api-call-params.control-model.ts +142 -142
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
- package/src/_models/control-models/app-params.control-model.ts +136 -136
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +578 -578
- package/src/_models/control-models/endpoint-params.control-model.ts +526 -526
- package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
- package/src/_models/control-models/http-settings.control-model.ts +37 -37
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +108 -96
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
- package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
- package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
- package/src/_modules/ai/_modules/document-ai/index.ts +28 -28
- package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
- package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
- package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +240 -240
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +98 -98
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +615 -615
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +437 -437
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +833 -833
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
- package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
- package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +332 -332
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -79
- package/src/_modules/ai/_services/ai-provider.service-base.ts +29 -29
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/index.ts +13 -13
- package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
- package/src/_modules/assistant/_collections/ass.util.ts +50 -50
- package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
- package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
- package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
- package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
- package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
- package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
- package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
- package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
- package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
- package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
- package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
- package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
- package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
- package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
- package/src/_modules/custom-data/custom-data.controller.ts +67 -67
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
- package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
- package/src/_modules/custom-data/index.ts +9 -9
- package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
- package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
- package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
- package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
- package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
- package/src/_modules/defaults/index.ts +17 -17
- package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
- package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
- package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
- package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
- package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
- package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
- package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
- package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
- package/src/_modules/discord-assistant/index.ts +38 -38
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
- package/src/_modules/discord-assistant-voiced/index.ts +36 -36
- package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
- package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
- package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
- package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
- package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
- package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
- package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
- package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
- package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +19 -19
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +345 -345
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +330 -330
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +393 -393
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +220 -220
- package/src/_modules/local-vector-search/index.ts +11 -11
- package/src/_modules/logs/get-logs-routing-module.util.ts +36 -0
- package/src/_modules/logs/index.ts +3 -0
- package/src/_modules/logs/log-buffer.service.ts +101 -0
- package/src/_modules/logs/logs.controller.ts +109 -0
- package/src/_modules/logs/logs.service.ts +100 -0
- package/src/_modules/messaging/README.md +354 -354
- package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
- package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
- package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
- package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
- package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
- package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
- package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
- package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
- package/src/_modules/messaging/index.ts +30 -30
- package/src/_modules/mock/app-extended-server.mock.ts +201 -201
- package/src/_modules/mock/app-integration-test.mock.ts +51 -51
- package/src/_modules/mock/app-params.mock.spec.ts +21 -21
- package/src/_modules/mock/app-params.mock.ts +9 -9
- package/src/_modules/mock/app-server.mock.ts +188 -188
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
- package/src/_modules/mock/auth-service.mock.ts +28 -28
- package/src/_modules/mock/controller.mock.spec.ts +26 -26
- package/src/_modules/mock/controller.mock.ts +16 -16
- package/src/_modules/mock/data-model.mock.spec.ts +111 -111
- package/src/_modules/mock/data-model.mock.ts +82 -82
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
- package/src/_modules/mock/email-service-collection.mock.ts +15 -15
- package/src/_modules/mock/email-service.mock.spec.ts +17 -17
- package/src/_modules/mock/email-service.mock.ts +20 -20
- package/src/_modules/mock/email-template.mock.html +14 -14
- package/src/_modules/mock/endpoint.mock.ts +91 -91
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
- package/src/_modules/mock/socket-client.mock.ts +45 -45
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
- package/src/_modules/mock/socket-server.mock.ts +46 -46
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
- package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
- package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
- package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
- package/src/_modules/oauth2/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +230 -230
- package/src/_modules/server/errors/errors.control-service.ts +69 -69
- package/src/_modules/server/errors/errors.controller.spec.ts +165 -165
- package/src/_modules/server/errors/errors.controller.ts +270 -270
- package/src/_modules/server/errors/errors.data-service.spec.ts +355 -355
- package/src/_modules/server/errors/errors.data-service.ts +2 -1
- package/src/_modules/server/index.ts +30 -30
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
- package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
- package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +516 -516
- package/src/_modules/server/server-status/server-status.control-service.ts +336 -336
- package/src/_modules/server/server-status/server-status.controller.spec.ts +156 -156
- package/src/_modules/server/server-status/server-status.controller.ts +131 -131
- package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
- package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
- package/src/_modules/socket/_services/socket-client.service.ts +260 -260
- package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +630 -630
- package/src/_modules/socket/index.ts +42 -42
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +11 -11
- package/src/_modules/test/test.controller.spec.ts +72 -72
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +15 -15
- package/src/_modules/usage/usage.controller.spec.ts +81 -81
- package/src/_modules/usage/usage.controller.ts +126 -126
- package/src/_modules/usage/usage.data-service.spec.ts +332 -332
- package/src/_modules/usage/usage.data-service.ts +185 -185
- package/src/_services/base/api.service-base.spec.ts +125 -125
- package/src/_services/base/api.service-base.ts +74 -74
- package/src/_services/base/archive-data.service.spec.ts +196 -196
- package/src/_services/base/archive-data.service.ts +216 -216
- package/src/_services/base/data.service.spec.ts +493 -493
- package/src/_services/base/data.service.ts +2525 -2525
- package/src/_services/base/db.service.spec.ts +73 -73
- package/src/_services/base/db.service.ts +1575 -1575
- package/src/_services/base/singleton.service-base.spec.ts +28 -28
- package/src/_services/base/singleton.service-base.ts +24 -24
- package/src/_services/base/singleton.service.spec.ts +114 -114
- package/src/_services/base/singleton.service.ts +38 -38
- package/src/_services/core/api.service.spec.ts +140 -140
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +742 -742
- package/src/_services/core/global.service.spec.ts +275 -275
- package/src/_services/core/global.service.ts +461 -461
- package/src/_services/core/service-collection.service.spec.ts +46 -46
- package/src/_services/core/service-collection.service.ts +6 -6
- package/src/_services/route/controller.service.spec.ts +53 -53
- package/src/_services/route/controller.service.ts +148 -148
- package/src/_services/route/routing-module.service.spec.ts +98 -98
- package/src/_services/route/routing-module.service.ts +330 -330
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +94 -94
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
|
@@ -1,526 +1,526 @@
|
|
|
1
|
-
import { Request, Response } from 'express';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
DyFM_AnyError,
|
|
5
|
-
DyFM_Array, DyFM_Endpoint_SettingsBase, DyFM_EnvironmentFlag, DyFM_Error, DyFM_getConstructionStackLocation, DyFM_HttpCallType,
|
|
6
|
-
DyFM_Log, DyFM_Object
|
|
7
|
-
} from '@futdevpro/fsm-dynamo';
|
|
8
|
-
|
|
9
|
-
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
10
|
-
import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
|
|
11
|
-
import { DyNTS_GlobalService } from '../../_services/core/global.service';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* High level endpoint for API
|
|
15
|
-
* used for specific events such as saving or getting data,
|
|
16
|
-
* triggering events, logging in or out, and much more
|
|
17
|
-
*
|
|
18
|
-
* (You'll need to add them to a {@link DyNTS_Controller} through the {@link DyNTS_Controller.addEndpoint} method)
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```typescript
|
|
22
|
-
* // Example from note-book controller implementation
|
|
23
|
-
* new DyNTS_Endpoint_Params({
|
|
24
|
-
* name: 'getMyNoteBooks',
|
|
25
|
-
* type: DyFM_HttpCallType.get,
|
|
26
|
-
* endpoint: '/:userId/get-my',
|
|
27
|
-
* preProcesses: [ authService.authenticate_tokenSelf ],
|
|
28
|
-
* tasks: [
|
|
29
|
-
* async (req: Request, res: Response, issuer: string): Promise<void> => {
|
|
30
|
-
* const notes_DS = new NoteBook_DataService({
|
|
31
|
-
* issuer: issuer,
|
|
32
|
-
* });
|
|
33
|
-
*
|
|
34
|
-
* const notes = await notes_DS.getMyNoteBooks(req.params.userId);
|
|
35
|
-
* res.send(notes);
|
|
36
|
-
* },
|
|
37
|
-
* ],
|
|
38
|
-
* })
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export class DyNTS_Endpoint_Params<
|
|
42
|
-
T_Result = unknown,
|
|
43
|
-
I_Inputs extends Array<any> = [],
|
|
44
|
-
T_Body = undefined
|
|
45
|
-
> extends DyFM_Endpoint_SettingsBase<T_Result, I_Inputs, T_Body> {
|
|
46
|
-
/* name: string; */
|
|
47
|
-
security: DyNTS_RouteSecurity;
|
|
48
|
-
|
|
49
|
-
/* type: DyFM_HttpCallType;
|
|
50
|
-
endpoint: string; */
|
|
51
|
-
|
|
52
|
-
/* TODO: ENCRYPTION !!EZTET
|
|
53
|
-
useEncryptionKey?: string; */
|
|
54
|
-
|
|
55
|
-
private readonly pathParams: string[];
|
|
56
|
-
|
|
57
|
-
private readonly preProcesses: ((req: Request, res: Response) => Promise<void>)[] = [];
|
|
58
|
-
private readonly tasks: ((req: Request, res: Response, issuer?: string) => Promise<void>)[];
|
|
59
|
-
|
|
60
|
-
private readonly logRequest: boolean;
|
|
61
|
-
private readonly logRequestsParams: boolean;
|
|
62
|
-
private readonly logRequestsContent: boolean;
|
|
63
|
-
private readonly logResponseContent: boolean;
|
|
64
|
-
readonly stackLocation: string;
|
|
65
|
-
private readonly autoResolveCirculation: boolean;
|
|
66
|
-
|
|
67
|
-
constructor(
|
|
68
|
-
set: {
|
|
69
|
-
/**
|
|
70
|
-
* naming the endpoint will help to follow events on service
|
|
71
|
-
*/
|
|
72
|
-
name: string,
|
|
73
|
-
/**
|
|
74
|
-
* security settings for API, different security paths will need different handlers
|
|
75
|
-
*
|
|
76
|
-
* open; http, secure; https or both
|
|
77
|
-
*/
|
|
78
|
-
security?: DyNTS_RouteSecurity,
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* define basic Http Call Type such as; get, post, put, patch, delete
|
|
82
|
-
*/
|
|
83
|
-
type: DyFM_HttpCallType,
|
|
84
|
-
/**
|
|
85
|
-
* set endpoint here, without baseUrl and route module path
|
|
86
|
-
*
|
|
87
|
-
* NOTE: the endpoint will already include the routing module's endpoint.
|
|
88
|
-
* like: '/get-user/:userId' will be like: '/api/user/get-user/:userId'
|
|
89
|
-
*/
|
|
90
|
-
endpoint: string,
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* preProcesses are the functions you need to run before the actual function,
|
|
94
|
-
* such as authentications
|
|
95
|
-
*/
|
|
96
|
-
preProcesses?: ((req: Request, res: Response) => Promise<void>)[],
|
|
97
|
-
/**
|
|
98
|
-
* the actual tasks to run,
|
|
99
|
-
* the last one should contain the res.send(); execution to send response on API requests
|
|
100
|
-
*/
|
|
101
|
-
tasks: ((req: Request, res: Response, issuer: string) => Promise<void>)[],
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* log settings for request and response
|
|
105
|
-
*/
|
|
106
|
-
logRequest?: boolean,
|
|
107
|
-
/**
|
|
108
|
-
* log settings for request params
|
|
109
|
-
*/
|
|
110
|
-
logRequestsParams?: boolean,
|
|
111
|
-
/**
|
|
112
|
-
* log settings for request content
|
|
113
|
-
*/
|
|
114
|
-
logRequestsContent?: boolean,
|
|
115
|
-
/**
|
|
116
|
-
* log settings for response content
|
|
117
|
-
*/
|
|
118
|
-
logResponseContent?: boolean,
|
|
119
|
-
/**
|
|
120
|
-
* auto resolve circulation errors
|
|
121
|
-
*/
|
|
122
|
-
autoResolveCirculation?: boolean,
|
|
123
|
-
}
|
|
124
|
-
) {
|
|
125
|
-
try {
|
|
126
|
-
super(set);
|
|
127
|
-
|
|
128
|
-
this.name = set.name ?? set.endpoint;
|
|
129
|
-
this.security = set.security ?? DyNTS_global_settings.defaultRouteSecurity;
|
|
130
|
-
|
|
131
|
-
this.type = set.type;
|
|
132
|
-
this.endpoint = set.endpoint;
|
|
133
|
-
|
|
134
|
-
this.logRequest = set.logRequest ?? DyNTS_global_settings.log_settings.request;
|
|
135
|
-
this.logRequestsParams = set.logRequestsParams ??
|
|
136
|
-
DyNTS_global_settings.log_settings.requestsParams;
|
|
137
|
-
this.logRequestsContent = set.logRequestsContent ??
|
|
138
|
-
DyNTS_global_settings.log_settings.requestsContent;
|
|
139
|
-
this.logResponseContent = set.logResponseContent ??
|
|
140
|
-
DyNTS_global_settings.log_settings.responseContent;
|
|
141
|
-
this.autoResolveCirculation = set.autoResolveCirculation ??
|
|
142
|
-
DyNTS_global_settings.autoResolveEndpointCirculationErrors;
|
|
143
|
-
|
|
144
|
-
if (!this.endpoint) {
|
|
145
|
-
throw new DyFM_Error({
|
|
146
|
-
status: 406,
|
|
147
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EP0-C00`,
|
|
148
|
-
addECToUserMsg: true,
|
|
149
|
-
message: 'trying to create DyNTS_Endpoint_Params without endpoint value',
|
|
150
|
-
userMessage:
|
|
151
|
-
'We encountered an unhandled Server Error, ' +
|
|
152
|
-
'please contact the responsible development team.',
|
|
153
|
-
additionalContent: set,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
let pathParts: string[] = this.endpoint.split('/');
|
|
158
|
-
|
|
159
|
-
pathParts = pathParts.filter((part: string): boolean => part.startsWith(':'));
|
|
160
|
-
pathParts = pathParts.map((part: string): string => part.replace(':', ''));
|
|
161
|
-
this.pathParams = pathParts;
|
|
162
|
-
|
|
163
|
-
this.preProcesses = set.preProcesses ?? [];
|
|
164
|
-
this.tasks = set.tasks ?? [];
|
|
165
|
-
|
|
166
|
-
this.stackLocation = DyFM_getConstructionStackLocation();
|
|
167
|
-
} catch (error) {
|
|
168
|
-
DyFM_Log.error(
|
|
169
|
-
`\nEndpoint params setup failed: name: '${set.name}' ` +
|
|
170
|
-
`(security: ${set.security}) endpoint: ${set.endpoint}` +
|
|
171
|
-
`\nERROR:` +
|
|
172
|
-
`\n`, error
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
throw error;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
*
|
|
181
|
-
* @returns
|
|
182
|
-
*/
|
|
183
|
-
private async preLog(req: Request, res: Response, issuer: string): Promise<void> {
|
|
184
|
-
try {
|
|
185
|
-
if (this.logRequest) {
|
|
186
|
-
let msg: string = `\n===>>> incoming '${this.name}' request... (issuer: ${issuer})`;
|
|
187
|
-
|
|
188
|
-
if (this.logRequestsParams) {
|
|
189
|
-
const params = this.getPathParamsLogContent(req);
|
|
190
|
-
|
|
191
|
-
msg += `\npathParams: ${params}`;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (
|
|
195
|
-
this.logRequestsContent &&
|
|
196
|
-
req.body &&
|
|
197
|
-
0 < Object.keys(req.body).length
|
|
198
|
-
) {
|
|
199
|
-
DyFM_Log.info(msg + `\nbody:`, req.body);
|
|
200
|
-
} else {
|
|
201
|
-
DyFM_Log.info(msg);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
} catch (error) {
|
|
205
|
-
this.error(req, res, error, issuer);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
*
|
|
211
|
-
* @returns
|
|
212
|
-
*/
|
|
213
|
-
getFullExecution(): (req: Request, res: Response) => Promise<void> {
|
|
214
|
-
let issuer: string;
|
|
215
|
-
|
|
216
|
-
return async (req: Request, res: Response): Promise<void> => {
|
|
217
|
-
try {
|
|
218
|
-
let issuer: string;
|
|
219
|
-
try {
|
|
220
|
-
issuer = DyNTS_GlobalService?.getAuthService()?.getIssuerFromRequest(req);
|
|
221
|
-
} catch (error) {
|
|
222
|
-
DyFM_Log.warn(DyFM_Error.getAnyMessage(error));
|
|
223
|
-
issuer = 'unknown-issuer';
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
if (this.logRequest) {
|
|
227
|
-
await this.preLog(req, res, issuer);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
if (DyNTS_global_settings.log_settings.requestStackLocation) {
|
|
231
|
-
DyFM_Log.info(` endpoint location: "${this.stackLocation}"`);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (!this.preProcesses) {
|
|
235
|
-
throw new DyFM_Error({
|
|
236
|
-
status: 500,
|
|
237
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EP1-C00`,
|
|
238
|
-
addECToUserMsg: true,
|
|
239
|
-
message:
|
|
240
|
-
'trying to execute DyNTS_Endpoint_Params without preProcesses value, ' +
|
|
241
|
-
'make sure you are using DyNTS_Endpoint_Params constructor correctly',
|
|
242
|
-
userMessage:
|
|
243
|
-
'We encountered an unhandled Server Error, ' +
|
|
244
|
-
'please contact the responsible development team.',
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
await DyFM_Array.asyncForEach(this.preProcesses,
|
|
249
|
-
async (preProcess: (req: Request, res: Response) => Promise<void>): Promise<void> => {
|
|
250
|
-
await preProcess(req, res);
|
|
251
|
-
}
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
await DyFM_Array.asyncForEach(this.tasks,
|
|
255
|
-
async (
|
|
256
|
-
task: (req: Request, res: Response, issuer?: string) => Promise<void>
|
|
257
|
-
): Promise<void> => {
|
|
258
|
-
await task(req, res, issuer);
|
|
259
|
-
}
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
if (this.logRequest) {
|
|
263
|
-
if (this.logResponseContent) {
|
|
264
|
-
DyFM_Log.success(` <<<===== '${this.name}' result sent.`);
|
|
265
|
-
DyFM_Log.warn('sorry, the logResponseContent is not implemented yet.');
|
|
266
|
-
} else {
|
|
267
|
-
DyFM_Log.success(` <<<===== '${this.name}' result sent.`);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
} catch (error) {
|
|
271
|
-
this.error(req, res, error, issuer);
|
|
272
|
-
}
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
*
|
|
278
|
-
* @param res
|
|
279
|
-
* @param error
|
|
280
|
-
*/
|
|
281
|
-
private async error(
|
|
282
|
-
req: Request,
|
|
283
|
-
res: Response,
|
|
284
|
-
error: DyFM_AnyError,
|
|
285
|
-
issuer: string,
|
|
286
|
-
autoSecondTry?: boolean
|
|
287
|
-
): Promise<void> {
|
|
288
|
-
try {
|
|
289
|
-
let msg: string = `Endpoint caught an error. '${this.name}' (${this.endpoint})`;
|
|
290
|
-
|
|
291
|
-
msg += this.getPathParamsLogContent(req);
|
|
292
|
-
if (error instanceof DyFM_Error) {
|
|
293
|
-
msg += `\n ErrorCode: ${error._errorCode}`;
|
|
294
|
-
}
|
|
295
|
-
msg += `\n error: "${(error as DyFM_Error)?._message ?? (error as Error)?.message}"`;
|
|
296
|
-
msg += '\n at ' + this.stackLocation;
|
|
297
|
-
|
|
298
|
-
DyFM_Log.testError(msg);
|
|
299
|
-
|
|
300
|
-
if (
|
|
301
|
-
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
302
|
-
!(error instanceof DyFM_Error)
|
|
303
|
-
) {
|
|
304
|
-
DyFM_Log.H_error(
|
|
305
|
-
`Endpoint "${this.endpoint}" caught an error. (${this.name})`,
|
|
306
|
-
'\n ERROR:', error
|
|
307
|
-
);
|
|
308
|
-
} else if (DyNTS_global_settings.log_settings.api_errors) {
|
|
309
|
-
error.logSimple(`Endpoint "${this.endpoint}" caught an error. (${this.name})`);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
if ((error as DyFM_Error)?.flag?.includes('DYNAMO')) {
|
|
313
|
-
if (!(error as DyFM_Error).additionalContent) {
|
|
314
|
-
(error as DyFM_Error).additionalContent = {};
|
|
315
|
-
}
|
|
316
|
-
(error as DyFM_Error).additionalContent.endpointInfo = msg;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
await DyNTS_GlobalService.globalErrorHandler?.(
|
|
320
|
-
error,
|
|
321
|
-
req,
|
|
322
|
-
res,
|
|
323
|
-
issuer
|
|
324
|
-
).catch((err): void => {
|
|
325
|
-
DyFM_Log.warn(
|
|
326
|
-
'DyNTS_GlobalService.globalErrorHandler failed to handle error: ',
|
|
327
|
-
err
|
|
328
|
-
);
|
|
329
|
-
DyFM_Log.warn('It will proceed as normal.');
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
if (error instanceof DyFM_Error) {
|
|
333
|
-
if (DyNTS_global_settings.compactErrorResponse) {
|
|
334
|
-
error = (error as DyFM_Error).getErrorsFlat();
|
|
335
|
-
delete (error as DyFM_Error).errors;
|
|
336
|
-
/* delete (error as DyFM_Error).error; */
|
|
337
|
-
delete (error as DyFM_Error).stack;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
if (
|
|
342
|
-
(error as DyFM_Error)?.flag?.includes('DYNAMO') &&
|
|
343
|
-
(error as DyFM_Error).confidentialContent
|
|
344
|
-
) {
|
|
345
|
-
delete (error as DyFM_Error).confidentialContent;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
try {
|
|
349
|
-
JSON.stringify(error);
|
|
350
|
-
} catch /* (stringifyError) */ {
|
|
351
|
-
if (this.autoResolveCirculation) {
|
|
352
|
-
try {
|
|
353
|
-
error = DyFM_Object.resolveCirculation(error);
|
|
354
|
-
JSON.stringify(error);
|
|
355
|
-
} catch /* (resolveError) */ {
|
|
356
|
-
DyFM_Log.H_error(
|
|
357
|
-
'DyNTS_Endpoint_Params: error object is not serializable, and not resolvable!'
|
|
358
|
-
);
|
|
359
|
-
|
|
360
|
-
error = new DyFM_Error({
|
|
361
|
-
error: new Error('UNRESOLVABLE UNSERIALIZABLE ERROR'),
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
} else {
|
|
365
|
-
DyFM_Log.H_error('DyNTS_Endpoint_Params: error object is not serializable!');
|
|
366
|
-
|
|
367
|
-
error = new DyFM_Error({
|
|
368
|
-
error: new Error('UNSERIALIZABLE ERROR'),
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
const status = (error as DyFM_Error)?.___status;
|
|
374
|
-
if (status && !isNaN(status)) {
|
|
375
|
-
res.status(status);
|
|
376
|
-
} else {
|
|
377
|
-
res.status(501);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
if (
|
|
381
|
-
DyNTS_global_settings.env_settings.environment === DyFM_EnvironmentFlag.prod &&
|
|
382
|
-
error instanceof DyFM_Error
|
|
383
|
-
) {
|
|
384
|
-
delete (error as DyFM_Error).confidentialContent;
|
|
385
|
-
delete (error as DyFM_Error).additionalContent;
|
|
386
|
-
delete (error as DyFM_Error).error;
|
|
387
|
-
delete (error as DyFM_Error).errors;
|
|
388
|
-
delete (error as DyFM_Error).stack;
|
|
389
|
-
delete (error as DyFM_Error).__localStack;
|
|
390
|
-
/* DyFM_Error.deleteErrorContent(error as DyFM_Error); */
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
res.send(error);
|
|
394
|
-
|
|
395
|
-
if (this.logRequest) {
|
|
396
|
-
if (this.logResponseContent) {
|
|
397
|
-
DyFM_Log.error(
|
|
398
|
-
` <<<===== '${this.name}' error sent: ${(error as DyFM_Error)?._message ?? ''}`
|
|
399
|
-
);
|
|
400
|
-
DyFM_Log.error(
|
|
401
|
-
'sorry, the logResponseContent is not implemented yet.'
|
|
402
|
-
);
|
|
403
|
-
} else {
|
|
404
|
-
DyFM_Log.error(
|
|
405
|
-
` <<<===== '${this.name}' error sent: ${(error as DyFM_Error)?._message ?? ''}`
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
DyFM_Log.error('');
|
|
411
|
-
|
|
412
|
-
} catch (errorLvl2) {
|
|
413
|
-
this.multiLevelError(
|
|
414
|
-
errorLvl2,
|
|
415
|
-
{
|
|
416
|
-
req: req,
|
|
417
|
-
res: res,
|
|
418
|
-
error: error,
|
|
419
|
-
issuer: issuer,
|
|
420
|
-
autoSecondTry: autoSecondTry,
|
|
421
|
-
}
|
|
422
|
-
);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
private multiLevelError(
|
|
427
|
-
errorLvl2: any,
|
|
428
|
-
errorInputs: {
|
|
429
|
-
req: Request,
|
|
430
|
-
res: Response,
|
|
431
|
-
error: Error | DyFM_Error,
|
|
432
|
-
issuer: string,
|
|
433
|
-
autoSecondTry: boolean
|
|
434
|
-
}
|
|
435
|
-
): void {
|
|
436
|
-
if (DyNTS_global_settings.log_settings.highDetailedLogs) {
|
|
437
|
-
const msg =
|
|
438
|
-
`\n\nDYNAMO MULTILEVEL ERROR:DyNTS_Endpoint_Params: error: ` +
|
|
439
|
-
`(${this.name}, ${this.endpoint})` +
|
|
440
|
-
`\n(DYNAMO MULTILEVEL ERROR means, that the ERROR HANDLING is ALSO FAILED, ` +
|
|
441
|
-
`and the error message was not sent.)` +
|
|
442
|
-
`\nthisEndpointStackLocation: ${this.stackLocation}`;
|
|
443
|
-
|
|
444
|
-
if (errorLvl2 instanceof DyFM_Error) {
|
|
445
|
-
errorLvl2.logSimple(msg);
|
|
446
|
-
} else {
|
|
447
|
-
DyFM_Log.H_error(msg, '\nERROR:', errorLvl2, '\n');
|
|
448
|
-
}
|
|
449
|
-
} else {
|
|
450
|
-
const msg =
|
|
451
|
-
`\n\nDYNAMO MULTILEVEL ERROR:DyNTS_Endpoint_Params: error: ` +
|
|
452
|
-
`(${this.name}, ${this.endpoint})` +
|
|
453
|
-
`\nthisEndpointStackLocation: ${this.stackLocation}` +
|
|
454
|
-
`\n(DYNAMO MULTILEVEL ERROR means, that the ERROR HANDLING is ALSO FAILED, ` +
|
|
455
|
-
`and the error message was not sent.)`;
|
|
456
|
-
|
|
457
|
-
if (errorLvl2 instanceof DyFM_Error) {
|
|
458
|
-
errorLvl2.logSimple(msg);
|
|
459
|
-
} else {
|
|
460
|
-
DyFM_Log.H_error(msg, '\nERROR:', errorLvl2, '\n');
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
try {
|
|
465
|
-
JSON.stringify(errorInputs.error);
|
|
466
|
-
} catch /* (errorLvl2Replication) */ {
|
|
467
|
-
DyFM_Log.error(' ...response object is not serializable!');
|
|
468
|
-
let resolvedError: any;
|
|
469
|
-
|
|
470
|
-
try {
|
|
471
|
-
resolvedError = DyFM_Object.resolveCirculation(errorInputs.error);
|
|
472
|
-
} catch (errorLvl3) {
|
|
473
|
-
DyFM_Log.error(' ...response object is not resolvable!');
|
|
474
|
-
DyFM_Log.error(' ...', errorLvl3);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
if (resolvedError) {
|
|
478
|
-
if (this.autoResolveCirculation && !errorInputs.autoSecondTry) {
|
|
479
|
-
this.error(
|
|
480
|
-
errorInputs.req,
|
|
481
|
-
errorInputs.res,
|
|
482
|
-
resolvedError,
|
|
483
|
-
errorInputs.issuer,
|
|
484
|
-
true
|
|
485
|
-
);
|
|
486
|
-
|
|
487
|
-
DyFM_Log.warn(' ...automatic circulation error resolution was successful!');
|
|
488
|
-
|
|
489
|
-
return;
|
|
490
|
-
} else {
|
|
491
|
-
DyFM_Log.error(
|
|
492
|
-
' ...response object is resolvable! (use DyFM_Object.resolveCirculation)'
|
|
493
|
-
);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
if (
|
|
499
|
-
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
500
|
-
!(errorLvl2 instanceof DyFM_Error)
|
|
501
|
-
) {
|
|
502
|
-
DyFM_Log.H_error(
|
|
503
|
-
`Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`,
|
|
504
|
-
'\n ERROR:', errorLvl2
|
|
505
|
-
);
|
|
506
|
-
} else {
|
|
507
|
-
errorLvl2.logSimple(
|
|
508
|
-
`Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`
|
|
509
|
-
);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
private getPathParamsLogContent(req: Request): string {
|
|
514
|
-
let params: string = '';
|
|
515
|
-
|
|
516
|
-
this.pathParams.forEach((param: string): void => {
|
|
517
|
-
params += `\n${param}: ${req.params[param]}`;
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
return params;
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DyFM_AnyError,
|
|
5
|
+
DyFM_Array, DyFM_Endpoint_SettingsBase, DyFM_EnvironmentFlag, DyFM_Error, DyFM_getConstructionStackLocation, DyFM_HttpCallType,
|
|
6
|
+
DyFM_Log, DyFM_Object
|
|
7
|
+
} from '@futdevpro/fsm-dynamo';
|
|
8
|
+
|
|
9
|
+
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
10
|
+
import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
|
|
11
|
+
import { DyNTS_GlobalService } from '../../_services/core/global.service';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* High level endpoint for API
|
|
15
|
+
* used for specific events such as saving or getting data,
|
|
16
|
+
* triggering events, logging in or out, and much more
|
|
17
|
+
*
|
|
18
|
+
* (You'll need to add them to a {@link DyNTS_Controller} through the {@link DyNTS_Controller.addEndpoint} method)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Example from note-book controller implementation
|
|
23
|
+
* new DyNTS_Endpoint_Params({
|
|
24
|
+
* name: 'getMyNoteBooks',
|
|
25
|
+
* type: DyFM_HttpCallType.get,
|
|
26
|
+
* endpoint: '/:userId/get-my',
|
|
27
|
+
* preProcesses: [ authService.authenticate_tokenSelf ],
|
|
28
|
+
* tasks: [
|
|
29
|
+
* async (req: Request, res: Response, issuer: string): Promise<void> => {
|
|
30
|
+
* const notes_DS = new NoteBook_DataService({
|
|
31
|
+
* issuer: issuer,
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* const notes = await notes_DS.getMyNoteBooks(req.params.userId);
|
|
35
|
+
* res.send(notes);
|
|
36
|
+
* },
|
|
37
|
+
* ],
|
|
38
|
+
* })
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class DyNTS_Endpoint_Params<
|
|
42
|
+
T_Result = unknown,
|
|
43
|
+
I_Inputs extends Array<any> = [],
|
|
44
|
+
T_Body = undefined
|
|
45
|
+
> extends DyFM_Endpoint_SettingsBase<T_Result, I_Inputs, T_Body> {
|
|
46
|
+
/* name: string; */
|
|
47
|
+
security: DyNTS_RouteSecurity;
|
|
48
|
+
|
|
49
|
+
/* type: DyFM_HttpCallType;
|
|
50
|
+
endpoint: string; */
|
|
51
|
+
|
|
52
|
+
/* TODO: ENCRYPTION !!EZTET
|
|
53
|
+
useEncryptionKey?: string; */
|
|
54
|
+
|
|
55
|
+
private readonly pathParams: string[];
|
|
56
|
+
|
|
57
|
+
private readonly preProcesses: ((req: Request, res: Response) => Promise<void>)[] = [];
|
|
58
|
+
private readonly tasks: ((req: Request, res: Response, issuer?: string) => Promise<void>)[];
|
|
59
|
+
|
|
60
|
+
private readonly logRequest: boolean;
|
|
61
|
+
private readonly logRequestsParams: boolean;
|
|
62
|
+
private readonly logRequestsContent: boolean;
|
|
63
|
+
private readonly logResponseContent: boolean;
|
|
64
|
+
readonly stackLocation: string;
|
|
65
|
+
private readonly autoResolveCirculation: boolean;
|
|
66
|
+
|
|
67
|
+
constructor(
|
|
68
|
+
set: {
|
|
69
|
+
/**
|
|
70
|
+
* naming the endpoint will help to follow events on service
|
|
71
|
+
*/
|
|
72
|
+
name: string,
|
|
73
|
+
/**
|
|
74
|
+
* security settings for API, different security paths will need different handlers
|
|
75
|
+
*
|
|
76
|
+
* open; http, secure; https or both
|
|
77
|
+
*/
|
|
78
|
+
security?: DyNTS_RouteSecurity,
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* define basic Http Call Type such as; get, post, put, patch, delete
|
|
82
|
+
*/
|
|
83
|
+
type: DyFM_HttpCallType,
|
|
84
|
+
/**
|
|
85
|
+
* set endpoint here, without baseUrl and route module path
|
|
86
|
+
*
|
|
87
|
+
* NOTE: the endpoint will already include the routing module's endpoint.
|
|
88
|
+
* like: '/get-user/:userId' will be like: '/api/user/get-user/:userId'
|
|
89
|
+
*/
|
|
90
|
+
endpoint: string,
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* preProcesses are the functions you need to run before the actual function,
|
|
94
|
+
* such as authentications
|
|
95
|
+
*/
|
|
96
|
+
preProcesses?: ((req: Request, res: Response) => Promise<void>)[],
|
|
97
|
+
/**
|
|
98
|
+
* the actual tasks to run,
|
|
99
|
+
* the last one should contain the res.send(); execution to send response on API requests
|
|
100
|
+
*/
|
|
101
|
+
tasks: ((req: Request, res: Response, issuer: string) => Promise<void>)[],
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* log settings for request and response
|
|
105
|
+
*/
|
|
106
|
+
logRequest?: boolean,
|
|
107
|
+
/**
|
|
108
|
+
* log settings for request params
|
|
109
|
+
*/
|
|
110
|
+
logRequestsParams?: boolean,
|
|
111
|
+
/**
|
|
112
|
+
* log settings for request content
|
|
113
|
+
*/
|
|
114
|
+
logRequestsContent?: boolean,
|
|
115
|
+
/**
|
|
116
|
+
* log settings for response content
|
|
117
|
+
*/
|
|
118
|
+
logResponseContent?: boolean,
|
|
119
|
+
/**
|
|
120
|
+
* auto resolve circulation errors
|
|
121
|
+
*/
|
|
122
|
+
autoResolveCirculation?: boolean,
|
|
123
|
+
}
|
|
124
|
+
) {
|
|
125
|
+
try {
|
|
126
|
+
super(set);
|
|
127
|
+
|
|
128
|
+
this.name = set.name ?? set.endpoint;
|
|
129
|
+
this.security = set.security ?? DyNTS_global_settings.defaultRouteSecurity;
|
|
130
|
+
|
|
131
|
+
this.type = set.type;
|
|
132
|
+
this.endpoint = set.endpoint;
|
|
133
|
+
|
|
134
|
+
this.logRequest = set.logRequest ?? DyNTS_global_settings.log_settings.request;
|
|
135
|
+
this.logRequestsParams = set.logRequestsParams ??
|
|
136
|
+
DyNTS_global_settings.log_settings.requestsParams;
|
|
137
|
+
this.logRequestsContent = set.logRequestsContent ??
|
|
138
|
+
DyNTS_global_settings.log_settings.requestsContent;
|
|
139
|
+
this.logResponseContent = set.logResponseContent ??
|
|
140
|
+
DyNTS_global_settings.log_settings.responseContent;
|
|
141
|
+
this.autoResolveCirculation = set.autoResolveCirculation ??
|
|
142
|
+
DyNTS_global_settings.autoResolveEndpointCirculationErrors;
|
|
143
|
+
|
|
144
|
+
if (!this.endpoint) {
|
|
145
|
+
throw new DyFM_Error({
|
|
146
|
+
status: 406,
|
|
147
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EP0-C00`,
|
|
148
|
+
addECToUserMsg: true,
|
|
149
|
+
message: 'trying to create DyNTS_Endpoint_Params without endpoint value',
|
|
150
|
+
userMessage:
|
|
151
|
+
'We encountered an unhandled Server Error, ' +
|
|
152
|
+
'please contact the responsible development team.',
|
|
153
|
+
additionalContent: set,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
let pathParts: string[] = this.endpoint.split('/');
|
|
158
|
+
|
|
159
|
+
pathParts = pathParts.filter((part: string): boolean => part.startsWith(':'));
|
|
160
|
+
pathParts = pathParts.map((part: string): string => part.replace(':', ''));
|
|
161
|
+
this.pathParams = pathParts;
|
|
162
|
+
|
|
163
|
+
this.preProcesses = set.preProcesses ?? [];
|
|
164
|
+
this.tasks = set.tasks ?? [];
|
|
165
|
+
|
|
166
|
+
this.stackLocation = DyFM_getConstructionStackLocation();
|
|
167
|
+
} catch (error) {
|
|
168
|
+
DyFM_Log.error(
|
|
169
|
+
`\nEndpoint params setup failed: name: '${set.name}' ` +
|
|
170
|
+
`(security: ${set.security}) endpoint: ${set.endpoint}` +
|
|
171
|
+
`\nERROR:` +
|
|
172
|
+
`\n`, error
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
*
|
|
181
|
+
* @returns
|
|
182
|
+
*/
|
|
183
|
+
private async preLog(req: Request, res: Response, issuer: string): Promise<void> {
|
|
184
|
+
try {
|
|
185
|
+
if (this.logRequest) {
|
|
186
|
+
let msg: string = `\n===>>> incoming '${this.name}' request... (issuer: ${issuer})`;
|
|
187
|
+
|
|
188
|
+
if (this.logRequestsParams) {
|
|
189
|
+
const params = this.getPathParamsLogContent(req);
|
|
190
|
+
|
|
191
|
+
msg += `\npathParams: ${params}`;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (
|
|
195
|
+
this.logRequestsContent &&
|
|
196
|
+
req.body &&
|
|
197
|
+
0 < Object.keys(req.body).length
|
|
198
|
+
) {
|
|
199
|
+
DyFM_Log.info(msg + `\nbody:`, req.body);
|
|
200
|
+
} else {
|
|
201
|
+
DyFM_Log.info(msg);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
} catch (error) {
|
|
205
|
+
this.error(req, res, error, issuer);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
*
|
|
211
|
+
* @returns
|
|
212
|
+
*/
|
|
213
|
+
getFullExecution(): (req: Request, res: Response) => Promise<void> {
|
|
214
|
+
let issuer: string;
|
|
215
|
+
|
|
216
|
+
return async (req: Request, res: Response): Promise<void> => {
|
|
217
|
+
try {
|
|
218
|
+
let issuer: string;
|
|
219
|
+
try {
|
|
220
|
+
issuer = DyNTS_GlobalService?.getAuthService()?.getIssuerFromRequest(req);
|
|
221
|
+
} catch (error) {
|
|
222
|
+
DyFM_Log.warn(DyFM_Error.getAnyMessage(error));
|
|
223
|
+
issuer = 'unknown-issuer';
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (this.logRequest) {
|
|
227
|
+
await this.preLog(req, res, issuer);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (DyNTS_global_settings.log_settings.requestStackLocation) {
|
|
231
|
+
DyFM_Log.info(` endpoint location: "${this.stackLocation}"`);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (!this.preProcesses) {
|
|
235
|
+
throw new DyFM_Error({
|
|
236
|
+
status: 500,
|
|
237
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EP1-C00`,
|
|
238
|
+
addECToUserMsg: true,
|
|
239
|
+
message:
|
|
240
|
+
'trying to execute DyNTS_Endpoint_Params without preProcesses value, ' +
|
|
241
|
+
'make sure you are using DyNTS_Endpoint_Params constructor correctly',
|
|
242
|
+
userMessage:
|
|
243
|
+
'We encountered an unhandled Server Error, ' +
|
|
244
|
+
'please contact the responsible development team.',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
await DyFM_Array.asyncForEach(this.preProcesses,
|
|
249
|
+
async (preProcess: (req: Request, res: Response) => Promise<void>): Promise<void> => {
|
|
250
|
+
await preProcess(req, res);
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
await DyFM_Array.asyncForEach(this.tasks,
|
|
255
|
+
async (
|
|
256
|
+
task: (req: Request, res: Response, issuer?: string) => Promise<void>
|
|
257
|
+
): Promise<void> => {
|
|
258
|
+
await task(req, res, issuer);
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
if (this.logRequest) {
|
|
263
|
+
if (this.logResponseContent) {
|
|
264
|
+
DyFM_Log.success(` <<<===== '${this.name}' result sent.`);
|
|
265
|
+
DyFM_Log.warn('sorry, the logResponseContent is not implemented yet.');
|
|
266
|
+
} else {
|
|
267
|
+
DyFM_Log.success(` <<<===== '${this.name}' result sent.`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
} catch (error) {
|
|
271
|
+
this.error(req, res, error, issuer);
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
*
|
|
278
|
+
* @param res
|
|
279
|
+
* @param error
|
|
280
|
+
*/
|
|
281
|
+
private async error(
|
|
282
|
+
req: Request,
|
|
283
|
+
res: Response,
|
|
284
|
+
error: DyFM_AnyError,
|
|
285
|
+
issuer: string,
|
|
286
|
+
autoSecondTry?: boolean
|
|
287
|
+
): Promise<void> {
|
|
288
|
+
try {
|
|
289
|
+
let msg: string = `Endpoint caught an error. '${this.name}' (${this.endpoint})`;
|
|
290
|
+
|
|
291
|
+
msg += this.getPathParamsLogContent(req);
|
|
292
|
+
if (error instanceof DyFM_Error) {
|
|
293
|
+
msg += `\n ErrorCode: ${error._errorCode}`;
|
|
294
|
+
}
|
|
295
|
+
msg += `\n error: "${(error as DyFM_Error)?._message ?? (error as Error)?.message}"`;
|
|
296
|
+
msg += '\n at ' + this.stackLocation;
|
|
297
|
+
|
|
298
|
+
DyFM_Log.testError(msg);
|
|
299
|
+
|
|
300
|
+
if (
|
|
301
|
+
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
302
|
+
!(error instanceof DyFM_Error)
|
|
303
|
+
) {
|
|
304
|
+
DyFM_Log.H_error(
|
|
305
|
+
`Endpoint "${this.endpoint}" caught an error. (${this.name})`,
|
|
306
|
+
'\n ERROR:', error
|
|
307
|
+
);
|
|
308
|
+
} else if (DyNTS_global_settings.log_settings.api_errors) {
|
|
309
|
+
error.logSimple(`Endpoint "${this.endpoint}" caught an error. (${this.name})`);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if ((error as DyFM_Error)?.flag?.includes('DYNAMO')) {
|
|
313
|
+
if (!(error as DyFM_Error).additionalContent) {
|
|
314
|
+
(error as DyFM_Error).additionalContent = {};
|
|
315
|
+
}
|
|
316
|
+
(error as DyFM_Error).additionalContent.endpointInfo = msg;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
await DyNTS_GlobalService.globalErrorHandler?.(
|
|
320
|
+
error,
|
|
321
|
+
req,
|
|
322
|
+
res,
|
|
323
|
+
issuer
|
|
324
|
+
).catch((err): void => {
|
|
325
|
+
DyFM_Log.warn(
|
|
326
|
+
'DyNTS_GlobalService.globalErrorHandler failed to handle error: ',
|
|
327
|
+
err
|
|
328
|
+
);
|
|
329
|
+
DyFM_Log.warn('It will proceed as normal.');
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
if (error instanceof DyFM_Error) {
|
|
333
|
+
if (DyNTS_global_settings.compactErrorResponse) {
|
|
334
|
+
error = (error as DyFM_Error).getErrorsFlat();
|
|
335
|
+
delete (error as DyFM_Error).errors;
|
|
336
|
+
/* delete (error as DyFM_Error).error; */
|
|
337
|
+
delete (error as DyFM_Error).stack;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (
|
|
342
|
+
(error as DyFM_Error)?.flag?.includes('DYNAMO') &&
|
|
343
|
+
(error as DyFM_Error).confidentialContent
|
|
344
|
+
) {
|
|
345
|
+
delete (error as DyFM_Error).confidentialContent;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
try {
|
|
349
|
+
JSON.stringify(error);
|
|
350
|
+
} catch /* (stringifyError) */ {
|
|
351
|
+
if (this.autoResolveCirculation) {
|
|
352
|
+
try {
|
|
353
|
+
error = DyFM_Object.resolveCirculation(error);
|
|
354
|
+
JSON.stringify(error);
|
|
355
|
+
} catch /* (resolveError) */ {
|
|
356
|
+
DyFM_Log.H_error(
|
|
357
|
+
'DyNTS_Endpoint_Params: error object is not serializable, and not resolvable!'
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
error = new DyFM_Error({
|
|
361
|
+
error: new Error('UNRESOLVABLE UNSERIALIZABLE ERROR'),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
} else {
|
|
365
|
+
DyFM_Log.H_error('DyNTS_Endpoint_Params: error object is not serializable!');
|
|
366
|
+
|
|
367
|
+
error = new DyFM_Error({
|
|
368
|
+
error: new Error('UNSERIALIZABLE ERROR'),
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const status = (error as DyFM_Error)?.___status;
|
|
374
|
+
if (status && !isNaN(status)) {
|
|
375
|
+
res.status(status);
|
|
376
|
+
} else {
|
|
377
|
+
res.status(501);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if (
|
|
381
|
+
DyNTS_global_settings.env_settings.environment === DyFM_EnvironmentFlag.prod &&
|
|
382
|
+
error instanceof DyFM_Error
|
|
383
|
+
) {
|
|
384
|
+
delete (error as DyFM_Error).confidentialContent;
|
|
385
|
+
delete (error as DyFM_Error).additionalContent;
|
|
386
|
+
delete (error as DyFM_Error).error;
|
|
387
|
+
delete (error as DyFM_Error).errors;
|
|
388
|
+
delete (error as DyFM_Error).stack;
|
|
389
|
+
delete (error as DyFM_Error).__localStack;
|
|
390
|
+
/* DyFM_Error.deleteErrorContent(error as DyFM_Error); */
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
res.send(error);
|
|
394
|
+
|
|
395
|
+
if (this.logRequest) {
|
|
396
|
+
if (this.logResponseContent) {
|
|
397
|
+
DyFM_Log.error(
|
|
398
|
+
` <<<===== '${this.name}' error sent: ${(error as DyFM_Error)?._message ?? ''}`
|
|
399
|
+
);
|
|
400
|
+
DyFM_Log.error(
|
|
401
|
+
'sorry, the logResponseContent is not implemented yet.'
|
|
402
|
+
);
|
|
403
|
+
} else {
|
|
404
|
+
DyFM_Log.error(
|
|
405
|
+
` <<<===== '${this.name}' error sent: ${(error as DyFM_Error)?._message ?? ''}`
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
DyFM_Log.error('');
|
|
411
|
+
|
|
412
|
+
} catch (errorLvl2) {
|
|
413
|
+
this.multiLevelError(
|
|
414
|
+
errorLvl2,
|
|
415
|
+
{
|
|
416
|
+
req: req,
|
|
417
|
+
res: res,
|
|
418
|
+
error: error,
|
|
419
|
+
issuer: issuer,
|
|
420
|
+
autoSecondTry: autoSecondTry,
|
|
421
|
+
}
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
private multiLevelError(
|
|
427
|
+
errorLvl2: any,
|
|
428
|
+
errorInputs: {
|
|
429
|
+
req: Request,
|
|
430
|
+
res: Response,
|
|
431
|
+
error: Error | DyFM_Error,
|
|
432
|
+
issuer: string,
|
|
433
|
+
autoSecondTry: boolean
|
|
434
|
+
}
|
|
435
|
+
): void {
|
|
436
|
+
if (DyNTS_global_settings.log_settings.highDetailedLogs) {
|
|
437
|
+
const msg =
|
|
438
|
+
`\n\nDYNAMO MULTILEVEL ERROR:DyNTS_Endpoint_Params: error: ` +
|
|
439
|
+
`(${this.name}, ${this.endpoint})` +
|
|
440
|
+
`\n(DYNAMO MULTILEVEL ERROR means, that the ERROR HANDLING is ALSO FAILED, ` +
|
|
441
|
+
`and the error message was not sent.)` +
|
|
442
|
+
`\nthisEndpointStackLocation: ${this.stackLocation}`;
|
|
443
|
+
|
|
444
|
+
if (errorLvl2 instanceof DyFM_Error) {
|
|
445
|
+
errorLvl2.logSimple(msg);
|
|
446
|
+
} else {
|
|
447
|
+
DyFM_Log.H_error(msg, '\nERROR:', errorLvl2, '\n');
|
|
448
|
+
}
|
|
449
|
+
} else {
|
|
450
|
+
const msg =
|
|
451
|
+
`\n\nDYNAMO MULTILEVEL ERROR:DyNTS_Endpoint_Params: error: ` +
|
|
452
|
+
`(${this.name}, ${this.endpoint})` +
|
|
453
|
+
`\nthisEndpointStackLocation: ${this.stackLocation}` +
|
|
454
|
+
`\n(DYNAMO MULTILEVEL ERROR means, that the ERROR HANDLING is ALSO FAILED, ` +
|
|
455
|
+
`and the error message was not sent.)`;
|
|
456
|
+
|
|
457
|
+
if (errorLvl2 instanceof DyFM_Error) {
|
|
458
|
+
errorLvl2.logSimple(msg);
|
|
459
|
+
} else {
|
|
460
|
+
DyFM_Log.H_error(msg, '\nERROR:', errorLvl2, '\n');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
try {
|
|
465
|
+
JSON.stringify(errorInputs.error);
|
|
466
|
+
} catch /* (errorLvl2Replication) */ {
|
|
467
|
+
DyFM_Log.error(' ...response object is not serializable!');
|
|
468
|
+
let resolvedError: any;
|
|
469
|
+
|
|
470
|
+
try {
|
|
471
|
+
resolvedError = DyFM_Object.resolveCirculation(errorInputs.error);
|
|
472
|
+
} catch (errorLvl3) {
|
|
473
|
+
DyFM_Log.error(' ...response object is not resolvable!');
|
|
474
|
+
DyFM_Log.error(' ...', errorLvl3);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
if (resolvedError) {
|
|
478
|
+
if (this.autoResolveCirculation && !errorInputs.autoSecondTry) {
|
|
479
|
+
this.error(
|
|
480
|
+
errorInputs.req,
|
|
481
|
+
errorInputs.res,
|
|
482
|
+
resolvedError,
|
|
483
|
+
errorInputs.issuer,
|
|
484
|
+
true
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
DyFM_Log.warn(' ...automatic circulation error resolution was successful!');
|
|
488
|
+
|
|
489
|
+
return;
|
|
490
|
+
} else {
|
|
491
|
+
DyFM_Log.error(
|
|
492
|
+
' ...response object is resolvable! (use DyFM_Object.resolveCirculation)'
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (
|
|
499
|
+
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
500
|
+
!(errorLvl2 instanceof DyFM_Error)
|
|
501
|
+
) {
|
|
502
|
+
DyFM_Log.H_error(
|
|
503
|
+
`Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`,
|
|
504
|
+
'\n ERROR:', errorLvl2
|
|
505
|
+
);
|
|
506
|
+
} else {
|
|
507
|
+
errorLvl2.logSimple(
|
|
508
|
+
`Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
private getPathParamsLogContent(req: Request): string {
|
|
514
|
+
let params: string = '';
|
|
515
|
+
|
|
516
|
+
this.pathParams.forEach((param: string): void => {
|
|
517
|
+
params += `\n${param}: ${req.params[param]}`;
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
return params;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
|