@futdevpro/nts-dynamo 1.15.151 → 1.15.154
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/__main.mdc +64 -64
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_debug.mdc +7 -7
- package/.cursor/rules/_ag_documentation_writing_rules.mdc +372 -372
- package/.cursor/rules/_ag_file-refactoring.mdc +113 -113
- package/.cursor/rules/_ag_fixes_rules.mdc +5 -5
- 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_running_commands.mdc +4 -4
- package/.cursor/rules/_ag_server-controller.mdc +5 -5
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/_ag_swearing.mdc +47 -47
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/ai_directives.md +114 -114
- 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/.dynamo/pipeline.cicd.config.json +190 -190
- package/.dynamo/version-bump.config.json +5 -5
- package/.github/workflows/main.yml +438 -438
- package/.husky/pre-commit +3 -3
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/README.md +790 -749
- package/__documentations/2026-04-28-logs-module.md +49 -49
- package/__documentations/2026-05-17-oai-compatible-providers.md +229 -229
- package/__documentations/2026-05-17-static-client-serving-howto.md +144 -144
- package/__documentations/2026-06-01-fr041-cors-middleware.md +96 -96
- package/__documentations/2026-06-01-fr047-p2p3-function-calling.md +81 -81
- package/__documentations/2026-06-15-fr193-memory-guard.md +73 -73
- package/__documentations/2026-08-08-fr292-app-version-header.md +38 -38
- package/__documentations/2026-08-14-field-encryption-mongoose-document-spread.md +124 -124
- package/__documentations/2026-08-18-artifact-compiler.md +46 -46
- package/__documentations/2026-08-18-mongo-transaction-control-service.md +82 -82
- package/__documentations/2026-08-18-standalone-account-security-and-privacy-bedrock.md +132 -132
- package/__documentations/2026-08-21-distributed-rate-limit-bfr-ctm-010.md +59 -59
- package/__documentations/2026-08-22-content-free-process-error-boundary.md +91 -0
- package/__documentations/2026-08-22-npm-token-state-classifier.md +92 -92
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
- package/_specifications/BACKLOG.md +92 -92
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_models/control-models/app-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/app-params.control-model.js +1 -2
- package/build/_models/control-models/app-params.control-model.js.map +1 -1
- package/build/_modules/server/index.d.ts +8 -0
- package/build/_modules/server/index.d.ts.map +1 -1
- package/build/_modules/server/index.js +9 -0
- package/build/_modules/server/index.js.map +1 -1
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-cause.type-enum.d.ts +9 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-cause.type-enum.d.ts.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-cause.type-enum.js +13 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-cause.type-enum.js.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.d.ts +20 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.d.ts.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.js +24 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.js.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.control-service.d.ts +19 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.control-service.d.ts.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.control-service.js +83 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.control-service.js.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.interface.d.ts +19 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.interface.d.ts.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.interface.js +3 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic.interface.js.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe-code.type-enum.d.ts +14 -0
- package/build/_modules/server/server-status/db-readiness-probe-code.type-enum.d.ts.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe-code.type-enum.js +18 -0
- package/build/_modules/server/server-status/db-readiness-probe-code.type-enum.js.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe-stage.type-enum.d.ts +8 -0
- package/build/_modules/server/server-status/db-readiness-probe-stage.type-enum.d.ts.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe-stage.type-enum.js +12 -0
- package/build/_modules/server/server-status/db-readiness-probe-stage.type-enum.js.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe.control-service.d.ts +14 -0
- package/build/_modules/server/server-status/db-readiness-probe.control-service.d.ts.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe.control-service.js +126 -0
- package/build/_modules/server/server-status/db-readiness-probe.control-service.js.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe.interface.d.ts +18 -0
- package/build/_modules/server/server-status/db-readiness-probe.interface.d.ts.map +1 -0
- package/build/_modules/server/server-status/db-readiness-probe.interface.js +3 -0
- package/build/_modules/server/server-status/db-readiness-probe.interface.js.map +1 -0
- package/build/_services/core/global.service.d.ts +3 -3
- package/build/_services/core/global.service.d.ts.map +1 -1
- package/build/_services/core/global.service.js +24 -18
- package/build/_services/core/global.service.js.map +1 -1
- package/build/_services/server/app.server.d.ts +2 -0
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +71 -199
- package/build/_services/server/app.server.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +1 -1
- package/pnpm-workspace.yaml +6 -6
- package/scripts/_seed-out/aim-seed.fixtures.ts +161 -161
- package/scripts/_seed-out/llm-expand-raw.json +59 -59
- package/scripts/_seed-out/seed-raw.json +152 -152
- package/scripts/ai-fixture-seed.js +126 -126
- 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/app-version-header.util.spec.ts +108 -108
- package/src/_collections/app-version-header.util.ts +74 -74
- package/src/_collections/archive-service-registry.const.ts +21 -21
- 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/client-safe-error.util.spec.ts +151 -151
- package/src/_collections/client-safe-error.util.ts +107 -107
- 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/field-encryption.util.spec.ts +195 -195
- package/src/_collections/field-encryption.util.ts +222 -222
- 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 +126 -126
- package/src/_collections/load-shed.util.spec.ts +62 -62
- package/src/_collections/load-shed.util.ts +51 -51
- package/src/_collections/mongo-reconnect-guard.util.spec.ts +52 -52
- package/src/_collections/mongo-reconnect-guard.util.ts +172 -172
- package/src/_collections/npm-token-check.util.spec.ts +218 -218
- package/src/_collections/npm-token-check.util.ts +327 -327
- package/src/_collections/sample.env +21 -21
- package/src/_collections/security-headers.util.spec.ts +98 -98
- package/src/_collections/security-headers.util.ts +96 -96
- package/src/_collections/signed-url.util.spec.ts +198 -198
- package/src/_collections/signed-url.util.ts +170 -170
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_collections/static-cache-control.util.spec.ts +47 -47
- package/src/_collections/static-cache-control.util.ts +25 -25
- 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 +213 -209
- package/src/_models/control-models/app-params.control-model.ts +130 -129
- 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 +669 -669
- package/src/_models/control-models/endpoint-params.control-model.ts +664 -664
- 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/data-models/schema-migration.data-model.ts +50 -50
- package/src/_models/interfaces/app-version-header-settings.interface.ts +17 -17
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/compare-data-options.interface.ts +27 -27
- package/src/_models/interfaces/compare-data-result.interface.ts +12 -12
- package/src/_models/interfaces/cors-settings.interface.spec.ts +52 -52
- package/src/_models/interfaces/cors-settings.interface.ts +56 -56
- package/src/_models/interfaces/db-query-options.interface.ts +33 -33
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/global-settings.interface.ts +294 -294
- package/src/_models/interfaces/migration-entry.interface.ts +19 -19
- package/src/_models/interfaces/mongo-transaction-settings.interface.ts +9 -9
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/security-headers-settings.interface.ts +50 -50
- package/src/_models/interfaces/signed-url-verify-result.interface.ts +13 -13
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +36 -36
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/account-security/_enums/account-challenge-purpose.type-enum.ts +5 -5
- package/src/_modules/account-security/_enums/account-refresh-token-state.type-enum.ts +6 -6
- package/src/_modules/account-security/_enums/account-session-state.type-enum.ts +6 -6
- package/src/_modules/account-security/_models/account-challenge-adapter.interface.ts +17 -17
- package/src/_modules/account-security/_models/account-challenge-issued.interface.ts +6 -6
- package/src/_modules/account-security/_models/account-challenge-record.interface.ts +13 -13
- package/src/_modules/account-security/_models/account-challenge-result.interface.ts +8 -8
- package/src/_modules/account-security/_models/account-challenge-settings.interface.ts +9 -9
- package/src/_modules/account-security/_models/account-password-policy.interface.ts +11 -11
- package/src/_modules/account-security/_models/account-password-verification.interface.ts +5 -5
- package/src/_modules/account-security/_models/account-refresh-token-record.interface.ts +13 -13
- package/src/_modules/account-security/_models/account-session-adapter.interface.ts +19 -19
- package/src/_modules/account-security/_models/account-session-claims.interface.ts +7 -7
- package/src/_modules/account-security/_models/account-session-context.interface.ts +6 -6
- package/src/_modules/account-security/_models/account-session-create.interface.ts +8 -8
- package/src/_modules/account-security/_models/account-session-record.interface.ts +21 -21
- package/src/_modules/account-security/_models/account-session-rotate.interface.ts +11 -11
- package/src/_modules/account-security/_models/account-session-settings.interface.ts +11 -11
- package/src/_modules/account-security/_models/account-session-token-pair.interface.ts +8 -8
- package/src/_modules/account-security/_models/account-session-view.interface.ts +13 -13
- package/src/_modules/account-security/account-challenge.control-service.spec.ts +195 -195
- package/src/_modules/account-security/account-challenge.control-service.ts +164 -164
- package/src/_modules/account-security/account-password.control-service.spec.ts +96 -96
- package/src/_modules/account-security/account-password.control-service.ts +288 -288
- package/src/_modules/account-security/account-session.control-service.spec.ts +294 -294
- package/src/_modules/account-security/account-session.control-service.ts +376 -376
- package/src/_modules/account-security/index.ts +31 -31
- package/src/_modules/admin-auth/_models/admin-api-key-config.interface.ts +33 -33
- package/src/_modules/admin-auth/admin-api-key.auth-service.spec.ts +200 -200
- package/src/_modules/admin-auth/admin-api-key.auth-service.ts +220 -220
- package/src/_modules/admin-auth/index.ts +2 -2
- package/src/_modules/ai/_collections/ai-model-config-validator.util.spec.ts +150 -150
- package/src/_modules/ai/_collections/ai-model-config-validator.util.ts +131 -131
- package/src/_modules/ai/_collections/ai-provider-error.util.ts +144 -144
- 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/_models/interfaces/dynts-ai-cost-event-callback.interface.ts +14 -14
- package/src/_modules/ai/_models/interfaces/dynts-ai-cost-event.interface.ts +56 -56
- package/src/_modules/ai/_models/interfaces/dynts-ai-provider-error.interface.ts +16 -16
- package/src/_modules/ai/_modules/ai-mock/_collections/aim-default-collection.util.spec.ts +72 -72
- package/src/_modules/ai/_modules/ai-mock/_collections/aim-default-collection.util.ts +71 -71
- package/src/_modules/ai/_modules/ai-mock/_collections/aim-fixture-match.util.spec.ts +57 -57
- package/src/_modules/ai/_modules/ai-mock/_collections/aim-fixture-match.util.ts +60 -60
- package/src/_modules/ai/_modules/ai-mock/_collections/aim-fixture-serializer.util.spec.ts +56 -56
- package/src/_modules/ai/_modules/ai-mock/_collections/aim-fixture-serializer.util.ts +117 -117
- package/src/_modules/ai/_modules/ai-mock/_enums/aim-modality.enum.ts +28 -28
- package/src/_modules/ai/_modules/ai-mock/_models/interfaces/aim-call-input.interface.ts +14 -14
- package/src/_modules/ai/_modules/ai-mock/_models/interfaces/aim-error.interface.ts +11 -11
- package/src/_modules/ai/_modules/ai-mock/_models/interfaces/aim-fixture.interface.ts +30 -30
- package/src/_modules/ai/_modules/ai-mock/_models/interfaces/aim-request.interface.ts +19 -19
- package/src/_modules/ai/_modules/ai-mock/_models/interfaces/aim-service-collection.interface.ts +20 -20
- package/src/_modules/ai/_modules/ai-mock/_services/ai-embedding-mock.service.spec.ts +115 -115
- package/src/_modules/ai/_modules/ai-mock/_services/ai-embedding-mock.service.ts +233 -233
- package/src/_modules/ai/_modules/ai-mock/_services/aim-fixture-harness.service.spec.ts +134 -134
- package/src/_modules/ai/_modules/ai-mock/_services/aim-fixture-harness.service.ts +127 -127
- package/src/_modules/ai/_modules/ai-mock/_services/aim-fixture-pipeline.spec.ts +105 -105
- package/src/_modules/ai/_modules/ai-mock/_services/aim-fixture-store.service.spec.ts +50 -50
- package/src/_modules/ai/_modules/ai-mock/_services/aim-fixture-store.service.ts +65 -65
- package/src/_modules/ai/_modules/ai-mock/_services/aim-integration-proof.spec.ts +92 -92
- package/src/_modules/ai/_modules/ai-mock/_services/aim-mock.service.spec.ts +112 -112
- package/src/_modules/ai/_modules/ai-mock/_services/aim-mock.service.ts +155 -155
- package/src/_modules/ai/_modules/ai-mock/fixtures/aim-text.fixtures.ts +649 -649
- package/src/_modules/ai/_modules/ai-mock/index.ts +47 -47
- 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-code-chunking.util.spec.ts +295 -295
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +552 -552
- 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-code-chunk.interface.ts +68 -68
- 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 +30 -30
- 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-doc-page.data-service.ts +572 -572
- 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-document.data-service.ts +435 -435
- 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 +332 -332
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +132 -132
- 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 +634 -634
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1085 -1085
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_modules/open-ai/index.ts +74 -74
- package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
- package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +114 -114
- 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.reconciler.spec.ts +133 -133
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +599 -599
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
- package/src/_modules/ai/_services/ai-provider.service-base.ts +67 -67
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +399 -399
- package/src/_modules/ai/index.ts +33 -33
- package/src/_modules/artifact-compiler/_enums/artifact-compile-outcome.type-enum.ts +5 -5
- package/src/_modules/artifact-compiler/_enums/artifact-compile-stage.type-enum.ts +8 -8
- package/src/_modules/artifact-compiler/_enums/artifact-retry-class.type-enum.ts +6 -6
- package/src/_modules/artifact-compiler/_models/artifact-compile.interface.ts +35 -35
- package/src/_modules/artifact-compiler/artifact-compiler.control-service.spec.ts +151 -151
- package/src/_modules/artifact-compiler/artifact-compiler.control-service.ts +356 -356
- package/src/_modules/artifact-compiler/index.ts +9 -9
- 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-io.control-service.ts +74 -74
- 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/assistant/index.ts +19 -19
- 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-message-wrapper.interface.ts +90 -90
- 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/discord-bot/_services/dib-messaging-provider.control-service.ts +641 -641
- package/src/_modules/bot/_modules/discord-bot/index.ts +12 -12
- 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/slack-bot/index.ts +12 -12
- 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/_modules/teams-bot/index.ts +11 -11
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-commands.control-service.ts +158 -158
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-io.control-service.ts +329 -329
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-main.control-service.ts +489 -489
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.ts +158 -158
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/bot/_services/bot-routines.control-service.ts +78 -78
- package/src/_modules/bot/index.ts +37 -37
- 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/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +176 -176
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
- package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
- package/src/_modules/data-readers/index.ts +11 -11
- 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/_services/dibo-routines.control-service.ts +97 -97
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
- package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +60 -60
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-bm25.util.spec.ts +159 -159
- package/src/_modules/local-vector-search/_services/lvs-bm25.util.ts +206 -206
- 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 +480 -480
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +214 -214
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +186 -186
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +130 -130
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +509 -509
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +323 -323
- package/src/_modules/local-vector-search/index.ts +16 -16
- package/src/_modules/logs/_models/file-log-entry.interface.ts +13 -13
- package/src/_modules/logs/_models/file-log-read-result.interface.ts +37 -37
- package/src/_modules/logs/file-log.service.spec.ts +341 -341
- package/src/_modules/logs/file-log.service.ts +466 -466
- package/src/_modules/logs/file-logs.controller.spec.ts +245 -245
- package/src/_modules/logs/file-logs.controller.ts +165 -165
- package/src/_modules/logs/get-file-logs-routing-module.util.ts +51 -51
- package/src/_modules/logs/get-logs-routing-module.util.ts +36 -36
- package/src/_modules/logs/index.ts +11 -11
- package/src/_modules/logs/log-buffer.service.ts +101 -101
- package/src/_modules/logs/logs.controller.ts +109 -109
- package/src/_modules/logs/logs.service.ts +100 -100
- package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +151 -151
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +125 -125
- package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
- package/src/_modules/mcp/index.ts +13 -13
- 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/_collections/msg.util.ts +83 -83
- 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/_services/msg.controller.ts +370 -370
- 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/privacy-lifecycle/_enums/privacy-consent-decision.type-enum.ts +5 -5
- package/src/_modules/privacy-lifecycle/_enums/privacy-contributor-action.type-enum.ts +10 -10
- package/src/_modules/privacy-lifecycle/_enums/privacy-contributor-outcome.type-enum.ts +7 -7
- package/src/_modules/privacy-lifecycle/_enums/privacy-request-state.type-enum.ts +15 -15
- package/src/_modules/privacy-lifecycle/_enums/privacy-request.type-enum.ts +9 -9
- package/src/_modules/privacy-lifecycle/_models/privacy-consent-input.interface.ts +12 -12
- package/src/_modules/privacy-lifecycle/_models/privacy-consent-persistence-result.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-consent-record.interface.ts +15 -15
- package/src/_modules/privacy-lifecycle/_models/privacy-consent-result.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-consent-view.interface.ts +13 -13
- package/src/_modules/privacy-lifecycle/_models/privacy-contributor-context.interface.ts +9 -9
- package/src/_modules/privacy-lifecycle/_models/privacy-contributor-outcome.interface.ts +14 -14
- package/src/_modules/privacy-lifecycle/_models/privacy-contributor-plan.interface.ts +8 -8
- package/src/_modules/privacy-lifecycle/_models/privacy-contributor.interface.ts +17 -17
- package/src/_modules/privacy-lifecycle/_models/privacy-ledger-adapter.interface.ts +21 -21
- package/src/_modules/privacy-lifecycle/_models/privacy-ledger-result.interface.ts +9 -9
- package/src/_modules/privacy-lifecycle/_models/privacy-ledger-settings.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-legal-acceptance-input.interface.ts +10 -10
- package/src/_modules/privacy-lifecycle/_models/privacy-legal-acceptance-persistence-result.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-legal-acceptance-result.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-legal-acceptance-view.interface.ts +11 -11
- package/src/_modules/privacy-lifecycle/_models/privacy-legal-acceptance.interface.ts +13 -13
- package/src/_modules/privacy-lifecycle/_models/privacy-lifecycle-adapter.interface.ts +19 -19
- package/src/_modules/privacy-lifecycle/_models/privacy-lifecycle-settings.interface.ts +9 -9
- package/src/_modules/privacy-lifecycle/_models/privacy-request-create-result.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-request-open.interface.ts +10 -10
- package/src/_modules/privacy-lifecycle/_models/privacy-request-persistence-create-result.interface.ts +7 -7
- package/src/_modules/privacy-lifecycle/_models/privacy-request-record.interface.ts +21 -21
- package/src/_modules/privacy-lifecycle/_models/privacy-request-result.interface.ts +8 -8
- package/src/_modules/privacy-lifecycle/_models/privacy-request-view.interface.ts +20 -20
- package/src/_modules/privacy-lifecycle/index.ts +40 -40
- package/src/_modules/privacy-lifecycle/privacy-ledger.control-service.spec.ts +206 -206
- package/src/_modules/privacy-lifecycle/privacy-ledger.control-service.ts +253 -253
- package/src/_modules/privacy-lifecycle/privacy-lifecycle.control-service.spec.ts +353 -353
- package/src/_modules/privacy-lifecycle/privacy-lifecycle.control-service.ts +586 -586
- package/src/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.ts +5 -5
- package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +82 -82
- package/src/_modules/rate-limit/_models/rate-limit-consume-request.interface.ts +9 -9
- package/src/_modules/rate-limit/_models/rate-limit-consume-result.interface.ts +6 -6
- package/src/_modules/rate-limit/_models/rate-limit-policy.interface.ts +16 -16
- package/src/_modules/rate-limit/_models/rate-limit-store.interface.ts +9 -9
- package/src/_modules/rate-limit/index.ts +8 -8
- package/src/_modules/rate-limit/rate-limit-in-memory.store.ts +91 -91
- package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +488 -488
- package/src/_modules/rate-limit/rate-limit.middleware.ts +504 -504
- package/src/_modules/scheduler/_models/scheduler-job.interface.ts +35 -35
- package/src/_modules/scheduler/get-scheduler-routing-module.util.ts +33 -33
- package/src/_modules/scheduler/index.ts +8 -8
- package/src/_modules/scheduler/scheduler.controller.spec.ts +42 -42
- package/src/_modules/scheduler/scheduler.controller.ts +69 -69
- package/src/_modules/scheduler/scheduler.service.spec.ts +141 -141
- package/src/_modules/scheduler/scheduler.service.ts +176 -176
- package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
- package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +82 -82
- package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +312 -312
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +311 -311
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +123 -123
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +108 -108
- package/src/_modules/scoped-config/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +246 -246
- package/src/_modules/server/errors/errors.control-service.ts +100 -100
- package/src/_modules/server/errors/errors.controller.spec.ts +340 -340
- package/src/_modules/server/errors/errors.controller.ts +559 -559
- package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
- package/src/_modules/server/errors/errors.data-service.ts +867 -867
- package/src/_modules/server/index.ts +37 -27
- package/src/_modules/server/safe-diagnostic/safe-diagnostic-cause.type-enum.ts +8 -0
- package/src/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.ts +19 -0
- package/src/_modules/server/safe-diagnostic/safe-diagnostic.control-service.spec.ts +124 -0
- package/src/_modules/server/safe-diagnostic/safe-diagnostic.control-service.ts +99 -0
- package/src/_modules/server/safe-diagnostic/safe-diagnostic.interface.ts +20 -0
- package/src/_modules/server/server-status/db-readiness-probe-code.type-enum.ts +13 -0
- package/src/_modules/server/server-status/db-readiness-probe-stage.type-enum.ts +7 -0
- package/src/_modules/server/server-status/db-readiness-probe.control-service.spec.ts +235 -0
- package/src/_modules/server/server-status/db-readiness-probe.control-service.ts +158 -0
- package/src/_modules/server/server-status/db-readiness-probe.interface.ts +20 -0
- 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 +672 -672
- package/src/_modules/server/server-status/server-status.control-service.ts +490 -490
- package/src/_modules/server/server-status/server-status.controller.spec.ts +276 -276
- package/src/_modules/server/server-status/server-status.controller.ts +336 -336
- 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 +165 -165
- package/src/_modules/socket/_models/socket-presence.control-model.ts +211 -211
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +69 -69
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +33 -33
- 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 +272 -272
- package/src/_modules/socket/_services/socket-server.service.ts +1037 -1037
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +648 -648
- 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/test-email-sink/_collections/test-email-pattern.const.ts +10 -10
- package/src/_modules/test-email-sink/_models/data-models/dynts-sent-test-mail.data-model.ts +41 -41
- package/src/_modules/test-email-sink/_services/dynts-test-email-sink.service.spec.ts +112 -112
- package/src/_modules/test-email-sink/_services/dynts-test-email-sink.service.ts +141 -141
- package/src/_modules/test-email-sink/get-sent-mail-routing-module.util.ts +29 -29
- package/src/_modules/test-email-sink/index.ts +11 -11
- package/src/_modules/test-email-sink/test-email-sink.controller.ts +83 -83
- 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 +106 -106
- package/src/_modules/usage/usage.controller.ts +140 -140
- 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 +209 -209
- package/src/_services/base/archive-data.service.ts +228 -228
- package/src/_services/base/data.service.spec.ts +784 -784
- package/src/_services/base/data.service.ts +2792 -2792
- package/src/_services/base/db.service.encryption.spec.ts +76 -76
- package/src/_services/base/db.service.spec.ts +160 -160
- package/src/_services/base/db.service.ts +1698 -1698
- 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 +187 -187
- package/src/_services/core/api.service.ts +627 -627
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/collection-growth-monitor.service.spec.ts +119 -119
- package/src/_services/core/collection-growth-monitor.service.ts +234 -234
- package/src/_services/core/db-stats.service.ts +104 -104
- package/src/_services/core/diagnostics.service.spec.ts +44 -44
- package/src/_services/core/diagnostics.service.ts +158 -158
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +757 -757
- package/src/_services/core/event-loop-diag.service.spec.ts +22 -22
- package/src/_services/core/event-loop-diag.service.ts +144 -144
- package/src/_services/core/global.service.spec.ts +292 -292
- package/src/_services/core/global.service.ts +466 -465
- package/src/_services/core/memory-guard.service.spec.ts +245 -245
- package/src/_services/core/memory-guard.service.ts +481 -481
- package/src/_services/core/migration-runner.service.spec.ts +91 -91
- package/src/_services/core/migration-runner.service.ts +106 -106
- package/src/_services/core/mongo-transaction.control-service.spec.ts +165 -165
- package/src/_services/core/mongo-transaction.control-service.ts +148 -148
- package/src/_services/core/request-hunter.service.spec.ts +124 -124
- package/src/_services/core/request-hunter.service.ts +157 -157
- 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/server/app-safe-diagnostic.spec.ts +124 -0
- package/src/_services/server/app.server-retention.spec.ts +106 -106
- package/src/_services/server/app.server.ts +1865 -1918
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +117 -117
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
- package/.dynamo/logs/cicd-pipeline/output.log +0 -2883
- package/.dynamo/logs/cicd-pipeline/status.json +0 -74
|
@@ -1,867 +1,867 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
DyFM_AnyError,
|
|
7
|
-
DyFM_DBFilter,
|
|
8
|
-
DyFM_DataModel_Params, DyFM_Error, DyFM_ErrorLevel, DyFM_Error_Settings,
|
|
9
|
-
DyFM_Log, DyFM_Object, DyFM_errorFlag, DyFM_Errors,
|
|
10
|
-
DyFM_RelativeDate,
|
|
11
|
-
DyFM_Array,
|
|
12
|
-
DyFM_Paged,
|
|
13
|
-
DyFM_Time,
|
|
14
|
-
DyFM_SearchQuery,
|
|
15
|
-
DyFM_SearchResult,
|
|
16
|
-
DyFM_Errors_FixAttempt,
|
|
17
|
-
DyFM_ErrorStatus
|
|
18
|
-
} from '@futdevpro/fsm-dynamo';
|
|
19
|
-
|
|
20
|
-
import { DyNTS_Errors_ControlService } from './errors.control-service';
|
|
21
|
-
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
22
|
-
import { DyNTS_DBUpdate } from '../../../_models/types/db-update.type';
|
|
23
|
-
import { DyNTS_DataService } from '../../../_services/base/data.service';
|
|
24
|
-
|
|
25
|
-
export class DyNTS_Errors_DataService<
|
|
26
|
-
T_Error extends DyFM_Error,
|
|
27
|
-
T_ErrorsRecord extends DyFM_Errors<T_Error>
|
|
28
|
-
> extends DyNTS_DataService<T_ErrorsRecord> implements DyNTS_Errors_ControlService<T_Error, T_ErrorsRecord> {
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* FR-279 — egy error-rekord max merete (byte), amely folott levagjuk az
|
|
32
|
-
* `additionalContent`-et. A korabbi kod ezt a szamot HAROM helyen ismetelte
|
|
33
|
-
* inline literalkent; nevesitve egy helyen all, es a szerializacio is egyszer fut.
|
|
34
|
-
*/
|
|
35
|
-
static readonly MAX_ERROR_RECORD_BYTES: number = 16793000;
|
|
36
|
-
|
|
37
|
-
debugLog: boolean = false;
|
|
38
|
-
readonly version: string = DyNTS_global_settings.systemVersion;
|
|
39
|
-
duplicationCounter: number;
|
|
40
|
-
|
|
41
|
-
/* constructor(
|
|
42
|
-
set: {
|
|
43
|
-
data?: T_Error,
|
|
44
|
-
issuer: string,
|
|
45
|
-
},
|
|
46
|
-
dataParams: DyFM_DataModel_Params<T_Error>
|
|
47
|
-
) {
|
|
48
|
-
super(
|
|
49
|
-
new FDP_Errors(set?.data) as T_Error,
|
|
50
|
-
dataParams,
|
|
51
|
-
set.issuer
|
|
52
|
-
);
|
|
53
|
-
} */
|
|
54
|
-
|
|
55
|
-
async recordError(
|
|
56
|
-
errorsRecord: T_ErrorsRecord,
|
|
57
|
-
issuer: string,
|
|
58
|
-
alwaysRecord?: boolean
|
|
59
|
-
): Promise<void> {
|
|
60
|
-
try {
|
|
61
|
-
if (issuer && !this.issuer) {
|
|
62
|
-
this.issuer = issuer;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const errorVersion = this.data?.versions?.length ? this.data?.versions[0] : ('SERVER-' + this.version);
|
|
66
|
-
if (
|
|
67
|
-
!alwaysRecord &&
|
|
68
|
-
errorVersion.includes('dev') ||
|
|
69
|
-
errorVersion.includes('alpha') ||
|
|
70
|
-
errorVersion.includes('beta')
|
|
71
|
-
) {
|
|
72
|
-
DyFM_Log.warn('error not saved (dev version)');
|
|
73
|
-
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (!errorsRecord && this.data) {
|
|
78
|
-
errorsRecord = this.data;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (!errorsRecord) {
|
|
82
|
-
throw new DyFM_Error({
|
|
83
|
-
...this.getDefaultErrorSettings(
|
|
84
|
-
'recordError',
|
|
85
|
-
new Error('error data is not defined')
|
|
86
|
-
),
|
|
87
|
-
|
|
88
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RE1`,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// FR-069 (2026-06-06): user-level errorokat IS rogzitjuk.
|
|
93
|
-
// Korabban a user-level errorokat (pl. login: "No account found", "Wrong password",
|
|
94
|
-
// register: "Email already taken" — auth-service `validateNRegisterLogin` chain)
|
|
95
|
-
// eldobtak SAVE elott. Eredmeny: a login/register failures nem jelentek meg az
|
|
96
|
-
// errors-tablaban, igy a Overseer dashboard-on nem voltak lathato-k, a fejleszto
|
|
97
|
-
// nem latta hany failed-login-attempt volt.
|
|
98
|
-
// Per memory [[feedback_rich_error_handling]] "EVERY error, rich descriptive,
|
|
99
|
-
// persisted to errors table". Plusz [[feedback_error_logging_policy]] "EVERY error
|
|
100
|
-
// from a system logs in its OWN table; sister-system-unreachable filtered at source".
|
|
101
|
-
// A user-level errorokat is mentjuk — a dashboard-on level-szerinti filter szuri
|
|
102
|
-
// (info-debug-warn-error-critical-user), de a rekord MEG van.
|
|
103
|
-
|
|
104
|
-
if (errorsRecord.message?.includes?.('NullReferenceException')) {
|
|
105
|
-
errorsRecord.message += '\n' + errorsRecord.exception.split('() (at <')[0];
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const duplicateError: T_ErrorsRecord = await this.findData({
|
|
109
|
-
message: errorsRecord.message,
|
|
110
|
-
} as DyFM_DBFilter<T_ErrorsRecord>, true);
|
|
111
|
-
|
|
112
|
-
errorsRecord.d_error = this.checkErrorIsStringifyableOrResolvable(errorsRecord.d_error, this.issuer) as T_Error;
|
|
113
|
-
|
|
114
|
-
// ─── FR-279 (2026-08-06) — EGYSZER szerializalunk, nem haromszor ──────────
|
|
115
|
-
//
|
|
116
|
-
// ⚠️ MERT BUG: ez a blokk KORABBAN akar HAROM teljes `JSON.stringify(errorsRecord)`-ot
|
|
117
|
-
// futtatott EGYETLEN error-rekordra, SZINKRON, a fo szalon — es az ELSO eredmenyet
|
|
118
|
-
// (a "stringify-elheto-e" teszt) EL IS DOBTA. A meret-plafon 16.7 MB, tehat ezek a
|
|
119
|
-
// rekordok tobb-MB-osak lehetnek: haromszoros koltseg, teljesen feleslegesen.
|
|
120
|
-
//
|
|
121
|
-
// MIERT SZAMIT (mert incidens, overseer 2026-08-06): a status-sweep ~30 rendszert
|
|
122
|
-
// pingel; a nem elerhetok 3000 ms-os timeouttal bukanak, es MINDEN bukas egy error-
|
|
123
|
-
// rekordot general (teljes `DyNTS_ApiCall_Params` + stack + additionalContent). A
|
|
124
|
-
// fagyasok elotti log kizarolag ilyen sorokkal van tele:
|
|
125
|
-
// error: "timeout of 3000ms exceeded" / project-statuses.control-services.js:147
|
|
126
|
-
// Az event-loop kozben 10-11 masodpercre megall (elLag max 10469-11123 ms), a heap
|
|
127
|
-
// 2 GB-ra hizik, es a runnerek `next-job` hivasa timeoutol -> a CI megall.
|
|
128
|
-
//
|
|
129
|
-
// A szinkron, tobb-MB-os JSON-szerializacio a fo szalon PONTOSAN ilyen blokkot ad —
|
|
130
|
-
// es a harmadolasa ingyen van: ugyanaz a viselkedes, egy-ket szerializaciobol.
|
|
131
|
-
let serialized: string;
|
|
132
|
-
try {
|
|
133
|
-
serialized = JSON.stringify(errorsRecord);
|
|
134
|
-
} catch (err) {
|
|
135
|
-
DyFM_Log.error('error data is not stringifyable!');
|
|
136
|
-
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (serialized.length > DyNTS_Errors_DataService.MAX_ERROR_RECORD_BYTES) {
|
|
141
|
-
errorsRecord.additionalContent = {
|
|
142
|
-
message: 'error data was too big to save, removed additionalContent',
|
|
143
|
-
};
|
|
144
|
-
errorsRecord.error ??= {};
|
|
145
|
-
errorsRecord.error.additionalContent = {
|
|
146
|
-
message: 'error data was too big to save, removed additionalContent',
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
// Ujra-meres CSAK a levagas utan — es csak akkor, ha egyaltalan tullogtuk a plafont.
|
|
150
|
-
serialized = JSON.stringify(errorsRecord);
|
|
151
|
-
if (serialized.length > DyNTS_Errors_DataService.MAX_ERROR_RECORD_BYTES) {
|
|
152
|
-
errorsRecord.error.errors = [];
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (
|
|
157
|
-
duplicateError &&
|
|
158
|
-
duplicateError?.message === errorsRecord?.message
|
|
159
|
-
) {
|
|
160
|
-
if (!errorsRecord.__created) {
|
|
161
|
-
errorsRecord.__created = new Date();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
this.duplicationCounter = duplicateError.count + 1;
|
|
165
|
-
|
|
166
|
-
const duplicateRecordUpdate: DyNTS_DBUpdate<T_ErrorsRecord> = {
|
|
167
|
-
$inc: {
|
|
168
|
-
count: 1,
|
|
169
|
-
priority: this.getPriorityMultiplierByLevel(errorsRecord?.level),
|
|
170
|
-
},
|
|
171
|
-
} as DyNTS_DBUpdate<T_ErrorsRecord>;
|
|
172
|
-
|
|
173
|
-
// 2026-06-02 fix: a `$addToSet: { versions: { $push: errorVersion } }`
|
|
174
|
-
// formátum a MongoDB-be LITERAL `{$push: '<version>'}`-objektumot ír be
|
|
175
|
-
// a tömbbe, NEM a `$addToSet`-szemantikát alkalmazza. A helyes alak
|
|
176
|
-
// egyszerűen `$addToSet: { versions: errorVersion }` — a `$addToSet`
|
|
177
|
-
// önállóan idempotensen ad hozzá értéket a tömbhöz.
|
|
178
|
-
errorsRecord.versions ??= [];
|
|
179
|
-
if (!errorsRecord.versions.includes(errorVersion)) {
|
|
180
|
-
(duplicateRecordUpdate as any).$addToSet = {
|
|
181
|
-
versions: errorVersion,
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// 2026-08-07 — a LEGUTOLSO elofordulas kontextusa.
|
|
186
|
-
//
|
|
187
|
-
// MERT BUG: ez az ag eddig CSAK `$inc`-elt, ezert az `additionalContent` AZ ELSO
|
|
188
|
-
// elofordulasnal BEFAGYOTT. Egy hosszu eletu hibanal a diagnosztika orokre a hetekkel-
|
|
189
|
-
// honapokkal ezelotti elso esethez tartozott, es a kesobb bevezetett gazdagabb kontextus
|
|
190
|
-
// (origin / referer / user-agent / header-kulcsok) SOHA nem jutott el a rekordba.
|
|
191
|
-
//
|
|
192
|
-
// ELESBEN MERVE: az overseer `No authentication provided` rekordja 68 587 elofordulasnal
|
|
193
|
-
// tartott, `additionalContent`-je viszont csak egy regi `endpointInfo` volt. A hivot igy
|
|
194
|
-
// KIZAROLAG a szerver-logbol lehetett volna azonositani — az viszont ~13 percenkent forog,
|
|
195
|
-
// egy loketszeru (~1/perc) esemenynel pedig rendszeresen elveti. A hibarekordbol NEM
|
|
196
|
-
// lehetett megmondani, KI hivja.
|
|
197
|
-
//
|
|
198
|
-
// Az `additionalContent` (elso elofordulas) VALTOZATLAN marad — semmi nem vesz el; ez egy
|
|
199
|
-
// KULON mezo a legfrissebb esetnek. Igy a "mikor kezdodott" es a "ki csinalja MOST" kerdes
|
|
200
|
-
// egyszerre valaszolhato meg a rekordbol.
|
|
201
|
-
if (errorsRecord.additionalContent !== undefined) {
|
|
202
|
-
(duplicateRecordUpdate as any).$set = {
|
|
203
|
-
...((duplicateRecordUpdate as any).$set ?? {}),
|
|
204
|
-
lastOccurrenceContent: errorsRecord.additionalContent,
|
|
205
|
-
lastOccurrenceAt: new Date(),
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Regression detect — a duplicate-ag-on egy NEW occurrence érkezett.
|
|
210
|
-
// Ha mar volt fix-attempt erre az error-ra, es a jelenlegi version
|
|
211
|
-
// ujabb vagy egyenlo mint a fix-attempt verzioja, akkor a hipotezis
|
|
212
|
-
// nem zarta le a problemat → flag-eljuk a dashboardnak.
|
|
213
|
-
if (
|
|
214
|
-
duplicateError.lastFixedInVersion &&
|
|
215
|
-
DyNTS_Errors_DataService.isVersionAtLeast(errorVersion, duplicateError.lastFixedInVersion)
|
|
216
|
-
) {
|
|
217
|
-
// Auto-reactivation: a recurrence carrying a version >= the last
|
|
218
|
-
// claimed-fix version means the fix did not hold → flip back to an
|
|
219
|
-
// active-again state. `regressed` (not plain `active`) so the next
|
|
220
|
-
// investigator knows a prior hypothesis already failed.
|
|
221
|
-
(duplicateRecordUpdate as any).$set = {
|
|
222
|
-
...((duplicateRecordUpdate as any).$set ?? {}),
|
|
223
|
-
regressedAfterFix: true,
|
|
224
|
-
status: DyFM_ErrorStatus.regressed,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
await this.updateData({
|
|
229
|
-
filterBy: { _id: duplicateError._id } as DyFM_DBFilter<T_ErrorsRecord>,
|
|
230
|
-
update: duplicateRecordUpdate,
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// ezt majd ha leülepedett, hogy biztos nem kellenek a deep duplication-ök
|
|
234
|
-
// (a WB-ban kellhettek a user és pc config info-k)
|
|
235
|
-
/* if (!duplicateError.duplications.includes(data.stackTrace)) {
|
|
236
|
-
await this.updateData({
|
|
237
|
-
filterBy: { _id: duplicateError._id } as DyFM_DBFilter<Error_T>,
|
|
238
|
-
update: {
|
|
239
|
-
$push: { duplications: DyFM_Object.clone(data) },
|
|
240
|
-
} as DyNTS_DBUpdate<Error_T>,
|
|
241
|
-
}).catch((pushError) => {
|
|
242
|
-
DyFM_Log.error('pushError:', pushError);
|
|
243
|
-
});
|
|
244
|
-
} */
|
|
245
|
-
|
|
246
|
-
DyFM_Log.error(
|
|
247
|
-
'error found, not saving ("known" error), but increased count, ' +
|
|
248
|
-
'\ncount:', duplicateError.count + 1
|
|
249
|
-
);
|
|
250
|
-
DyFM_Log.error(
|
|
251
|
-
'ErrorMsg:', errorsRecord?.message?.replace(/\n/g, ' \n')
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
if (this.debugLog) DyFM_Log.error('Error:', errorsRecord);
|
|
255
|
-
} else {
|
|
256
|
-
DyFM_Log.log('error not found, saving....');
|
|
257
|
-
DyFM_Log.error(
|
|
258
|
-
'ErrorMsg:', errorsRecord?.message?.replace(/\n/g, ' \n')
|
|
259
|
-
);
|
|
260
|
-
|
|
261
|
-
if (this.debugLog) DyFM_Log.error('Error:', errorsRecord);
|
|
262
|
-
|
|
263
|
-
errorsRecord.priority = this.getPriorityMultiplierByLevel(errorsRecord?.level);
|
|
264
|
-
|
|
265
|
-
// 2026-06-02 fix: count default — a `recordError`-t loose `any`-obj-
|
|
266
|
-
// ektummal hivo path-ok (pl. systemUnreachable / buildFailure hook a
|
|
267
|
-
// host-app-ban) nem inicializaltak a `count: 1`-et a DyFM_Errors class
|
|
268
|
-
// konstruktor-default helyett. A schema-ban sincs default, igy a
|
|
269
|
-
// Mongoose-record-on `undefined` maradt. Most explicit.
|
|
270
|
-
errorsRecord.count ??= 1;
|
|
271
|
-
|
|
272
|
-
errorsRecord.duplications ??= [];
|
|
273
|
-
errorsRecord.duplications.push(DyFM_Object.clone(errorsRecord));
|
|
274
|
-
|
|
275
|
-
errorsRecord.versions ??= [];
|
|
276
|
-
errorsRecord.versions.push(errorVersion);
|
|
277
|
-
|
|
278
|
-
// New error → starts life as `active` (default on the data-model, set
|
|
279
|
-
// explicitly here for loose-`any` record paths that bypass the ctor default).
|
|
280
|
-
errorsRecord.status ??= DyFM_ErrorStatus.active;
|
|
281
|
-
|
|
282
|
-
this.duplicationCounter = 1;
|
|
283
|
-
|
|
284
|
-
// FR-027 (2026-05-24) — Pass `errorsRecord` explicitly. Korabban
|
|
285
|
-
// `saveData()` no-arg fallback `ensureData()`-on keresztul `this.data`-t
|
|
286
|
-
// hasznalt, ami a controller-szinten csak a `{issuer}` constructor
|
|
287
|
-
// wrapper, NEM az actual req.body adat. Eredmenykent minden client-
|
|
288
|
-
// forwarded error EMPTY rekordkent landolt: csak `issuer` mezo,
|
|
289
|
-
// semmilyen message/source/stackTrace/error/level/additionalContent
|
|
290
|
-
// mezo NEM kerult MongoDB-be. (Overseer-en 14454 ilyen empty record
|
|
291
|
-
// halmozodott fel — debug-level details elveszve.)
|
|
292
|
-
await this.saveData(errorsRecord);
|
|
293
|
-
DyFM_Log.warn('error saved');
|
|
294
|
-
}
|
|
295
|
-
} catch (error) {
|
|
296
|
-
DyFM_Error.logSimple('recordError error', error);
|
|
297
|
-
/* if (error instanceof DyFM_Error) {
|
|
298
|
-
error.logSimple('recordError error');
|
|
299
|
-
} else {
|
|
300
|
-
DyFM_Log.error('recordError error:', error);
|
|
301
|
-
} */
|
|
302
|
-
/* throw new DyFM_Error({
|
|
303
|
-
...this.getDefaultErrorSettings(
|
|
304
|
-
'recordError',
|
|
305
|
-
error
|
|
306
|
-
),
|
|
307
|
-
|
|
308
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RE0`,
|
|
309
|
-
}); */
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
protected async createErrorRecord(
|
|
314
|
-
error: DyFM_AnyError | any,
|
|
315
|
-
issuer: string,
|
|
316
|
-
): Promise<T_ErrorsRecord> {
|
|
317
|
-
try {
|
|
318
|
-
if ((error as DyFM_Error)?.flag?.includes(DyFM_errorFlag)) {
|
|
319
|
-
return new DyFM_Errors({
|
|
320
|
-
issuer: this.issuer,
|
|
321
|
-
versions: [ 'SERVER-' + this.version ],
|
|
322
|
-
|
|
323
|
-
source: 'INTERNAL-SERVER-ERROR: ' + (error as DyFM_Error)?.___issuerService,
|
|
324
|
-
|
|
325
|
-
stackTrace: (error as DyFM_Error)?._errorCodes,
|
|
326
|
-
error: (error as DyFM_Error)?.getErrorSimplified?.(),
|
|
327
|
-
level: (error as DyFM_Error)?.level ?? DyFM_ErrorLevel.error,
|
|
328
|
-
|
|
329
|
-
message: (error as DyFM_Error)?._message,
|
|
330
|
-
exceptionObj:
|
|
331
|
-
(error as DyFM_Error)?.errors?.map(
|
|
332
|
-
(e: DyFM_Error): DyFM_Error_Settings | '' => e?.getErrorSimplified?.() ?? ''
|
|
333
|
-
),
|
|
334
|
-
|
|
335
|
-
additionalContent: (error as DyFM_Error)?.additionalContent,
|
|
336
|
-
}) as T_ErrorsRecord;
|
|
337
|
-
} else {
|
|
338
|
-
return new DyFM_Errors({
|
|
339
|
-
issuer: this.issuer,
|
|
340
|
-
versions: [ 'SERVER-' + this.version ],
|
|
341
|
-
|
|
342
|
-
source: 'UNEXPECTED-SERVER-ERROR',
|
|
343
|
-
|
|
344
|
-
stackTrace: (error as Error)?.stack?.split?.('\n'),
|
|
345
|
-
error: error,
|
|
346
|
-
level: DyFM_ErrorLevel.critical,
|
|
347
|
-
|
|
348
|
-
message: (error as Error)?.message,
|
|
349
|
-
exceptionObj: (error as Error)?.stack?.split?.('\n'),
|
|
350
|
-
}) as T_ErrorsRecord;
|
|
351
|
-
}
|
|
352
|
-
} catch (error) {
|
|
353
|
-
throw new DyFM_Error({
|
|
354
|
-
...this.getDefaultErrorSettings('createErrorRecord', error),
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
async handleExternalError(
|
|
360
|
-
error: T_Error,
|
|
361
|
-
issuer: string,
|
|
362
|
-
alwaysRecord?: boolean,
|
|
363
|
-
): Promise<void> {
|
|
364
|
-
try {
|
|
365
|
-
if (this.debugLog) DyFM_Log.log('handleExternalError');
|
|
366
|
-
|
|
367
|
-
if (issuer && !this.issuer) {
|
|
368
|
-
this.issuer = issuer;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const errorsRecord: T_ErrorsRecord = await this.createErrorRecord(error, this.issuer);
|
|
372
|
-
|
|
373
|
-
await this.recordError(errorsRecord, this.issuer, alwaysRecord);
|
|
374
|
-
} catch (error) {
|
|
375
|
-
throw new DyFM_Error({
|
|
376
|
-
...this.getDefaultErrorSettings('handleExternalError', error),
|
|
377
|
-
|
|
378
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-HE0`,
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
async handleInternalError(
|
|
384
|
-
error: DyFM_AnyError | any,
|
|
385
|
-
issuer: string,
|
|
386
|
-
alwaysRecord?: boolean,
|
|
387
|
-
): Promise<void> {
|
|
388
|
-
try {
|
|
389
|
-
if (this.debugLog) DyFM_Log.log('handleInternalError');
|
|
390
|
-
|
|
391
|
-
if (issuer && !this.issuer) {
|
|
392
|
-
this.issuer = issuer;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const errorsRecord: T_ErrorsRecord = await this.createErrorRecord(error, this.issuer);
|
|
396
|
-
|
|
397
|
-
/* if (!(error as FDP_Errors)?.flag?.includes('WB-ERROR-OBJECT')) {
|
|
398
|
-
DyFM_Log.H_error('__ERROR__:', error);
|
|
399
|
-
} */
|
|
400
|
-
|
|
401
|
-
await this.recordError(errorsRecord, this.issuer, alwaysRecord);
|
|
402
|
-
|
|
403
|
-
DyFM_Error.logSimple(`DyNTS_Error_DataService handling InternalError...`, error);
|
|
404
|
-
/* if (
|
|
405
|
-
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
406
|
-
!(error instanceof DyFM_Error)
|
|
407
|
-
) {
|
|
408
|
-
DyFM_Log.H_error(
|
|
409
|
-
`DyNTS_Error_DataService handling InternalError...`,
|
|
410
|
-
`\n ERROR:`, error
|
|
411
|
-
);
|
|
412
|
-
} else {
|
|
413
|
-
error.logSimple(
|
|
414
|
-
`DyNTS_Error_DataService handling InternalError...`
|
|
415
|
-
);
|
|
416
|
-
} */
|
|
417
|
-
} catch (error) {
|
|
418
|
-
DyFM_Error.logSimple('handleInternalError error', error);
|
|
419
|
-
/* if (error instanceof DyFM_Error) {
|
|
420
|
-
error.logSimple('handleInternalError error');
|
|
421
|
-
} else {
|
|
422
|
-
DyFM_Log.error('handleInternalError error:', error);
|
|
423
|
-
} */
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
checkErrorIsStringifyableOrResolvable(error: T_Error, issuer: string): T_Error | 'UNRESOLVABLE' {
|
|
428
|
-
try {
|
|
429
|
-
if (issuer && !this.issuer) {
|
|
430
|
-
this.issuer = issuer;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
JSON.stringify(error);
|
|
434
|
-
} catch (err) {
|
|
435
|
-
DyFM_Error.logSimple('checkErrorIsStringifyableOrResolvable error', err);
|
|
436
|
-
/* if (err instanceof DyFM_Error) {
|
|
437
|
-
err.logSimple('checkErrorIsStringifyableOrResolvable error');
|
|
438
|
-
} else {
|
|
439
|
-
DyFM_Log.error('checkErrorIsStringifyableOrResolvable error:', err);
|
|
440
|
-
} */
|
|
441
|
-
|
|
442
|
-
error = DyFM_Object.resolveCirculation(error);
|
|
443
|
-
|
|
444
|
-
try {
|
|
445
|
-
JSON.stringify(error);
|
|
446
|
-
} catch (err) {
|
|
447
|
-
delete error.additionalContent;
|
|
448
|
-
|
|
449
|
-
try {
|
|
450
|
-
JSON.stringify(error);
|
|
451
|
-
} catch (errr) {
|
|
452
|
-
DyFM_Error.logSimple('checkErrorIsStringifyableOrResolvable error', errr);
|
|
453
|
-
/* if (err instanceof DyFM_Error) {
|
|
454
|
-
err.logSimple('error data is not stringifyable! resolution failed! will not save!');
|
|
455
|
-
} else {
|
|
456
|
-
DyFM_Log.error('error data is not stringifyable! resolution failed! will not save!', err);
|
|
457
|
-
} */
|
|
458
|
-
|
|
459
|
-
return 'UNRESOLVABLE';
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
DyFM_Log.error('error data was too big to save, removed additionalContent');
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
return error;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
getPriorityMultiplierByLevel(level: DyFM_ErrorLevel): number {
|
|
470
|
-
switch (level) {
|
|
471
|
-
case DyFM_ErrorLevel.critical:
|
|
472
|
-
case DyFM_ErrorLevel.fatal:
|
|
473
|
-
return 1000;
|
|
474
|
-
|
|
475
|
-
case DyFM_ErrorLevel.error:
|
|
476
|
-
case DyFM_ErrorLevel.serious:
|
|
477
|
-
return 100;
|
|
478
|
-
|
|
479
|
-
case DyFM_ErrorLevel.buildFailure:
|
|
480
|
-
return 50;
|
|
481
|
-
|
|
482
|
-
case DyFM_ErrorLevel.systemUnreachable:
|
|
483
|
-
return 20;
|
|
484
|
-
|
|
485
|
-
case DyFM_ErrorLevel.warning:
|
|
486
|
-
return 10;
|
|
487
|
-
|
|
488
|
-
case DyFM_ErrorLevel.info:
|
|
489
|
-
case DyFM_ErrorLevel.debug:
|
|
490
|
-
case DyFM_ErrorLevel.known:
|
|
491
|
-
return 0.01;
|
|
492
|
-
|
|
493
|
-
case DyFM_ErrorLevel.user:
|
|
494
|
-
default:
|
|
495
|
-
return 0;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
async getErrorsFromDate(
|
|
500
|
-
date: Date,
|
|
501
|
-
issuer: string,
|
|
502
|
-
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
503
|
-
try {
|
|
504
|
-
if (issuer && !this.issuer) {
|
|
505
|
-
this.issuer = issuer;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
const errors: T_ErrorsRecord[] = await this.findDataList({ __created: { $gte: date } });
|
|
509
|
-
|
|
510
|
-
return DyFM_Array.paged(errors, 0, 100);
|
|
511
|
-
} catch (error) {
|
|
512
|
-
throw new DyFM_Error({
|
|
513
|
-
...this.getDefaultErrorSettings(
|
|
514
|
-
'getErrorsFromDate',
|
|
515
|
-
error
|
|
516
|
-
),
|
|
517
|
-
|
|
518
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GED0`,
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
async deleteError(errorId: string, issuer: string, alwaysDelete?: boolean): Promise<void> {
|
|
524
|
-
try {
|
|
525
|
-
if (issuer && !this.issuer) {
|
|
526
|
-
this.issuer = issuer;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
await this.deleteData(errorId, alwaysDelete);
|
|
530
|
-
} catch (error) {
|
|
531
|
-
throw new DyFM_Error({
|
|
532
|
-
...this.getDefaultErrorSettings('deleteError', error),
|
|
533
|
-
|
|
534
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-DE0`,
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
async deleteAllErrors(issuer: string, alwaysDelete?: boolean): Promise<void> {
|
|
540
|
-
try {
|
|
541
|
-
if (issuer && !this.issuer) {
|
|
542
|
-
this.issuer = issuer;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
await this.deleteAllData(alwaysDelete);
|
|
546
|
-
} catch (error) {
|
|
547
|
-
throw new DyFM_Error({
|
|
548
|
-
...this.getDefaultErrorSettings('deleteAllErrors', error),
|
|
549
|
-
|
|
550
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-DAE0`,
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
/**
|
|
556
|
-
* Record a "we think this is fixed" claim on an existing error.
|
|
557
|
-
*
|
|
558
|
-
* Append-only: every call pushes a new `DyFM_Errors_FixAttempt` to
|
|
559
|
-
* `fixAttempts[]` and updates the `last*` aliases for quick reads.
|
|
560
|
-
* Also clears `regressedAfterFix` so the dashboard treats the error as
|
|
561
|
-
* freshly-claimed-fixed; if a new occurrence arrives with a version
|
|
562
|
-
* `>= version`, `recordError` will flip the flag back on.
|
|
563
|
-
*/
|
|
564
|
-
async recordFixAttempt(
|
|
565
|
-
errorId: string,
|
|
566
|
-
version: string,
|
|
567
|
-
hypothesis: string,
|
|
568
|
-
issuer: string,
|
|
569
|
-
notes?: string
|
|
570
|
-
): Promise<DyFM_Errors_FixAttempt> {
|
|
571
|
-
try {
|
|
572
|
-
if (issuer && !this.issuer) {
|
|
573
|
-
this.issuer = issuer;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
const existing = await this.findData({ _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>);
|
|
577
|
-
if (!existing) {
|
|
578
|
-
throw new DyFM_Error({
|
|
579
|
-
...this.getDefaultErrorSettings('recordFixAttempt', new Error(`error not found: ${errorId}`)),
|
|
580
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RFA0`,
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
const attempt: DyFM_Errors_FixAttempt = {
|
|
585
|
-
at: new Date(),
|
|
586
|
-
by: issuer,
|
|
587
|
-
version: version,
|
|
588
|
-
hypothesis: hypothesis,
|
|
589
|
-
...(notes ? { notes: notes } : {}),
|
|
590
|
-
};
|
|
591
|
-
|
|
592
|
-
const nextAttempts: DyFM_Errors_FixAttempt[] = [
|
|
593
|
-
...((existing as any).fixAttempts ?? []),
|
|
594
|
-
attempt,
|
|
595
|
-
];
|
|
596
|
-
|
|
597
|
-
await this.updateData({
|
|
598
|
-
filterBy: { _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>,
|
|
599
|
-
update: {
|
|
600
|
-
$set: {
|
|
601
|
-
fixAttempts: nextAttempts,
|
|
602
|
-
lastFixedAt: attempt.at,
|
|
603
|
-
lastFixedBy: attempt.by,
|
|
604
|
-
lastFixedInVersion: attempt.version,
|
|
605
|
-
lastFixHypothesis: attempt.hypothesis,
|
|
606
|
-
regressedAfterFix: false,
|
|
607
|
-
status: DyFM_ErrorStatus.fixed,
|
|
608
|
-
},
|
|
609
|
-
} as DyNTS_DBUpdate<T_ErrorsRecord>,
|
|
610
|
-
});
|
|
611
|
-
|
|
612
|
-
return attempt;
|
|
613
|
-
} catch (error) {
|
|
614
|
-
throw new DyFM_Error({
|
|
615
|
-
...this.getDefaultErrorSettings('recordFixAttempt', error),
|
|
616
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RFA1`,
|
|
617
|
-
});
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
/**
|
|
622
|
-
* Soft-resolve an error: set `status = fixed` and KEEP the record (unlike
|
|
623
|
-
* `deleteError` / `markErrorDone` which hard-delete). Keeping the record is
|
|
624
|
-
* what enables auto-reactivation — a later recurrence (`recordError`) with a
|
|
625
|
-
* version >= the last claimed-fix version flips it to `regressed`.
|
|
626
|
-
*
|
|
627
|
-
* Optional `notes` are stored on `resolutionNotes`. Clears `regressedAfterFix`.
|
|
628
|
-
* Does NOT append a `fixAttempt` (use `recordFixAttempt` when there is a
|
|
629
|
-
* version + hypothesis to log); this is the lightweight "mark as handled" path.
|
|
630
|
-
*/
|
|
631
|
-
async resolveError(
|
|
632
|
-
errorId: string,
|
|
633
|
-
issuer: string,
|
|
634
|
-
notes?: string
|
|
635
|
-
): Promise<void> {
|
|
636
|
-
try {
|
|
637
|
-
if (issuer && !this.issuer) {
|
|
638
|
-
this.issuer = issuer;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
const existing: T_ErrorsRecord = await this.findData({ _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>);
|
|
642
|
-
if (!existing) {
|
|
643
|
-
throw new DyFM_Error({
|
|
644
|
-
...this.getDefaultErrorSettings('resolveError', new Error(`error not found: ${errorId}`)),
|
|
645
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RES0`,
|
|
646
|
-
});
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
await this.updateData({
|
|
650
|
-
filterBy: { _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>,
|
|
651
|
-
update: {
|
|
652
|
-
$set: {
|
|
653
|
-
status: DyFM_ErrorStatus.fixed,
|
|
654
|
-
regressedAfterFix: false,
|
|
655
|
-
...(notes ? { resolutionNotes: notes } : {}),
|
|
656
|
-
},
|
|
657
|
-
} as DyNTS_DBUpdate<T_ErrorsRecord>,
|
|
658
|
-
});
|
|
659
|
-
} catch (error) {
|
|
660
|
-
throw new DyFM_Error({
|
|
661
|
-
...this.getDefaultErrorSettings('resolveError', error),
|
|
662
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RES1`,
|
|
663
|
-
});
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
/**
|
|
668
|
-
* Paged errors filtered by lifecycle `status` (active / investigating / fixed
|
|
669
|
-
* / regressed). An empty or `'all'` status returns everything (same semantics
|
|
670
|
-
* as `getErrorsPaged`). Mirrors `getErrorsByCategoryPaged`.
|
|
671
|
-
*/
|
|
672
|
-
async getErrorsByStatusPaged(
|
|
673
|
-
status: string,
|
|
674
|
-
range: DyFM_RelativeDate,
|
|
675
|
-
pageSize: number,
|
|
676
|
-
pageIndex: number,
|
|
677
|
-
issuer: string,
|
|
678
|
-
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
679
|
-
try {
|
|
680
|
-
if (issuer && !this.issuer) {
|
|
681
|
-
this.issuer = issuer;
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
685
|
-
const filter: any = { __lastModified: { $gte: fromDate } };
|
|
686
|
-
if (status && status !== 'all') {
|
|
687
|
-
filter.status = status;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
let errors: T_ErrorsRecord[] = await this.findDataList(filter);
|
|
691
|
-
errors = errors.sort((a, b): number => b.priority - a.priority);
|
|
692
|
-
|
|
693
|
-
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
694
|
-
} catch (error) {
|
|
695
|
-
throw new DyFM_Error({
|
|
696
|
-
...this.getDefaultErrorSettings('getErrorsByStatusPaged', error),
|
|
697
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GBSP0`,
|
|
698
|
-
});
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
/**
|
|
703
|
-
* Loose numeric compare of two version strings of shape `MAJOR.MINOR.PATCH`
|
|
704
|
-
* (`01.15.117`). Pads missing segments with 0. Non-numeric segments are
|
|
705
|
-
* treated as 0 — version strings carrying prefixes like `SERVER-` from
|
|
706
|
-
* `recordError` are caller-stripped before this is invoked.
|
|
707
|
-
*
|
|
708
|
-
* Returns true when `a >= b`.
|
|
709
|
-
*/
|
|
710
|
-
static isVersionAtLeast(a: string, b: string): boolean {
|
|
711
|
-
if (!a || !b) {
|
|
712
|
-
return false;
|
|
713
|
-
}
|
|
714
|
-
const strip = (v: string): string => v.replace(/^[^0-9]+/, '');
|
|
715
|
-
const parse = (v: string): number[] => strip(v).split('.').map(s => Number(s) || 0);
|
|
716
|
-
const aParts = parse(a);
|
|
717
|
-
const bParts = parse(b);
|
|
718
|
-
const len = Math.max(aParts.length, bParts.length);
|
|
719
|
-
for (let i = 0; i < len; i++) {
|
|
720
|
-
const av = aParts[i] ?? 0;
|
|
721
|
-
const bv = bParts[i] ?? 0;
|
|
722
|
-
if (av > bv) {
|
|
723
|
-
return true;
|
|
724
|
-
}
|
|
725
|
-
if (av < bv) {
|
|
726
|
-
return false;
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
return true;
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
async getErrorsInRange(range: DyFM_RelativeDate, issuer: string): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
733
|
-
try {
|
|
734
|
-
if (issuer && !this.issuer) {
|
|
735
|
-
this.issuer = issuer;
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
739
|
-
|
|
740
|
-
let errors: T_ErrorsRecord[] = await this.findDataList({ __lastModified: { $gte: fromDate } });
|
|
741
|
-
errors = errors.sort(
|
|
742
|
-
(a, b): number => b.priority - a.priority
|
|
743
|
-
);
|
|
744
|
-
|
|
745
|
-
return DyFM_Array.paged(errors, 0, 10);
|
|
746
|
-
} catch (error) {
|
|
747
|
-
throw new DyFM_Error({
|
|
748
|
-
...this.getDefaultErrorSettings('getErrorsInRange', error),
|
|
749
|
-
|
|
750
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GIR0`,
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
async getErrorsPaged(
|
|
756
|
-
range: DyFM_RelativeDate,
|
|
757
|
-
pageSize: number,
|
|
758
|
-
pageIndex: number,
|
|
759
|
-
issuer: string,
|
|
760
|
-
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
761
|
-
try {
|
|
762
|
-
if (issuer && !this.issuer) {
|
|
763
|
-
this.issuer = issuer;
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
767
|
-
|
|
768
|
-
let errors: T_ErrorsRecord[] = await this.findDataList({ __lastModified: { $gte: fromDate } });
|
|
769
|
-
errors = errors.sort(
|
|
770
|
-
(a, b): number => b.priority - a.priority
|
|
771
|
-
);
|
|
772
|
-
|
|
773
|
-
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
774
|
-
} catch (error) {
|
|
775
|
-
throw new DyFM_Error({
|
|
776
|
-
...this.getDefaultErrorSettings('getErrorsPaged', error),
|
|
777
|
-
|
|
778
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GIP0`,
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
/**
|
|
784
|
-
* Paged-eredmenyek a `category` mezo szerint. A frontend "Errors" page tab-jai
|
|
785
|
-
* (Application / System Unreachable / Build Failure) ezt hivjak. Egy ures-
|
|
786
|
-
* vagy `'all'` kategoria mindent visszaad (azonos szemantikaval mint a
|
|
787
|
-
* `getErrorsPaged`-tel).
|
|
788
|
-
*/
|
|
789
|
-
async getErrorsByCategoryPaged(
|
|
790
|
-
category: string,
|
|
791
|
-
range: DyFM_RelativeDate,
|
|
792
|
-
pageSize: number,
|
|
793
|
-
pageIndex: number,
|
|
794
|
-
issuer: string,
|
|
795
|
-
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
796
|
-
try {
|
|
797
|
-
if (issuer && !this.issuer) {
|
|
798
|
-
this.issuer = issuer;
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
802
|
-
const filter: any = { __lastModified: { $gte: fromDate } };
|
|
803
|
-
if (category && category !== 'all') {
|
|
804
|
-
filter.category = category;
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
let errors: T_ErrorsRecord[] = await this.findDataList(filter);
|
|
808
|
-
errors = errors.sort((a, b): number => b.priority - a.priority);
|
|
809
|
-
|
|
810
|
-
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
811
|
-
} catch (error) {
|
|
812
|
-
throw new DyFM_Error({
|
|
813
|
-
...this.getDefaultErrorSettings('getErrorsByCategoryPaged', error),
|
|
814
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GBCP0`,
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
async getLastErrors(
|
|
820
|
-
range: DyFM_RelativeDate,
|
|
821
|
-
pageSize: number,
|
|
822
|
-
pageIndex: number,
|
|
823
|
-
issuer: string,
|
|
824
|
-
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
825
|
-
try {
|
|
826
|
-
if (issuer && !this.issuer) {
|
|
827
|
-
this.issuer = issuer;
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
831
|
-
|
|
832
|
-
let errors: T_ErrorsRecord[] = await this.findDataList({
|
|
833
|
-
__lastModified: { $gte: fromDate }
|
|
834
|
-
});
|
|
835
|
-
errors = errors.sort(
|
|
836
|
-
(a, b): number => +b.__lastModified - +a.__lastModified
|
|
837
|
-
);
|
|
838
|
-
|
|
839
|
-
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
840
|
-
} catch (error) {
|
|
841
|
-
throw new DyFM_Error({
|
|
842
|
-
...this.getDefaultErrorSettings('getLastErrors', error),
|
|
843
|
-
|
|
844
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GLE0`,
|
|
845
|
-
});
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
async searchErrors(
|
|
850
|
-
searchQuery: DyFM_SearchQuery<T_ErrorsRecord>,
|
|
851
|
-
issuer: string,
|
|
852
|
-
): Promise<DyFM_SearchResult<T_ErrorsRecord>> {
|
|
853
|
-
try {
|
|
854
|
-
if (issuer && !this.issuer) {
|
|
855
|
-
this.issuer = issuer;
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
return await this.searchData(searchQuery);
|
|
859
|
-
} catch (error) {
|
|
860
|
-
throw new DyFM_Error({
|
|
861
|
-
...this.getDefaultErrorSettings('searchErrors', error),
|
|
862
|
-
|
|
863
|
-
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-SE0`,
|
|
864
|
-
});
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
}
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
DyFM_AnyError,
|
|
7
|
+
DyFM_DBFilter,
|
|
8
|
+
DyFM_DataModel_Params, DyFM_Error, DyFM_ErrorLevel, DyFM_Error_Settings,
|
|
9
|
+
DyFM_Log, DyFM_Object, DyFM_errorFlag, DyFM_Errors,
|
|
10
|
+
DyFM_RelativeDate,
|
|
11
|
+
DyFM_Array,
|
|
12
|
+
DyFM_Paged,
|
|
13
|
+
DyFM_Time,
|
|
14
|
+
DyFM_SearchQuery,
|
|
15
|
+
DyFM_SearchResult,
|
|
16
|
+
DyFM_Errors_FixAttempt,
|
|
17
|
+
DyFM_ErrorStatus
|
|
18
|
+
} from '@futdevpro/fsm-dynamo';
|
|
19
|
+
|
|
20
|
+
import { DyNTS_Errors_ControlService } from './errors.control-service';
|
|
21
|
+
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
22
|
+
import { DyNTS_DBUpdate } from '../../../_models/types/db-update.type';
|
|
23
|
+
import { DyNTS_DataService } from '../../../_services/base/data.service';
|
|
24
|
+
|
|
25
|
+
export class DyNTS_Errors_DataService<
|
|
26
|
+
T_Error extends DyFM_Error,
|
|
27
|
+
T_ErrorsRecord extends DyFM_Errors<T_Error>
|
|
28
|
+
> extends DyNTS_DataService<T_ErrorsRecord> implements DyNTS_Errors_ControlService<T_Error, T_ErrorsRecord> {
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* FR-279 — egy error-rekord max merete (byte), amely folott levagjuk az
|
|
32
|
+
* `additionalContent`-et. A korabbi kod ezt a szamot HAROM helyen ismetelte
|
|
33
|
+
* inline literalkent; nevesitve egy helyen all, es a szerializacio is egyszer fut.
|
|
34
|
+
*/
|
|
35
|
+
static readonly MAX_ERROR_RECORD_BYTES: number = 16793000;
|
|
36
|
+
|
|
37
|
+
debugLog: boolean = false;
|
|
38
|
+
readonly version: string = DyNTS_global_settings.systemVersion;
|
|
39
|
+
duplicationCounter: number;
|
|
40
|
+
|
|
41
|
+
/* constructor(
|
|
42
|
+
set: {
|
|
43
|
+
data?: T_Error,
|
|
44
|
+
issuer: string,
|
|
45
|
+
},
|
|
46
|
+
dataParams: DyFM_DataModel_Params<T_Error>
|
|
47
|
+
) {
|
|
48
|
+
super(
|
|
49
|
+
new FDP_Errors(set?.data) as T_Error,
|
|
50
|
+
dataParams,
|
|
51
|
+
set.issuer
|
|
52
|
+
);
|
|
53
|
+
} */
|
|
54
|
+
|
|
55
|
+
async recordError(
|
|
56
|
+
errorsRecord: T_ErrorsRecord,
|
|
57
|
+
issuer: string,
|
|
58
|
+
alwaysRecord?: boolean
|
|
59
|
+
): Promise<void> {
|
|
60
|
+
try {
|
|
61
|
+
if (issuer && !this.issuer) {
|
|
62
|
+
this.issuer = issuer;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const errorVersion = this.data?.versions?.length ? this.data?.versions[0] : ('SERVER-' + this.version);
|
|
66
|
+
if (
|
|
67
|
+
!alwaysRecord &&
|
|
68
|
+
errorVersion.includes('dev') ||
|
|
69
|
+
errorVersion.includes('alpha') ||
|
|
70
|
+
errorVersion.includes('beta')
|
|
71
|
+
) {
|
|
72
|
+
DyFM_Log.warn('error not saved (dev version)');
|
|
73
|
+
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!errorsRecord && this.data) {
|
|
78
|
+
errorsRecord = this.data;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!errorsRecord) {
|
|
82
|
+
throw new DyFM_Error({
|
|
83
|
+
...this.getDefaultErrorSettings(
|
|
84
|
+
'recordError',
|
|
85
|
+
new Error('error data is not defined')
|
|
86
|
+
),
|
|
87
|
+
|
|
88
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RE1`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// FR-069 (2026-06-06): user-level errorokat IS rogzitjuk.
|
|
93
|
+
// Korabban a user-level errorokat (pl. login: "No account found", "Wrong password",
|
|
94
|
+
// register: "Email already taken" — auth-service `validateNRegisterLogin` chain)
|
|
95
|
+
// eldobtak SAVE elott. Eredmeny: a login/register failures nem jelentek meg az
|
|
96
|
+
// errors-tablaban, igy a Overseer dashboard-on nem voltak lathato-k, a fejleszto
|
|
97
|
+
// nem latta hany failed-login-attempt volt.
|
|
98
|
+
// Per memory [[feedback_rich_error_handling]] "EVERY error, rich descriptive,
|
|
99
|
+
// persisted to errors table". Plusz [[feedback_error_logging_policy]] "EVERY error
|
|
100
|
+
// from a system logs in its OWN table; sister-system-unreachable filtered at source".
|
|
101
|
+
// A user-level errorokat is mentjuk — a dashboard-on level-szerinti filter szuri
|
|
102
|
+
// (info-debug-warn-error-critical-user), de a rekord MEG van.
|
|
103
|
+
|
|
104
|
+
if (errorsRecord.message?.includes?.('NullReferenceException')) {
|
|
105
|
+
errorsRecord.message += '\n' + errorsRecord.exception.split('() (at <')[0];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const duplicateError: T_ErrorsRecord = await this.findData({
|
|
109
|
+
message: errorsRecord.message,
|
|
110
|
+
} as DyFM_DBFilter<T_ErrorsRecord>, true);
|
|
111
|
+
|
|
112
|
+
errorsRecord.d_error = this.checkErrorIsStringifyableOrResolvable(errorsRecord.d_error, this.issuer) as T_Error;
|
|
113
|
+
|
|
114
|
+
// ─── FR-279 (2026-08-06) — EGYSZER szerializalunk, nem haromszor ──────────
|
|
115
|
+
//
|
|
116
|
+
// ⚠️ MERT BUG: ez a blokk KORABBAN akar HAROM teljes `JSON.stringify(errorsRecord)`-ot
|
|
117
|
+
// futtatott EGYETLEN error-rekordra, SZINKRON, a fo szalon — es az ELSO eredmenyet
|
|
118
|
+
// (a "stringify-elheto-e" teszt) EL IS DOBTA. A meret-plafon 16.7 MB, tehat ezek a
|
|
119
|
+
// rekordok tobb-MB-osak lehetnek: haromszoros koltseg, teljesen feleslegesen.
|
|
120
|
+
//
|
|
121
|
+
// MIERT SZAMIT (mert incidens, overseer 2026-08-06): a status-sweep ~30 rendszert
|
|
122
|
+
// pingel; a nem elerhetok 3000 ms-os timeouttal bukanak, es MINDEN bukas egy error-
|
|
123
|
+
// rekordot general (teljes `DyNTS_ApiCall_Params` + stack + additionalContent). A
|
|
124
|
+
// fagyasok elotti log kizarolag ilyen sorokkal van tele:
|
|
125
|
+
// error: "timeout of 3000ms exceeded" / project-statuses.control-services.js:147
|
|
126
|
+
// Az event-loop kozben 10-11 masodpercre megall (elLag max 10469-11123 ms), a heap
|
|
127
|
+
// 2 GB-ra hizik, es a runnerek `next-job` hivasa timeoutol -> a CI megall.
|
|
128
|
+
//
|
|
129
|
+
// A szinkron, tobb-MB-os JSON-szerializacio a fo szalon PONTOSAN ilyen blokkot ad —
|
|
130
|
+
// es a harmadolasa ingyen van: ugyanaz a viselkedes, egy-ket szerializaciobol.
|
|
131
|
+
let serialized: string;
|
|
132
|
+
try {
|
|
133
|
+
serialized = JSON.stringify(errorsRecord);
|
|
134
|
+
} catch (err) {
|
|
135
|
+
DyFM_Log.error('error data is not stringifyable!');
|
|
136
|
+
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (serialized.length > DyNTS_Errors_DataService.MAX_ERROR_RECORD_BYTES) {
|
|
141
|
+
errorsRecord.additionalContent = {
|
|
142
|
+
message: 'error data was too big to save, removed additionalContent',
|
|
143
|
+
};
|
|
144
|
+
errorsRecord.error ??= {};
|
|
145
|
+
errorsRecord.error.additionalContent = {
|
|
146
|
+
message: 'error data was too big to save, removed additionalContent',
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Ujra-meres CSAK a levagas utan — es csak akkor, ha egyaltalan tullogtuk a plafont.
|
|
150
|
+
serialized = JSON.stringify(errorsRecord);
|
|
151
|
+
if (serialized.length > DyNTS_Errors_DataService.MAX_ERROR_RECORD_BYTES) {
|
|
152
|
+
errorsRecord.error.errors = [];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (
|
|
157
|
+
duplicateError &&
|
|
158
|
+
duplicateError?.message === errorsRecord?.message
|
|
159
|
+
) {
|
|
160
|
+
if (!errorsRecord.__created) {
|
|
161
|
+
errorsRecord.__created = new Date();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
this.duplicationCounter = duplicateError.count + 1;
|
|
165
|
+
|
|
166
|
+
const duplicateRecordUpdate: DyNTS_DBUpdate<T_ErrorsRecord> = {
|
|
167
|
+
$inc: {
|
|
168
|
+
count: 1,
|
|
169
|
+
priority: this.getPriorityMultiplierByLevel(errorsRecord?.level),
|
|
170
|
+
},
|
|
171
|
+
} as DyNTS_DBUpdate<T_ErrorsRecord>;
|
|
172
|
+
|
|
173
|
+
// 2026-06-02 fix: a `$addToSet: { versions: { $push: errorVersion } }`
|
|
174
|
+
// formátum a MongoDB-be LITERAL `{$push: '<version>'}`-objektumot ír be
|
|
175
|
+
// a tömbbe, NEM a `$addToSet`-szemantikát alkalmazza. A helyes alak
|
|
176
|
+
// egyszerűen `$addToSet: { versions: errorVersion }` — a `$addToSet`
|
|
177
|
+
// önállóan idempotensen ad hozzá értéket a tömbhöz.
|
|
178
|
+
errorsRecord.versions ??= [];
|
|
179
|
+
if (!errorsRecord.versions.includes(errorVersion)) {
|
|
180
|
+
(duplicateRecordUpdate as any).$addToSet = {
|
|
181
|
+
versions: errorVersion,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 2026-08-07 — a LEGUTOLSO elofordulas kontextusa.
|
|
186
|
+
//
|
|
187
|
+
// MERT BUG: ez az ag eddig CSAK `$inc`-elt, ezert az `additionalContent` AZ ELSO
|
|
188
|
+
// elofordulasnal BEFAGYOTT. Egy hosszu eletu hibanal a diagnosztika orokre a hetekkel-
|
|
189
|
+
// honapokkal ezelotti elso esethez tartozott, es a kesobb bevezetett gazdagabb kontextus
|
|
190
|
+
// (origin / referer / user-agent / header-kulcsok) SOHA nem jutott el a rekordba.
|
|
191
|
+
//
|
|
192
|
+
// ELESBEN MERVE: az overseer `No authentication provided` rekordja 68 587 elofordulasnal
|
|
193
|
+
// tartott, `additionalContent`-je viszont csak egy regi `endpointInfo` volt. A hivot igy
|
|
194
|
+
// KIZAROLAG a szerver-logbol lehetett volna azonositani — az viszont ~13 percenkent forog,
|
|
195
|
+
// egy loketszeru (~1/perc) esemenynel pedig rendszeresen elveti. A hibarekordbol NEM
|
|
196
|
+
// lehetett megmondani, KI hivja.
|
|
197
|
+
//
|
|
198
|
+
// Az `additionalContent` (elso elofordulas) VALTOZATLAN marad — semmi nem vesz el; ez egy
|
|
199
|
+
// KULON mezo a legfrissebb esetnek. Igy a "mikor kezdodott" es a "ki csinalja MOST" kerdes
|
|
200
|
+
// egyszerre valaszolhato meg a rekordbol.
|
|
201
|
+
if (errorsRecord.additionalContent !== undefined) {
|
|
202
|
+
(duplicateRecordUpdate as any).$set = {
|
|
203
|
+
...((duplicateRecordUpdate as any).$set ?? {}),
|
|
204
|
+
lastOccurrenceContent: errorsRecord.additionalContent,
|
|
205
|
+
lastOccurrenceAt: new Date(),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Regression detect — a duplicate-ag-on egy NEW occurrence érkezett.
|
|
210
|
+
// Ha mar volt fix-attempt erre az error-ra, es a jelenlegi version
|
|
211
|
+
// ujabb vagy egyenlo mint a fix-attempt verzioja, akkor a hipotezis
|
|
212
|
+
// nem zarta le a problemat → flag-eljuk a dashboardnak.
|
|
213
|
+
if (
|
|
214
|
+
duplicateError.lastFixedInVersion &&
|
|
215
|
+
DyNTS_Errors_DataService.isVersionAtLeast(errorVersion, duplicateError.lastFixedInVersion)
|
|
216
|
+
) {
|
|
217
|
+
// Auto-reactivation: a recurrence carrying a version >= the last
|
|
218
|
+
// claimed-fix version means the fix did not hold → flip back to an
|
|
219
|
+
// active-again state. `regressed` (not plain `active`) so the next
|
|
220
|
+
// investigator knows a prior hypothesis already failed.
|
|
221
|
+
(duplicateRecordUpdate as any).$set = {
|
|
222
|
+
...((duplicateRecordUpdate as any).$set ?? {}),
|
|
223
|
+
regressedAfterFix: true,
|
|
224
|
+
status: DyFM_ErrorStatus.regressed,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
await this.updateData({
|
|
229
|
+
filterBy: { _id: duplicateError._id } as DyFM_DBFilter<T_ErrorsRecord>,
|
|
230
|
+
update: duplicateRecordUpdate,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// ezt majd ha leülepedett, hogy biztos nem kellenek a deep duplication-ök
|
|
234
|
+
// (a WB-ban kellhettek a user és pc config info-k)
|
|
235
|
+
/* if (!duplicateError.duplications.includes(data.stackTrace)) {
|
|
236
|
+
await this.updateData({
|
|
237
|
+
filterBy: { _id: duplicateError._id } as DyFM_DBFilter<Error_T>,
|
|
238
|
+
update: {
|
|
239
|
+
$push: { duplications: DyFM_Object.clone(data) },
|
|
240
|
+
} as DyNTS_DBUpdate<Error_T>,
|
|
241
|
+
}).catch((pushError) => {
|
|
242
|
+
DyFM_Log.error('pushError:', pushError);
|
|
243
|
+
});
|
|
244
|
+
} */
|
|
245
|
+
|
|
246
|
+
DyFM_Log.error(
|
|
247
|
+
'error found, not saving ("known" error), but increased count, ' +
|
|
248
|
+
'\ncount:', duplicateError.count + 1
|
|
249
|
+
);
|
|
250
|
+
DyFM_Log.error(
|
|
251
|
+
'ErrorMsg:', errorsRecord?.message?.replace(/\n/g, ' \n')
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
if (this.debugLog) DyFM_Log.error('Error:', errorsRecord);
|
|
255
|
+
} else {
|
|
256
|
+
DyFM_Log.log('error not found, saving....');
|
|
257
|
+
DyFM_Log.error(
|
|
258
|
+
'ErrorMsg:', errorsRecord?.message?.replace(/\n/g, ' \n')
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
if (this.debugLog) DyFM_Log.error('Error:', errorsRecord);
|
|
262
|
+
|
|
263
|
+
errorsRecord.priority = this.getPriorityMultiplierByLevel(errorsRecord?.level);
|
|
264
|
+
|
|
265
|
+
// 2026-06-02 fix: count default — a `recordError`-t loose `any`-obj-
|
|
266
|
+
// ektummal hivo path-ok (pl. systemUnreachable / buildFailure hook a
|
|
267
|
+
// host-app-ban) nem inicializaltak a `count: 1`-et a DyFM_Errors class
|
|
268
|
+
// konstruktor-default helyett. A schema-ban sincs default, igy a
|
|
269
|
+
// Mongoose-record-on `undefined` maradt. Most explicit.
|
|
270
|
+
errorsRecord.count ??= 1;
|
|
271
|
+
|
|
272
|
+
errorsRecord.duplications ??= [];
|
|
273
|
+
errorsRecord.duplications.push(DyFM_Object.clone(errorsRecord));
|
|
274
|
+
|
|
275
|
+
errorsRecord.versions ??= [];
|
|
276
|
+
errorsRecord.versions.push(errorVersion);
|
|
277
|
+
|
|
278
|
+
// New error → starts life as `active` (default on the data-model, set
|
|
279
|
+
// explicitly here for loose-`any` record paths that bypass the ctor default).
|
|
280
|
+
errorsRecord.status ??= DyFM_ErrorStatus.active;
|
|
281
|
+
|
|
282
|
+
this.duplicationCounter = 1;
|
|
283
|
+
|
|
284
|
+
// FR-027 (2026-05-24) — Pass `errorsRecord` explicitly. Korabban
|
|
285
|
+
// `saveData()` no-arg fallback `ensureData()`-on keresztul `this.data`-t
|
|
286
|
+
// hasznalt, ami a controller-szinten csak a `{issuer}` constructor
|
|
287
|
+
// wrapper, NEM az actual req.body adat. Eredmenykent minden client-
|
|
288
|
+
// forwarded error EMPTY rekordkent landolt: csak `issuer` mezo,
|
|
289
|
+
// semmilyen message/source/stackTrace/error/level/additionalContent
|
|
290
|
+
// mezo NEM kerult MongoDB-be. (Overseer-en 14454 ilyen empty record
|
|
291
|
+
// halmozodott fel — debug-level details elveszve.)
|
|
292
|
+
await this.saveData(errorsRecord);
|
|
293
|
+
DyFM_Log.warn('error saved');
|
|
294
|
+
}
|
|
295
|
+
} catch (error) {
|
|
296
|
+
DyFM_Error.logSimple('recordError error', error);
|
|
297
|
+
/* if (error instanceof DyFM_Error) {
|
|
298
|
+
error.logSimple('recordError error');
|
|
299
|
+
} else {
|
|
300
|
+
DyFM_Log.error('recordError error:', error);
|
|
301
|
+
} */
|
|
302
|
+
/* throw new DyFM_Error({
|
|
303
|
+
...this.getDefaultErrorSettings(
|
|
304
|
+
'recordError',
|
|
305
|
+
error
|
|
306
|
+
),
|
|
307
|
+
|
|
308
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RE0`,
|
|
309
|
+
}); */
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
protected async createErrorRecord(
|
|
314
|
+
error: DyFM_AnyError | any,
|
|
315
|
+
issuer: string,
|
|
316
|
+
): Promise<T_ErrorsRecord> {
|
|
317
|
+
try {
|
|
318
|
+
if ((error as DyFM_Error)?.flag?.includes(DyFM_errorFlag)) {
|
|
319
|
+
return new DyFM_Errors({
|
|
320
|
+
issuer: this.issuer,
|
|
321
|
+
versions: [ 'SERVER-' + this.version ],
|
|
322
|
+
|
|
323
|
+
source: 'INTERNAL-SERVER-ERROR: ' + (error as DyFM_Error)?.___issuerService,
|
|
324
|
+
|
|
325
|
+
stackTrace: (error as DyFM_Error)?._errorCodes,
|
|
326
|
+
error: (error as DyFM_Error)?.getErrorSimplified?.(),
|
|
327
|
+
level: (error as DyFM_Error)?.level ?? DyFM_ErrorLevel.error,
|
|
328
|
+
|
|
329
|
+
message: (error as DyFM_Error)?._message,
|
|
330
|
+
exceptionObj:
|
|
331
|
+
(error as DyFM_Error)?.errors?.map(
|
|
332
|
+
(e: DyFM_Error): DyFM_Error_Settings | '' => e?.getErrorSimplified?.() ?? ''
|
|
333
|
+
),
|
|
334
|
+
|
|
335
|
+
additionalContent: (error as DyFM_Error)?.additionalContent,
|
|
336
|
+
}) as T_ErrorsRecord;
|
|
337
|
+
} else {
|
|
338
|
+
return new DyFM_Errors({
|
|
339
|
+
issuer: this.issuer,
|
|
340
|
+
versions: [ 'SERVER-' + this.version ],
|
|
341
|
+
|
|
342
|
+
source: 'UNEXPECTED-SERVER-ERROR',
|
|
343
|
+
|
|
344
|
+
stackTrace: (error as Error)?.stack?.split?.('\n'),
|
|
345
|
+
error: error,
|
|
346
|
+
level: DyFM_ErrorLevel.critical,
|
|
347
|
+
|
|
348
|
+
message: (error as Error)?.message,
|
|
349
|
+
exceptionObj: (error as Error)?.stack?.split?.('\n'),
|
|
350
|
+
}) as T_ErrorsRecord;
|
|
351
|
+
}
|
|
352
|
+
} catch (error) {
|
|
353
|
+
throw new DyFM_Error({
|
|
354
|
+
...this.getDefaultErrorSettings('createErrorRecord', error),
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
async handleExternalError(
|
|
360
|
+
error: T_Error,
|
|
361
|
+
issuer: string,
|
|
362
|
+
alwaysRecord?: boolean,
|
|
363
|
+
): Promise<void> {
|
|
364
|
+
try {
|
|
365
|
+
if (this.debugLog) DyFM_Log.log('handleExternalError');
|
|
366
|
+
|
|
367
|
+
if (issuer && !this.issuer) {
|
|
368
|
+
this.issuer = issuer;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const errorsRecord: T_ErrorsRecord = await this.createErrorRecord(error, this.issuer);
|
|
372
|
+
|
|
373
|
+
await this.recordError(errorsRecord, this.issuer, alwaysRecord);
|
|
374
|
+
} catch (error) {
|
|
375
|
+
throw new DyFM_Error({
|
|
376
|
+
...this.getDefaultErrorSettings('handleExternalError', error),
|
|
377
|
+
|
|
378
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-HE0`,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
async handleInternalError(
|
|
384
|
+
error: DyFM_AnyError | any,
|
|
385
|
+
issuer: string,
|
|
386
|
+
alwaysRecord?: boolean,
|
|
387
|
+
): Promise<void> {
|
|
388
|
+
try {
|
|
389
|
+
if (this.debugLog) DyFM_Log.log('handleInternalError');
|
|
390
|
+
|
|
391
|
+
if (issuer && !this.issuer) {
|
|
392
|
+
this.issuer = issuer;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
const errorsRecord: T_ErrorsRecord = await this.createErrorRecord(error, this.issuer);
|
|
396
|
+
|
|
397
|
+
/* if (!(error as FDP_Errors)?.flag?.includes('WB-ERROR-OBJECT')) {
|
|
398
|
+
DyFM_Log.H_error('__ERROR__:', error);
|
|
399
|
+
} */
|
|
400
|
+
|
|
401
|
+
await this.recordError(errorsRecord, this.issuer, alwaysRecord);
|
|
402
|
+
|
|
403
|
+
DyFM_Error.logSimple(`DyNTS_Error_DataService handling InternalError...`, error);
|
|
404
|
+
/* if (
|
|
405
|
+
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
406
|
+
!(error instanceof DyFM_Error)
|
|
407
|
+
) {
|
|
408
|
+
DyFM_Log.H_error(
|
|
409
|
+
`DyNTS_Error_DataService handling InternalError...`,
|
|
410
|
+
`\n ERROR:`, error
|
|
411
|
+
);
|
|
412
|
+
} else {
|
|
413
|
+
error.logSimple(
|
|
414
|
+
`DyNTS_Error_DataService handling InternalError...`
|
|
415
|
+
);
|
|
416
|
+
} */
|
|
417
|
+
} catch (error) {
|
|
418
|
+
DyFM_Error.logSimple('handleInternalError error', error);
|
|
419
|
+
/* if (error instanceof DyFM_Error) {
|
|
420
|
+
error.logSimple('handleInternalError error');
|
|
421
|
+
} else {
|
|
422
|
+
DyFM_Log.error('handleInternalError error:', error);
|
|
423
|
+
} */
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
checkErrorIsStringifyableOrResolvable(error: T_Error, issuer: string): T_Error | 'UNRESOLVABLE' {
|
|
428
|
+
try {
|
|
429
|
+
if (issuer && !this.issuer) {
|
|
430
|
+
this.issuer = issuer;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
JSON.stringify(error);
|
|
434
|
+
} catch (err) {
|
|
435
|
+
DyFM_Error.logSimple('checkErrorIsStringifyableOrResolvable error', err);
|
|
436
|
+
/* if (err instanceof DyFM_Error) {
|
|
437
|
+
err.logSimple('checkErrorIsStringifyableOrResolvable error');
|
|
438
|
+
} else {
|
|
439
|
+
DyFM_Log.error('checkErrorIsStringifyableOrResolvable error:', err);
|
|
440
|
+
} */
|
|
441
|
+
|
|
442
|
+
error = DyFM_Object.resolveCirculation(error);
|
|
443
|
+
|
|
444
|
+
try {
|
|
445
|
+
JSON.stringify(error);
|
|
446
|
+
} catch (err) {
|
|
447
|
+
delete error.additionalContent;
|
|
448
|
+
|
|
449
|
+
try {
|
|
450
|
+
JSON.stringify(error);
|
|
451
|
+
} catch (errr) {
|
|
452
|
+
DyFM_Error.logSimple('checkErrorIsStringifyableOrResolvable error', errr);
|
|
453
|
+
/* if (err instanceof DyFM_Error) {
|
|
454
|
+
err.logSimple('error data is not stringifyable! resolution failed! will not save!');
|
|
455
|
+
} else {
|
|
456
|
+
DyFM_Log.error('error data is not stringifyable! resolution failed! will not save!', err);
|
|
457
|
+
} */
|
|
458
|
+
|
|
459
|
+
return 'UNRESOLVABLE';
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
DyFM_Log.error('error data was too big to save, removed additionalContent');
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return error;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
getPriorityMultiplierByLevel(level: DyFM_ErrorLevel): number {
|
|
470
|
+
switch (level) {
|
|
471
|
+
case DyFM_ErrorLevel.critical:
|
|
472
|
+
case DyFM_ErrorLevel.fatal:
|
|
473
|
+
return 1000;
|
|
474
|
+
|
|
475
|
+
case DyFM_ErrorLevel.error:
|
|
476
|
+
case DyFM_ErrorLevel.serious:
|
|
477
|
+
return 100;
|
|
478
|
+
|
|
479
|
+
case DyFM_ErrorLevel.buildFailure:
|
|
480
|
+
return 50;
|
|
481
|
+
|
|
482
|
+
case DyFM_ErrorLevel.systemUnreachable:
|
|
483
|
+
return 20;
|
|
484
|
+
|
|
485
|
+
case DyFM_ErrorLevel.warning:
|
|
486
|
+
return 10;
|
|
487
|
+
|
|
488
|
+
case DyFM_ErrorLevel.info:
|
|
489
|
+
case DyFM_ErrorLevel.debug:
|
|
490
|
+
case DyFM_ErrorLevel.known:
|
|
491
|
+
return 0.01;
|
|
492
|
+
|
|
493
|
+
case DyFM_ErrorLevel.user:
|
|
494
|
+
default:
|
|
495
|
+
return 0;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
async getErrorsFromDate(
|
|
500
|
+
date: Date,
|
|
501
|
+
issuer: string,
|
|
502
|
+
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
503
|
+
try {
|
|
504
|
+
if (issuer && !this.issuer) {
|
|
505
|
+
this.issuer = issuer;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const errors: T_ErrorsRecord[] = await this.findDataList({ __created: { $gte: date } });
|
|
509
|
+
|
|
510
|
+
return DyFM_Array.paged(errors, 0, 100);
|
|
511
|
+
} catch (error) {
|
|
512
|
+
throw new DyFM_Error({
|
|
513
|
+
...this.getDefaultErrorSettings(
|
|
514
|
+
'getErrorsFromDate',
|
|
515
|
+
error
|
|
516
|
+
),
|
|
517
|
+
|
|
518
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GED0`,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
async deleteError(errorId: string, issuer: string, alwaysDelete?: boolean): Promise<void> {
|
|
524
|
+
try {
|
|
525
|
+
if (issuer && !this.issuer) {
|
|
526
|
+
this.issuer = issuer;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
await this.deleteData(errorId, alwaysDelete);
|
|
530
|
+
} catch (error) {
|
|
531
|
+
throw new DyFM_Error({
|
|
532
|
+
...this.getDefaultErrorSettings('deleteError', error),
|
|
533
|
+
|
|
534
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-DE0`,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
async deleteAllErrors(issuer: string, alwaysDelete?: boolean): Promise<void> {
|
|
540
|
+
try {
|
|
541
|
+
if (issuer && !this.issuer) {
|
|
542
|
+
this.issuer = issuer;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
await this.deleteAllData(alwaysDelete);
|
|
546
|
+
} catch (error) {
|
|
547
|
+
throw new DyFM_Error({
|
|
548
|
+
...this.getDefaultErrorSettings('deleteAllErrors', error),
|
|
549
|
+
|
|
550
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-DAE0`,
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* Record a "we think this is fixed" claim on an existing error.
|
|
557
|
+
*
|
|
558
|
+
* Append-only: every call pushes a new `DyFM_Errors_FixAttempt` to
|
|
559
|
+
* `fixAttempts[]` and updates the `last*` aliases for quick reads.
|
|
560
|
+
* Also clears `regressedAfterFix` so the dashboard treats the error as
|
|
561
|
+
* freshly-claimed-fixed; if a new occurrence arrives with a version
|
|
562
|
+
* `>= version`, `recordError` will flip the flag back on.
|
|
563
|
+
*/
|
|
564
|
+
async recordFixAttempt(
|
|
565
|
+
errorId: string,
|
|
566
|
+
version: string,
|
|
567
|
+
hypothesis: string,
|
|
568
|
+
issuer: string,
|
|
569
|
+
notes?: string
|
|
570
|
+
): Promise<DyFM_Errors_FixAttempt> {
|
|
571
|
+
try {
|
|
572
|
+
if (issuer && !this.issuer) {
|
|
573
|
+
this.issuer = issuer;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const existing = await this.findData({ _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>);
|
|
577
|
+
if (!existing) {
|
|
578
|
+
throw new DyFM_Error({
|
|
579
|
+
...this.getDefaultErrorSettings('recordFixAttempt', new Error(`error not found: ${errorId}`)),
|
|
580
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RFA0`,
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
const attempt: DyFM_Errors_FixAttempt = {
|
|
585
|
+
at: new Date(),
|
|
586
|
+
by: issuer,
|
|
587
|
+
version: version,
|
|
588
|
+
hypothesis: hypothesis,
|
|
589
|
+
...(notes ? { notes: notes } : {}),
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
const nextAttempts: DyFM_Errors_FixAttempt[] = [
|
|
593
|
+
...((existing as any).fixAttempts ?? []),
|
|
594
|
+
attempt,
|
|
595
|
+
];
|
|
596
|
+
|
|
597
|
+
await this.updateData({
|
|
598
|
+
filterBy: { _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>,
|
|
599
|
+
update: {
|
|
600
|
+
$set: {
|
|
601
|
+
fixAttempts: nextAttempts,
|
|
602
|
+
lastFixedAt: attempt.at,
|
|
603
|
+
lastFixedBy: attempt.by,
|
|
604
|
+
lastFixedInVersion: attempt.version,
|
|
605
|
+
lastFixHypothesis: attempt.hypothesis,
|
|
606
|
+
regressedAfterFix: false,
|
|
607
|
+
status: DyFM_ErrorStatus.fixed,
|
|
608
|
+
},
|
|
609
|
+
} as DyNTS_DBUpdate<T_ErrorsRecord>,
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
return attempt;
|
|
613
|
+
} catch (error) {
|
|
614
|
+
throw new DyFM_Error({
|
|
615
|
+
...this.getDefaultErrorSettings('recordFixAttempt', error),
|
|
616
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RFA1`,
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Soft-resolve an error: set `status = fixed` and KEEP the record (unlike
|
|
623
|
+
* `deleteError` / `markErrorDone` which hard-delete). Keeping the record is
|
|
624
|
+
* what enables auto-reactivation — a later recurrence (`recordError`) with a
|
|
625
|
+
* version >= the last claimed-fix version flips it to `regressed`.
|
|
626
|
+
*
|
|
627
|
+
* Optional `notes` are stored on `resolutionNotes`. Clears `regressedAfterFix`.
|
|
628
|
+
* Does NOT append a `fixAttempt` (use `recordFixAttempt` when there is a
|
|
629
|
+
* version + hypothesis to log); this is the lightweight "mark as handled" path.
|
|
630
|
+
*/
|
|
631
|
+
async resolveError(
|
|
632
|
+
errorId: string,
|
|
633
|
+
issuer: string,
|
|
634
|
+
notes?: string
|
|
635
|
+
): Promise<void> {
|
|
636
|
+
try {
|
|
637
|
+
if (issuer && !this.issuer) {
|
|
638
|
+
this.issuer = issuer;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
const existing: T_ErrorsRecord = await this.findData({ _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>);
|
|
642
|
+
if (!existing) {
|
|
643
|
+
throw new DyFM_Error({
|
|
644
|
+
...this.getDefaultErrorSettings('resolveError', new Error(`error not found: ${errorId}`)),
|
|
645
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RES0`,
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
await this.updateData({
|
|
650
|
+
filterBy: { _id: errorId } as DyFM_DBFilter<T_ErrorsRecord>,
|
|
651
|
+
update: {
|
|
652
|
+
$set: {
|
|
653
|
+
status: DyFM_ErrorStatus.fixed,
|
|
654
|
+
regressedAfterFix: false,
|
|
655
|
+
...(notes ? { resolutionNotes: notes } : {}),
|
|
656
|
+
},
|
|
657
|
+
} as DyNTS_DBUpdate<T_ErrorsRecord>,
|
|
658
|
+
});
|
|
659
|
+
} catch (error) {
|
|
660
|
+
throw new DyFM_Error({
|
|
661
|
+
...this.getDefaultErrorSettings('resolveError', error),
|
|
662
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-RES1`,
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Paged errors filtered by lifecycle `status` (active / investigating / fixed
|
|
669
|
+
* / regressed). An empty or `'all'` status returns everything (same semantics
|
|
670
|
+
* as `getErrorsPaged`). Mirrors `getErrorsByCategoryPaged`.
|
|
671
|
+
*/
|
|
672
|
+
async getErrorsByStatusPaged(
|
|
673
|
+
status: string,
|
|
674
|
+
range: DyFM_RelativeDate,
|
|
675
|
+
pageSize: number,
|
|
676
|
+
pageIndex: number,
|
|
677
|
+
issuer: string,
|
|
678
|
+
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
679
|
+
try {
|
|
680
|
+
if (issuer && !this.issuer) {
|
|
681
|
+
this.issuer = issuer;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
685
|
+
const filter: any = { __lastModified: { $gte: fromDate } };
|
|
686
|
+
if (status && status !== 'all') {
|
|
687
|
+
filter.status = status;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
let errors: T_ErrorsRecord[] = await this.findDataList(filter);
|
|
691
|
+
errors = errors.sort((a, b): number => b.priority - a.priority);
|
|
692
|
+
|
|
693
|
+
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
694
|
+
} catch (error) {
|
|
695
|
+
throw new DyFM_Error({
|
|
696
|
+
...this.getDefaultErrorSettings('getErrorsByStatusPaged', error),
|
|
697
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GBSP0`,
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* Loose numeric compare of two version strings of shape `MAJOR.MINOR.PATCH`
|
|
704
|
+
* (`01.15.117`). Pads missing segments with 0. Non-numeric segments are
|
|
705
|
+
* treated as 0 — version strings carrying prefixes like `SERVER-` from
|
|
706
|
+
* `recordError` are caller-stripped before this is invoked.
|
|
707
|
+
*
|
|
708
|
+
* Returns true when `a >= b`.
|
|
709
|
+
*/
|
|
710
|
+
static isVersionAtLeast(a: string, b: string): boolean {
|
|
711
|
+
if (!a || !b) {
|
|
712
|
+
return false;
|
|
713
|
+
}
|
|
714
|
+
const strip = (v: string): string => v.replace(/^[^0-9]+/, '');
|
|
715
|
+
const parse = (v: string): number[] => strip(v).split('.').map(s => Number(s) || 0);
|
|
716
|
+
const aParts = parse(a);
|
|
717
|
+
const bParts = parse(b);
|
|
718
|
+
const len = Math.max(aParts.length, bParts.length);
|
|
719
|
+
for (let i = 0; i < len; i++) {
|
|
720
|
+
const av = aParts[i] ?? 0;
|
|
721
|
+
const bv = bParts[i] ?? 0;
|
|
722
|
+
if (av > bv) {
|
|
723
|
+
return true;
|
|
724
|
+
}
|
|
725
|
+
if (av < bv) {
|
|
726
|
+
return false;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
return true;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
async getErrorsInRange(range: DyFM_RelativeDate, issuer: string): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
733
|
+
try {
|
|
734
|
+
if (issuer && !this.issuer) {
|
|
735
|
+
this.issuer = issuer;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
739
|
+
|
|
740
|
+
let errors: T_ErrorsRecord[] = await this.findDataList({ __lastModified: { $gte: fromDate } });
|
|
741
|
+
errors = errors.sort(
|
|
742
|
+
(a, b): number => b.priority - a.priority
|
|
743
|
+
);
|
|
744
|
+
|
|
745
|
+
return DyFM_Array.paged(errors, 0, 10);
|
|
746
|
+
} catch (error) {
|
|
747
|
+
throw new DyFM_Error({
|
|
748
|
+
...this.getDefaultErrorSettings('getErrorsInRange', error),
|
|
749
|
+
|
|
750
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GIR0`,
|
|
751
|
+
});
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
async getErrorsPaged(
|
|
756
|
+
range: DyFM_RelativeDate,
|
|
757
|
+
pageSize: number,
|
|
758
|
+
pageIndex: number,
|
|
759
|
+
issuer: string,
|
|
760
|
+
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
761
|
+
try {
|
|
762
|
+
if (issuer && !this.issuer) {
|
|
763
|
+
this.issuer = issuer;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
767
|
+
|
|
768
|
+
let errors: T_ErrorsRecord[] = await this.findDataList({ __lastModified: { $gte: fromDate } });
|
|
769
|
+
errors = errors.sort(
|
|
770
|
+
(a, b): number => b.priority - a.priority
|
|
771
|
+
);
|
|
772
|
+
|
|
773
|
+
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
774
|
+
} catch (error) {
|
|
775
|
+
throw new DyFM_Error({
|
|
776
|
+
...this.getDefaultErrorSettings('getErrorsPaged', error),
|
|
777
|
+
|
|
778
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GIP0`,
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Paged-eredmenyek a `category` mezo szerint. A frontend "Errors" page tab-jai
|
|
785
|
+
* (Application / System Unreachable / Build Failure) ezt hivjak. Egy ures-
|
|
786
|
+
* vagy `'all'` kategoria mindent visszaad (azonos szemantikaval mint a
|
|
787
|
+
* `getErrorsPaged`-tel).
|
|
788
|
+
*/
|
|
789
|
+
async getErrorsByCategoryPaged(
|
|
790
|
+
category: string,
|
|
791
|
+
range: DyFM_RelativeDate,
|
|
792
|
+
pageSize: number,
|
|
793
|
+
pageIndex: number,
|
|
794
|
+
issuer: string,
|
|
795
|
+
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
796
|
+
try {
|
|
797
|
+
if (issuer && !this.issuer) {
|
|
798
|
+
this.issuer = issuer;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
802
|
+
const filter: any = { __lastModified: { $gte: fromDate } };
|
|
803
|
+
if (category && category !== 'all') {
|
|
804
|
+
filter.category = category;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
let errors: T_ErrorsRecord[] = await this.findDataList(filter);
|
|
808
|
+
errors = errors.sort((a, b): number => b.priority - a.priority);
|
|
809
|
+
|
|
810
|
+
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
811
|
+
} catch (error) {
|
|
812
|
+
throw new DyFM_Error({
|
|
813
|
+
...this.getDefaultErrorSettings('getErrorsByCategoryPaged', error),
|
|
814
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GBCP0`,
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
async getLastErrors(
|
|
820
|
+
range: DyFM_RelativeDate,
|
|
821
|
+
pageSize: number,
|
|
822
|
+
pageIndex: number,
|
|
823
|
+
issuer: string,
|
|
824
|
+
): Promise<DyFM_Paged<T_ErrorsRecord>> {
|
|
825
|
+
try {
|
|
826
|
+
if (issuer && !this.issuer) {
|
|
827
|
+
this.issuer = issuer;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
const fromDate: Date = DyFM_Time.getDateByRelativeDate(range);
|
|
831
|
+
|
|
832
|
+
let errors: T_ErrorsRecord[] = await this.findDataList({
|
|
833
|
+
__lastModified: { $gte: fromDate }
|
|
834
|
+
});
|
|
835
|
+
errors = errors.sort(
|
|
836
|
+
(a, b): number => +b.__lastModified - +a.__lastModified
|
|
837
|
+
);
|
|
838
|
+
|
|
839
|
+
return DyFM_Array.paged(errors, pageIndex, pageSize);
|
|
840
|
+
} catch (error) {
|
|
841
|
+
throw new DyFM_Error({
|
|
842
|
+
...this.getDefaultErrorSettings('getLastErrors', error),
|
|
843
|
+
|
|
844
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-GLE0`,
|
|
845
|
+
});
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
async searchErrors(
|
|
850
|
+
searchQuery: DyFM_SearchQuery<T_ErrorsRecord>,
|
|
851
|
+
issuer: string,
|
|
852
|
+
): Promise<DyFM_SearchResult<T_ErrorsRecord>> {
|
|
853
|
+
try {
|
|
854
|
+
if (issuer && !this.issuer) {
|
|
855
|
+
this.issuer = issuer;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
return await this.searchData(searchQuery);
|
|
859
|
+
} catch (error) {
|
|
860
|
+
throw new DyFM_Error({
|
|
861
|
+
...this.getDefaultErrorSettings('searchErrors', error),
|
|
862
|
+
|
|
863
|
+
errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-EDS-SE0`,
|
|
864
|
+
});
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
}
|