@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,232 +1,232 @@
|
|
|
1
|
-
import { Request, Response } from 'express';
|
|
2
|
-
import { DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
3
|
-
import { DyNTS_AuthService } from '../../../_services/core/auth.service';
|
|
4
|
-
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
5
|
-
import { DyNTS_OAuth2_ControlService } from './oauth2.control-service';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* OAuth2 Authentication Service implementation
|
|
9
|
-
*
|
|
10
|
-
* This service handles OAuth2 specific authentication flows and token management
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* const authService = DyNTS_OAuth2_AuthService.getInstance();
|
|
14
|
-
* await authService.authenticate_token(req, res);
|
|
15
|
-
*/
|
|
16
|
-
export class DyNTS_OAuth2_AuthService extends DyNTS_AuthService {
|
|
17
|
-
static getInstance(): DyNTS_OAuth2_AuthService {
|
|
18
|
-
return DyNTS_OAuth2_AuthService.getSingletonInstance();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
private readonly controlService: DyNTS_OAuth2_ControlService = DyNTS_OAuth2_ControlService.getInstance();
|
|
22
|
-
|
|
23
|
-
readonly authenticate_token = async (req: Request, res: Response): Promise<void> => {
|
|
24
|
-
try {
|
|
25
|
-
const token = this.getTokenFromRequest(req);
|
|
26
|
-
|
|
27
|
-
// Validate token format
|
|
28
|
-
if (!token?.startsWith('Bearer ')) {
|
|
29
|
-
throw new DyFM_Error({
|
|
30
|
-
status: 401,
|
|
31
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-AT1`,
|
|
32
|
-
addECToUserMsg: true,
|
|
33
|
-
message: 'Invalid token format',
|
|
34
|
-
userMessage: this.defaultErrorUserMsg,
|
|
35
|
-
issuerService: this.serviceName,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
40
|
-
|
|
41
|
-
// Validate token against stored tokens
|
|
42
|
-
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
43
|
-
if (!tokenData || tokenData.expiresAt < Date.now()) {
|
|
44
|
-
throw new DyFM_Error({
|
|
45
|
-
status: 401,
|
|
46
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-AT2`,
|
|
47
|
-
addECToUserMsg: true,
|
|
48
|
-
message: 'Invalid or expired token',
|
|
49
|
-
userMessage: this.defaultErrorUserMsg,
|
|
50
|
-
issuerService: this.serviceName,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Set token in response header
|
|
55
|
-
res.setHeader('authorization', `Bearer ${accessToken}`);
|
|
56
|
-
} catch (error) {
|
|
57
|
-
DyFM_Log.error('OAuth2 token authentication failed', error);
|
|
58
|
-
throw new DyFM_Error({
|
|
59
|
-
status: 401,
|
|
60
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-AT0`,
|
|
61
|
-
addECToUserMsg: true,
|
|
62
|
-
message: 'OAuth2 token authentication failed',
|
|
63
|
-
userMessage: this.defaultErrorUserMsg,
|
|
64
|
-
issuerService: this.serviceName,
|
|
65
|
-
error
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
readonly authenticate_tokenSelf = async (req: Request, res: Response): Promise<void> => {
|
|
71
|
-
try {
|
|
72
|
-
const token = this.getTokenFromRequest(req);
|
|
73
|
-
|
|
74
|
-
// Validate token format
|
|
75
|
-
if (!token || !token.startsWith('Bearer ')) {
|
|
76
|
-
throw new DyFM_Error({
|
|
77
|
-
status: 401,
|
|
78
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS1`,
|
|
79
|
-
addECToUserMsg: true,
|
|
80
|
-
message: 'Invalid token format',
|
|
81
|
-
userMessage: this.defaultErrorUserMsg,
|
|
82
|
-
issuerService: this.serviceName,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
87
|
-
|
|
88
|
-
// Validate token against stored tokens
|
|
89
|
-
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
90
|
-
if (!tokenData || tokenData.expiresAt < Date.now()) {
|
|
91
|
-
throw new DyFM_Error({
|
|
92
|
-
status: 401,
|
|
93
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS2`,
|
|
94
|
-
addECToUserMsg: true,
|
|
95
|
-
message: 'Invalid or expired token',
|
|
96
|
-
userMessage: this.defaultErrorUserMsg,
|
|
97
|
-
issuerService: this.serviceName,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// For self-token validation, ensure the token is associated with the requesting user
|
|
102
|
-
const issuer = this.getIssuerFromRequest(req);
|
|
103
|
-
if (!issuer || issuer !== tokenData.clientId) {
|
|
104
|
-
throw new DyFM_Error({
|
|
105
|
-
status: 403,
|
|
106
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS3`,
|
|
107
|
-
addECToUserMsg: true,
|
|
108
|
-
message: 'Token not associated with requesting user',
|
|
109
|
-
userMessage: this.defaultErrorUserMsg,
|
|
110
|
-
issuerService: this.serviceName,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Set token in response header
|
|
115
|
-
res.setHeader('authorization', `Bearer ${accessToken}`);
|
|
116
|
-
} catch (error) {
|
|
117
|
-
DyFM_Log.error('OAuth2 self-token authentication failed', error);
|
|
118
|
-
throw new DyFM_Error({
|
|
119
|
-
status: 401,
|
|
120
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS0`,
|
|
121
|
-
addECToUserMsg: true,
|
|
122
|
-
message: 'OAuth2 self-token authentication failed',
|
|
123
|
-
userMessage: this.defaultErrorUserMsg,
|
|
124
|
-
issuerService: this.serviceName,
|
|
125
|
-
error
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
readonly authenticate_tokenPerm_accUsageData = async (req: Request, res: Response): Promise<void> => {
|
|
131
|
-
try {
|
|
132
|
-
const token = this.getTokenFromRequest(req);
|
|
133
|
-
|
|
134
|
-
// Validate token format
|
|
135
|
-
if (!token || !token.startsWith('Bearer ')) {
|
|
136
|
-
throw new DyFM_Error({
|
|
137
|
-
status: 401,
|
|
138
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU1`,
|
|
139
|
-
addECToUserMsg: true,
|
|
140
|
-
message: 'Invalid token format',
|
|
141
|
-
userMessage: this.defaultErrorUserMsg,
|
|
142
|
-
issuerService: this.serviceName,
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
147
|
-
|
|
148
|
-
// Validate token against stored tokens
|
|
149
|
-
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
150
|
-
if (!tokenData || tokenData.expiresAt < Date.now()) {
|
|
151
|
-
throw new DyFM_Error({
|
|
152
|
-
status: 401,
|
|
153
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU2`,
|
|
154
|
-
addECToUserMsg: true,
|
|
155
|
-
message: 'Invalid or expired token',
|
|
156
|
-
userMessage: this.defaultErrorUserMsg,
|
|
157
|
-
issuerService: this.serviceName,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Check if token has usage data permission
|
|
162
|
-
if (!tokenData.scope.includes('usage_data')) {
|
|
163
|
-
throw new DyFM_Error({
|
|
164
|
-
status: 403,
|
|
165
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU3`,
|
|
166
|
-
addECToUserMsg: true,
|
|
167
|
-
message: 'Token does not have usage data permission',
|
|
168
|
-
userMessage: this.defaultErrorUserMsg,
|
|
169
|
-
issuerService: this.serviceName,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Set token in response header
|
|
174
|
-
res.setHeader('authorization', `Bearer ${accessToken}`);
|
|
175
|
-
} catch (error) {
|
|
176
|
-
DyFM_Log.error('OAuth2 usage data permission check failed', error);
|
|
177
|
-
throw new DyFM_Error({
|
|
178
|
-
status: 401,
|
|
179
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU0`,
|
|
180
|
-
addECToUserMsg: true,
|
|
181
|
-
message: 'OAuth2 usage data permission check failed',
|
|
182
|
-
userMessage: this.defaultErrorUserMsg,
|
|
183
|
-
issuerService: this.serviceName,
|
|
184
|
-
error
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Gets the issuer (user ID) from the OAuth2 token in the request
|
|
191
|
-
* @param req Express Request object
|
|
192
|
-
* @returns The issuer ID from the token
|
|
193
|
-
*/
|
|
194
|
-
getIssuerFromRequest(req: Request): string {
|
|
195
|
-
try {
|
|
196
|
-
const token = this.getTokenFromRequest(req);
|
|
197
|
-
if (!token || !token.startsWith('Bearer ')) {
|
|
198
|
-
return undefined;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
202
|
-
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
203
|
-
|
|
204
|
-
return tokenData?.clientId;
|
|
205
|
-
} catch {
|
|
206
|
-
return undefined;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Gets the username from the OAuth2 token in the request
|
|
212
|
-
* @param req Express Request object
|
|
213
|
-
* @returns The username from the token
|
|
214
|
-
*/
|
|
215
|
-
getUsernameFromRequest(req: Request): string {
|
|
216
|
-
try {
|
|
217
|
-
const token = this.getTokenFromRequest(req);
|
|
218
|
-
if (!token || !token.startsWith('Bearer ')) {
|
|
219
|
-
return undefined;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
223
|
-
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
224
|
-
|
|
225
|
-
// TODO: Implement user information retrieval from database/storage
|
|
226
|
-
// For now, return the client ID as username
|
|
227
|
-
return tokenData?.clientId;
|
|
228
|
-
} catch {
|
|
229
|
-
return undefined;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
3
|
+
import { DyNTS_AuthService } from '../../../_services/core/auth.service';
|
|
4
|
+
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
5
|
+
import { DyNTS_OAuth2_ControlService } from './oauth2.control-service';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* OAuth2 Authentication Service implementation
|
|
9
|
+
*
|
|
10
|
+
* This service handles OAuth2 specific authentication flows and token management
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const authService = DyNTS_OAuth2_AuthService.getInstance();
|
|
14
|
+
* await authService.authenticate_token(req, res);
|
|
15
|
+
*/
|
|
16
|
+
export class DyNTS_OAuth2_AuthService extends DyNTS_AuthService {
|
|
17
|
+
static getInstance(): DyNTS_OAuth2_AuthService {
|
|
18
|
+
return DyNTS_OAuth2_AuthService.getSingletonInstance();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private readonly controlService: DyNTS_OAuth2_ControlService = DyNTS_OAuth2_ControlService.getInstance();
|
|
22
|
+
|
|
23
|
+
readonly authenticate_token = async (req: Request, res: Response): Promise<void> => {
|
|
24
|
+
try {
|
|
25
|
+
const token = this.getTokenFromRequest(req);
|
|
26
|
+
|
|
27
|
+
// Validate token format
|
|
28
|
+
if (!token?.startsWith('Bearer ')) {
|
|
29
|
+
throw new DyFM_Error({
|
|
30
|
+
status: 401,
|
|
31
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-AT1`,
|
|
32
|
+
addECToUserMsg: true,
|
|
33
|
+
message: 'Invalid token format',
|
|
34
|
+
userMessage: this.defaultErrorUserMsg,
|
|
35
|
+
issuerService: this.serviceName,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
40
|
+
|
|
41
|
+
// Validate token against stored tokens
|
|
42
|
+
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
43
|
+
if (!tokenData || tokenData.expiresAt < Date.now()) {
|
|
44
|
+
throw new DyFM_Error({
|
|
45
|
+
status: 401,
|
|
46
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-AT2`,
|
|
47
|
+
addECToUserMsg: true,
|
|
48
|
+
message: 'Invalid or expired token',
|
|
49
|
+
userMessage: this.defaultErrorUserMsg,
|
|
50
|
+
issuerService: this.serviceName,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Set token in response header
|
|
55
|
+
res.setHeader('authorization', `Bearer ${accessToken}`);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
DyFM_Log.error('OAuth2 token authentication failed', error);
|
|
58
|
+
throw new DyFM_Error({
|
|
59
|
+
status: 401,
|
|
60
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-AT0`,
|
|
61
|
+
addECToUserMsg: true,
|
|
62
|
+
message: 'OAuth2 token authentication failed',
|
|
63
|
+
userMessage: this.defaultErrorUserMsg,
|
|
64
|
+
issuerService: this.serviceName,
|
|
65
|
+
error
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
readonly authenticate_tokenSelf = async (req: Request, res: Response): Promise<void> => {
|
|
71
|
+
try {
|
|
72
|
+
const token = this.getTokenFromRequest(req);
|
|
73
|
+
|
|
74
|
+
// Validate token format
|
|
75
|
+
if (!token || !token.startsWith('Bearer ')) {
|
|
76
|
+
throw new DyFM_Error({
|
|
77
|
+
status: 401,
|
|
78
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS1`,
|
|
79
|
+
addECToUserMsg: true,
|
|
80
|
+
message: 'Invalid token format',
|
|
81
|
+
userMessage: this.defaultErrorUserMsg,
|
|
82
|
+
issuerService: this.serviceName,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
87
|
+
|
|
88
|
+
// Validate token against stored tokens
|
|
89
|
+
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
90
|
+
if (!tokenData || tokenData.expiresAt < Date.now()) {
|
|
91
|
+
throw new DyFM_Error({
|
|
92
|
+
status: 401,
|
|
93
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS2`,
|
|
94
|
+
addECToUserMsg: true,
|
|
95
|
+
message: 'Invalid or expired token',
|
|
96
|
+
userMessage: this.defaultErrorUserMsg,
|
|
97
|
+
issuerService: this.serviceName,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// For self-token validation, ensure the token is associated with the requesting user
|
|
102
|
+
const issuer = this.getIssuerFromRequest(req);
|
|
103
|
+
if (!issuer || issuer !== tokenData.clientId) {
|
|
104
|
+
throw new DyFM_Error({
|
|
105
|
+
status: 403,
|
|
106
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS3`,
|
|
107
|
+
addECToUserMsg: true,
|
|
108
|
+
message: 'Token not associated with requesting user',
|
|
109
|
+
userMessage: this.defaultErrorUserMsg,
|
|
110
|
+
issuerService: this.serviceName,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Set token in response header
|
|
115
|
+
res.setHeader('authorization', `Bearer ${accessToken}`);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
DyFM_Log.error('OAuth2 self-token authentication failed', error);
|
|
118
|
+
throw new DyFM_Error({
|
|
119
|
+
status: 401,
|
|
120
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATS0`,
|
|
121
|
+
addECToUserMsg: true,
|
|
122
|
+
message: 'OAuth2 self-token authentication failed',
|
|
123
|
+
userMessage: this.defaultErrorUserMsg,
|
|
124
|
+
issuerService: this.serviceName,
|
|
125
|
+
error
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
readonly authenticate_tokenPerm_accUsageData = async (req: Request, res: Response): Promise<void> => {
|
|
131
|
+
try {
|
|
132
|
+
const token = this.getTokenFromRequest(req);
|
|
133
|
+
|
|
134
|
+
// Validate token format
|
|
135
|
+
if (!token || !token.startsWith('Bearer ')) {
|
|
136
|
+
throw new DyFM_Error({
|
|
137
|
+
status: 401,
|
|
138
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU1`,
|
|
139
|
+
addECToUserMsg: true,
|
|
140
|
+
message: 'Invalid token format',
|
|
141
|
+
userMessage: this.defaultErrorUserMsg,
|
|
142
|
+
issuerService: this.serviceName,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
147
|
+
|
|
148
|
+
// Validate token against stored tokens
|
|
149
|
+
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
150
|
+
if (!tokenData || tokenData.expiresAt < Date.now()) {
|
|
151
|
+
throw new DyFM_Error({
|
|
152
|
+
status: 401,
|
|
153
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU2`,
|
|
154
|
+
addECToUserMsg: true,
|
|
155
|
+
message: 'Invalid or expired token',
|
|
156
|
+
userMessage: this.defaultErrorUserMsg,
|
|
157
|
+
issuerService: this.serviceName,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Check if token has usage data permission
|
|
162
|
+
if (!tokenData.scope.includes('usage_data')) {
|
|
163
|
+
throw new DyFM_Error({
|
|
164
|
+
status: 403,
|
|
165
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU3`,
|
|
166
|
+
addECToUserMsg: true,
|
|
167
|
+
message: 'Token does not have usage data permission',
|
|
168
|
+
userMessage: this.defaultErrorUserMsg,
|
|
169
|
+
issuerService: this.serviceName,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Set token in response header
|
|
174
|
+
res.setHeader('authorization', `Bearer ${accessToken}`);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
DyFM_Log.error('OAuth2 usage data permission check failed', error);
|
|
177
|
+
throw new DyFM_Error({
|
|
178
|
+
status: 401,
|
|
179
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-OA2-ATU0`,
|
|
180
|
+
addECToUserMsg: true,
|
|
181
|
+
message: 'OAuth2 usage data permission check failed',
|
|
182
|
+
userMessage: this.defaultErrorUserMsg,
|
|
183
|
+
issuerService: this.serviceName,
|
|
184
|
+
error
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Gets the issuer (user ID) from the OAuth2 token in the request
|
|
191
|
+
* @param req Express Request object
|
|
192
|
+
* @returns The issuer ID from the token
|
|
193
|
+
*/
|
|
194
|
+
getIssuerFromRequest(req: Request): string {
|
|
195
|
+
try {
|
|
196
|
+
const token = this.getTokenFromRequest(req);
|
|
197
|
+
if (!token || !token.startsWith('Bearer ')) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
202
|
+
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
203
|
+
|
|
204
|
+
return tokenData?.clientId;
|
|
205
|
+
} catch {
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Gets the username from the OAuth2 token in the request
|
|
212
|
+
* @param req Express Request object
|
|
213
|
+
* @returns The username from the token
|
|
214
|
+
*/
|
|
215
|
+
getUsernameFromRequest(req: Request): string {
|
|
216
|
+
try {
|
|
217
|
+
const token = this.getTokenFromRequest(req);
|
|
218
|
+
if (!token || !token.startsWith('Bearer ')) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const accessToken = token.substring(7); // Remove 'Bearer ' prefix
|
|
223
|
+
const tokenData = this.controlService.getAccessTokenData(accessToken);
|
|
224
|
+
|
|
225
|
+
// TODO: Implement user information retrieval from database/storage
|
|
226
|
+
// For now, return the client ID as username
|
|
227
|
+
return tokenData?.clientId;
|
|
228
|
+
} catch {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|