bc-code-intelligence-mcp 1.3.4 → 1.3.6
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/dist/layers/embedded-layer.d.ts.map +1 -1
- package/dist/layers/embedded-layer.js +40 -0
- package/dist/layers/embedded-layer.js.map +1 -1
- package/dist/services/enhanced-prompt-service.d.ts +1 -12
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -1
- package/dist/services/enhanced-prompt-service.js +27 -38
- package/dist/services/enhanced-prompt-service.js.map +1 -1
- package/dist/services/methodology-service.d.ts.map +1 -1
- package/dist/services/methodology-service.js +15 -1
- package/dist/services/methodology-service.js.map +1 -1
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
- package/embedded-knowledge/AGENTS.md +178 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +32 -0
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
- package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
- package/embedded-knowledge/indexes/domain-catalog.json +106 -0
- package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
- package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
- package/embedded-knowledge/indexes/tags/access-control.json +1 -0
- package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
- package/embedded-knowledge/indexes/tags/actions.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced.json +1 -0
- package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
- package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
- package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
- package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
- package/embedded-knowledge/indexes/tags/analytics.json +1 -0
- package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
- package/embedded-knowledge/indexes/tags/api-design.json +1 -0
- package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
- package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
- package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
- package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
- package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
- package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
- package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/api.json +1 -0
- package/embedded-knowledge/indexes/tags/architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
- package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
- package/embedded-knowledge/indexes/tags/binding.json +1 -0
- package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/branching.json +1 -0
- package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
- package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
- package/embedded-knowledge/indexes/tags/business-process.json +1 -0
- package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
- package/embedded-knowledge/indexes/tags/caching.json +1 -0
- package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/case.json +1 -0
- package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
- package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
- package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
- package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
- package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
- package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
- package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/code-style.json +1 -0
- package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
- package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
- package/embedded-knowledge/indexes/tags/comments.json +1 -0
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
- package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional.json +1 -0
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
- package/embedded-knowledge/indexes/tags/consistency.json +1 -0
- package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
- package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
- package/embedded-knowledge/indexes/tags/correlation.json +1 -0
- package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/data-access.json +1 -0
- package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
- package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
- package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
- package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
- package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
- package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
- package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/database.json +1 -0
- package/embedded-knowledge/indexes/tags/debugging.json +1 -0
- package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
- package/embedded-knowledge/indexes/tags/declaration.json +1 -0
- package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
- package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
- package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
- package/embedded-knowledge/indexes/tags/deployment.json +1 -0
- package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
- package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
- package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
- package/embedded-knowledge/indexes/tags/documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
- package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
- package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
- package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
- package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
- package/embedded-knowledge/indexes/tags/error-text.json +1 -0
- package/embedded-knowledge/indexes/tags/etag.json +1 -0
- package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
- package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
- package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
- package/embedded-knowledge/indexes/tags/events.json +1 -0
- package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/extensions.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
- package/embedded-knowledge/indexes/tags/field-control.json +1 -0
- package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
- package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/field-state.json +1 -0
- package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
- package/embedded-knowledge/indexes/tags/fields.json +1 -0
- package/embedded-knowledge/indexes/tags/filtering.json +1 -0
- package/embedded-knowledge/indexes/tags/filters.json +1 -0
- package/embedded-knowledge/indexes/tags/formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/http-status.json +1 -0
- package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/implementation.json +1 -0
- package/embedded-knowledge/indexes/tags/indentation.json +1 -0
- package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
- package/embedded-knowledge/indexes/tags/indexing.json +1 -0
- package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
- package/embedded-knowledge/indexes/tags/integration.json +1 -0
- package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
- package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
- package/embedded-knowledge/indexes/tags/isolation.json +1 -0
- package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/keywords.json +1 -0
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
- package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
- package/embedded-knowledge/indexes/tags/localization.json +1 -0
- package/embedded-knowledge/indexes/tags/logging.json +1 -0
- package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
- package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/memory.json +1 -0
- package/embedded-knowledge/indexes/tags/message-design.json +1 -0
- package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
- package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
- package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
- package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
- package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
- package/embedded-knowledge/indexes/tags/naming.json +1 -0
- package/embedded-knowledge/indexes/tags/navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series.json +1 -0
- package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
- package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/odata.json +1 -0
- package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
- package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/operators.json +1 -0
- package/embedded-knowledge/indexes/tags/optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/order.json +1 -0
- package/embedded-knowledge/indexes/tags/organization.json +1 -0
- package/embedded-knowledge/indexes/tags/pages.json +1 -0
- package/embedded-knowledge/indexes/tags/parameters.json +1 -0
- package/embedded-knowledge/indexes/tags/patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/performance.json +1 -0
- package/embedded-knowledge/indexes/tags/placement.json +1 -0
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
- package/embedded-knowledge/indexes/tags/posting.json +1 -0
- package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
- package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
- package/embedded-knowledge/indexes/tags/privacy.json +1 -0
- package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
- package/embedded-knowledge/indexes/tags/production.json +1 -0
- package/embedded-knowledge/indexes/tags/productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
- package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
- package/embedded-knowledge/indexes/tags/ranges.json +1 -0
- package/embedded-knowledge/indexes/tags/readability.json +1 -0
- package/embedded-knowledge/indexes/tags/record-access.json +1 -0
- package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
- package/embedded-knowledge/indexes/tags/reference.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime.json +1 -0
- package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
- package/embedded-knowledge/indexes/tags/security.json +1 -0
- package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
- package/embedded-knowledge/indexes/tags/serialization.json +1 -0
- package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
- package/embedded-knowledge/indexes/tags/session.json +1 -0
- package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
- package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
- package/embedded-knowledge/indexes/tags/sift.json +1 -0
- package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
- package/embedded-knowledge/indexes/tags/spacing.json +1 -0
- package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
- package/embedded-knowledge/indexes/tags/standards.json +1 -0
- package/embedded-knowledge/indexes/tags/statements.json +1 -0
- package/embedded-knowledge/indexes/tags/streaming.json +1 -0
- package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
- package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/structure.json +1 -0
- package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
- package/embedded-knowledge/indexes/tags/switch.json +1 -0
- package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
- package/embedded-knowledge/indexes/tags/syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/systemid.json +1 -0
- package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
- package/embedded-knowledge/indexes/tags/table-events.json +1 -0
- package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
- package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
- package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
- package/embedded-knowledge/indexes/tags/template-method.json +1 -0
- package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
- package/embedded-knowledge/indexes/tags/testfield.json +1 -0
- package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
- package/embedded-knowledge/indexes/tags/triggers.json +1 -0
- package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
- package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
- package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
- package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/validation.json +1 -0
- package/embedded-knowledge/indexes/tags/variables.json +1 -0
- package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
- package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
- package/embedded-knowledge/indexes/tags/web-services.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
- package/embedded-knowledge/indexes/tags/workspace.json +1 -0
- package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
- package/embedded-knowledge/indexes/topic-relationships.json +128 -0
- package/embedded-knowledge/methodologies/index.json +81 -0
- package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
- package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
- package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
- package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
- package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
- package/embedded-knowledge/methodologies/phases/performance.md +211 -0
- package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
- package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
- package/embedded-knowledge/methodologies/phases/verification.md +146 -0
- package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
- package/embedded-knowledge/specialists/alex-architect.md +216 -0
- package/embedded-knowledge/specialists/casey-copilot.md +226 -0
- package/embedded-knowledge/specialists/chris-config.md +267 -0
- package/embedded-knowledge/specialists/dean-debug.md +222 -0
- package/embedded-knowledge/specialists/eva-errors.md +235 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
- package/embedded-knowledge/specialists/logan-legacy.md +209 -0
- package/embedded-knowledge/specialists/maya-mentor.md +211 -0
- package/embedded-knowledge/specialists/morgan-market.md +226 -0
- package/embedded-knowledge/specialists/quinn-tester.md +235 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
- package/embedded-knowledge/specialists/sam-coder.md +359 -0
- package/embedded-knowledge/specialists/seth-security.md +235 -0
- package/embedded-knowledge/specialists/taylor-docs.md +257 -0
- package/embedded-knowledge/specialists/uma-ux.md +235 -0
- package/package.json +6 -6
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# AL Facade Pattern for External API Integration - Examples
|
|
2
|
+
|
|
3
|
+
## Basic Facade Structure
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
// Facade Pattern: External API Integration Manager
|
|
7
|
+
// Provides simplified interface for complex external API operations
|
|
8
|
+
// Centralizes authentication, error handling, and business logic
|
|
9
|
+
codeunit 50300 "External API Manager"
|
|
10
|
+
{
|
|
11
|
+
// Public business methods - simplified interface for consumers
|
|
12
|
+
procedure GetCustomerData(CustomerNo: Code[20]; var CustomerData: Record "Customer"): Boolean
|
|
13
|
+
var
|
|
14
|
+
JsonResponse: JsonObject;
|
|
15
|
+
begin
|
|
16
|
+
// Business-focused method signature - hides API complexity
|
|
17
|
+
if not CallCustomerAPI(CustomerNo, JsonResponse) then
|
|
18
|
+
exit(false);
|
|
19
|
+
|
|
20
|
+
exit(ParseCustomerResponse(JsonResponse, CustomerData));
|
|
21
|
+
end;
|
|
22
|
+
|
|
23
|
+
procedure SyncOrderStatus(SalesOrderNo: Code[20]): Boolean
|
|
24
|
+
var
|
|
25
|
+
JsonResponse: JsonObject;
|
|
26
|
+
OrderStatus: Text;
|
|
27
|
+
begin
|
|
28
|
+
// Single method for complex order synchronization process
|
|
29
|
+
if not CallOrderStatusAPI(SalesOrderNo, JsonResponse) then
|
|
30
|
+
exit(false);
|
|
31
|
+
|
|
32
|
+
if not ExtractOrderStatus(JsonResponse, OrderStatus) then
|
|
33
|
+
exit(false);
|
|
34
|
+
|
|
35
|
+
exit(UpdateLocalOrderStatus(SalesOrderNo, OrderStatus));
|
|
36
|
+
end;
|
|
37
|
+
|
|
38
|
+
procedure ValidateProductCatalog(ItemNo: Code[20]; var IsValid: Boolean; var ErrorMessage: Text): Boolean
|
|
39
|
+
var
|
|
40
|
+
JsonResponse: JsonObject;
|
|
41
|
+
begin
|
|
42
|
+
// Centralized validation with business-friendly error messages
|
|
43
|
+
if not CallProductValidationAPI(ItemNo, JsonResponse) then begin
|
|
44
|
+
ErrorMessage := 'Unable to validate product with external system';
|
|
45
|
+
IsValid := false;
|
|
46
|
+
exit(false);
|
|
47
|
+
end;
|
|
48
|
+
|
|
49
|
+
exit(ProcessValidationResponse(JsonResponse, IsValid, ErrorMessage));
|
|
50
|
+
end;
|
|
51
|
+
|
|
52
|
+
// Private implementation methods - hidden complexity
|
|
53
|
+
local procedure CallCustomerAPI(CustomerNo: Code[20]; var JsonResponse: JsonObject): Boolean
|
|
54
|
+
var
|
|
55
|
+
HttpClient: HttpClient;
|
|
56
|
+
RequestMessage: HttpRequestMessage;
|
|
57
|
+
ResponseMessage: HttpResponseMessage;
|
|
58
|
+
ApiUrl: Text;
|
|
59
|
+
begin
|
|
60
|
+
// Handle authentication automatically
|
|
61
|
+
if not EnsureAuthenticated() then
|
|
62
|
+
exit(false);
|
|
63
|
+
|
|
64
|
+
// Construct API endpoint with proper formatting
|
|
65
|
+
ApiUrl := StrSubstNo('%1/customers/%2', GetBaseApiUrl(), CustomerNo);
|
|
66
|
+
|
|
67
|
+
// Configure authenticated request
|
|
68
|
+
if not PrepareAuthenticatedRequest(RequestMessage, 'GET', ApiUrl) then
|
|
69
|
+
exit(false);
|
|
70
|
+
|
|
71
|
+
// Execute with retry logic and error handling
|
|
72
|
+
if not ExecuteApiCall(HttpClient, RequestMessage, ResponseMessage) then
|
|
73
|
+
exit(false);
|
|
74
|
+
|
|
75
|
+
exit(ParseJsonResponse(ResponseMessage, JsonResponse));
|
|
76
|
+
end;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## API Call Abstraction
|
|
81
|
+
|
|
82
|
+
```al
|
|
83
|
+
// Private methods handling technical API details
|
|
84
|
+
codeunit 50301 "API Technical Layer"
|
|
85
|
+
{
|
|
86
|
+
var
|
|
87
|
+
AuthToken: Text;
|
|
88
|
+
BaseApiUrl: Text;
|
|
89
|
+
LastAuthTime: DateTime;
|
|
90
|
+
TokenExpiryMinutes: Integer;
|
|
91
|
+
|
|
92
|
+
// Authentication management - hidden from business logic
|
|
93
|
+
local procedure EnsureAuthenticated(): Boolean
|
|
94
|
+
var
|
|
95
|
+
CurrentTime: DateTime;
|
|
96
|
+
MinutesSinceAuth: Integer;
|
|
97
|
+
begin
|
|
98
|
+
CurrentTime := CurrentDateTime;
|
|
99
|
+
MinutesSinceAuth := (CurrentTime - LastAuthTime) / 60000;
|
|
100
|
+
|
|
101
|
+
// Token refresh logic
|
|
102
|
+
if (AuthToken = '') or (MinutesSinceAuth >= TokenExpiryMinutes) then
|
|
103
|
+
exit(RefreshAuthToken());
|
|
104
|
+
|
|
105
|
+
exit(AuthToken <> '');
|
|
106
|
+
end;
|
|
107
|
+
|
|
108
|
+
local procedure RefreshAuthToken(): Boolean
|
|
109
|
+
var
|
|
110
|
+
HttpClient: HttpClient;
|
|
111
|
+
RequestMessage: HttpRequestMessage;
|
|
112
|
+
ResponseMessage: HttpResponseMessage;
|
|
113
|
+
AuthEndpoint: Text;
|
|
114
|
+
RequestBody: Text;
|
|
115
|
+
Content: HttpContent;
|
|
116
|
+
JsonResponse: JsonObject;
|
|
117
|
+
TokenValue: JsonToken;
|
|
118
|
+
Headers: HttpHeaders;
|
|
119
|
+
begin
|
|
120
|
+
AuthEndpoint := GetBaseApiUrl() + '/auth/token';
|
|
121
|
+
RequestBody := StrSubstNo('{"client_id": "%1", "client_secret": "%2", "grant_type": "client_credentials"}',
|
|
122
|
+
GetClientId(), GetClientSecret());
|
|
123
|
+
|
|
124
|
+
Content.WriteFrom(RequestBody);
|
|
125
|
+
Content.GetHeaders(Headers);
|
|
126
|
+
Headers.Clear();
|
|
127
|
+
Headers.Add('Content-Type', 'application/json');
|
|
128
|
+
|
|
129
|
+
RequestMessage.Method := 'POST';
|
|
130
|
+
RequestMessage.SetRequestUri(AuthEndpoint);
|
|
131
|
+
RequestMessage.Content := Content;
|
|
132
|
+
|
|
133
|
+
if not HttpClient.Send(RequestMessage, ResponseMessage) then begin
|
|
134
|
+
LogError('Authentication request failed');
|
|
135
|
+
exit(false);
|
|
136
|
+
end;
|
|
137
|
+
|
|
138
|
+
if not ResponseMessage.IsSuccessStatusCode() then begin
|
|
139
|
+
LogError(StrSubstNo('Authentication failed with status: %1', ResponseMessage.HttpStatusCode()));
|
|
140
|
+
exit(false);
|
|
141
|
+
end;
|
|
142
|
+
|
|
143
|
+
if not ParseJsonResponse(ResponseMessage, JsonResponse) then
|
|
144
|
+
exit(false);
|
|
145
|
+
|
|
146
|
+
if JsonResponse.Get('access_token', TokenValue) then begin
|
|
147
|
+
AuthToken := TokenValue.AsValue().AsText();
|
|
148
|
+
LastAuthTime := CurrentDateTime;
|
|
149
|
+
TokenExpiryMinutes := 55; // Refresh before 60-minute expiry
|
|
150
|
+
exit(true);
|
|
151
|
+
end;
|
|
152
|
+
|
|
153
|
+
LogError('Access token not found in authentication response');
|
|
154
|
+
exit(false);
|
|
155
|
+
end;
|
|
156
|
+
|
|
157
|
+
// Generic API call execution with retry logic
|
|
158
|
+
local procedure ExecuteApiCall(var HttpClient: HttpClient; RequestMessage: HttpRequestMessage; var ResponseMessage: HttpResponseMessage): Boolean
|
|
159
|
+
var
|
|
160
|
+
RetryCount: Integer;
|
|
161
|
+
MaxRetries: Integer;
|
|
162
|
+
Success: Boolean;
|
|
163
|
+
StatusCode: Integer;
|
|
164
|
+
begin
|
|
165
|
+
MaxRetries := 3;
|
|
166
|
+
RetryCount := 0;
|
|
167
|
+
|
|
168
|
+
repeat
|
|
169
|
+
Success := HttpClient.Send(RequestMessage, ResponseMessage);
|
|
170
|
+
|
|
171
|
+
if Success then begin
|
|
172
|
+
StatusCode := ResponseMessage.HttpStatusCode();
|
|
173
|
+
|
|
174
|
+
// Success status codes
|
|
175
|
+
if (StatusCode >= 200) and (StatusCode < 300) then
|
|
176
|
+
exit(true);
|
|
177
|
+
|
|
178
|
+
// Retryable status codes (temporary failures)
|
|
179
|
+
if (StatusCode = 429) or (StatusCode >= 500) then begin
|
|
180
|
+
RetryCount += 1;
|
|
181
|
+
if RetryCount < MaxRetries then begin
|
|
182
|
+
Sleep(RetryCount * 2000); // Exponential backoff: 2s, 4s, 6s
|
|
183
|
+
continue;
|
|
184
|
+
end;
|
|
185
|
+
end;
|
|
186
|
+
end;
|
|
187
|
+
|
|
188
|
+
RetryCount += 1;
|
|
189
|
+
if RetryCount < MaxRetries then
|
|
190
|
+
Sleep(RetryCount * 2000);
|
|
191
|
+
|
|
192
|
+
until RetryCount >= MaxRetries;
|
|
193
|
+
|
|
194
|
+
LogError(StrSubstNo('API call failed after %1 retries', MaxRetries));
|
|
195
|
+
exit(false);
|
|
196
|
+
end;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Error Handling and Authentication
|
|
201
|
+
|
|
202
|
+
```al
|
|
203
|
+
// Centralized error handling with business-friendly messages
|
|
204
|
+
codeunit 50302 "API Error Handler"
|
|
205
|
+
{
|
|
206
|
+
// Business-friendly error handling
|
|
207
|
+
procedure HandleApiError(var ErrorMessage: Text; HttpStatusCode: Integer; ApiResponse: Text): Boolean
|
|
208
|
+
var
|
|
209
|
+
JsonResponse: JsonObject;
|
|
210
|
+
ErrorToken: JsonToken;
|
|
211
|
+
ErrorCode: Text;
|
|
212
|
+
DetailedMessage: Text;
|
|
213
|
+
begin
|
|
214
|
+
// Parse error response if JSON
|
|
215
|
+
if JsonResponse.ReadFrom(ApiResponse) then begin
|
|
216
|
+
if JsonResponse.Get('error_code', ErrorToken) then
|
|
217
|
+
ErrorCode := ErrorToken.AsValue().AsText();
|
|
218
|
+
|
|
219
|
+
if JsonResponse.Get('message', ErrorToken) then
|
|
220
|
+
DetailedMessage := ErrorToken.AsValue().AsText();
|
|
221
|
+
end;
|
|
222
|
+
|
|
223
|
+
// Convert technical errors to business messages
|
|
224
|
+
case HttpStatusCode of
|
|
225
|
+
400:
|
|
226
|
+
ErrorMessage := GetBusinessErrorMessage('INVALID_REQUEST', ErrorCode, DetailedMessage);
|
|
227
|
+
401:
|
|
228
|
+
ErrorMessage := 'Authentication failed. Please check system configuration.';
|
|
229
|
+
403:
|
|
230
|
+
ErrorMessage := 'Access denied. Insufficient permissions for this operation.';
|
|
231
|
+
404:
|
|
232
|
+
ErrorMessage := 'The requested resource was not found in the external system.';
|
|
233
|
+
409:
|
|
234
|
+
ErrorMessage := 'Data conflict detected. The record may have been modified by another user.';
|
|
235
|
+
422:
|
|
236
|
+
ErrorMessage := GetBusinessErrorMessage('VALIDATION_FAILED', ErrorCode, DetailedMessage);
|
|
237
|
+
429:
|
|
238
|
+
ErrorMessage := 'External system is busy. Please try again in a few minutes.';
|
|
239
|
+
500, 502, 503:
|
|
240
|
+
ErrorMessage := 'External system is temporarily unavailable. Please try again later.';
|
|
241
|
+
else
|
|
242
|
+
ErrorMessage := StrSubstNo('Unexpected error occurred (Code: %1). Please contact your administrator.', HttpStatusCode);
|
|
243
|
+
end;
|
|
244
|
+
|
|
245
|
+
// Log technical details for troubleshooting (not shown to user)
|
|
246
|
+
LogTechnicalError(HttpStatusCode, ApiResponse);
|
|
247
|
+
|
|
248
|
+
exit(false); // Always return false for error conditions
|
|
249
|
+
end;
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Anti-Pattern: Direct API Calls
|
|
254
|
+
|
|
255
|
+
```al
|
|
256
|
+
// ANTI-PATTERN: What NOT to do - Scattered API calls throughout codebase
|
|
257
|
+
// Problems: Code duplication, inconsistent error handling, tight coupling
|
|
258
|
+
|
|
259
|
+
// BAD EXAMPLE: Direct API calls in business logic
|
|
260
|
+
codeunit 50400 "Sales Order Processing" // DON'T DO THIS
|
|
261
|
+
{
|
|
262
|
+
procedure ProcessSalesOrder(var SalesHeader: Record "Sales Header")
|
|
263
|
+
var
|
|
264
|
+
HttpClient: HttpClient;
|
|
265
|
+
RequestMessage: HttpRequestMessage;
|
|
266
|
+
ResponseMessage: HttpResponseMessage;
|
|
267
|
+
CustomerNo: Code[20];
|
|
268
|
+
AuthToken: Text;
|
|
269
|
+
ApiUrl: Text;
|
|
270
|
+
begin
|
|
271
|
+
CustomerNo := SalesHeader."Sell-to Customer No.";
|
|
272
|
+
|
|
273
|
+
// PROBLEM: Authentication logic scattered everywhere
|
|
274
|
+
AuthToken := GetAuthTokenSomehow(); // Duplicated in multiple places
|
|
275
|
+
|
|
276
|
+
// PROBLEM: URL construction repeated in many methods
|
|
277
|
+
ApiUrl := 'https://api.external.com/customers/' + CustomerNo;
|
|
278
|
+
|
|
279
|
+
RequestMessage.Method := 'GET';
|
|
280
|
+
RequestMessage.SetRequestUri(ApiUrl);
|
|
281
|
+
|
|
282
|
+
// PROBLEM: No standardized error handling
|
|
283
|
+
if not HttpClient.Send(RequestMessage, ResponseMessage) then
|
|
284
|
+
Error('Something went wrong'); // Unhelpful error message
|
|
285
|
+
|
|
286
|
+
// Business logic mixed with technical concerns
|
|
287
|
+
ProcessCustomerData(ResponseMessage);
|
|
288
|
+
end;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/*
|
|
292
|
+
PROBLEMS WITH ANTI-PATTERN APPROACH:
|
|
293
|
+
|
|
294
|
+
1. Code Duplication:
|
|
295
|
+
- Authentication logic repeated in every method
|
|
296
|
+
- URL construction patterns scattered throughout
|
|
297
|
+
- Response parsing duplicated everywhere
|
|
298
|
+
|
|
299
|
+
2. Maintenance Nightmare:
|
|
300
|
+
- Changes to API authentication require updates in multiple places
|
|
301
|
+
- URL changes affect many different files
|
|
302
|
+
- Error handling improvements need to be replicated everywhere
|
|
303
|
+
|
|
304
|
+
3. Poor Separation of Concerns:
|
|
305
|
+
- Business logic mixed with technical HTTP details
|
|
306
|
+
- UI components directly calling APIs
|
|
307
|
+
- Reports tightly coupled to external systems
|
|
308
|
+
|
|
309
|
+
4. Testing Difficulties:
|
|
310
|
+
- Cannot easily mock external API calls
|
|
311
|
+
- Business logic testing requires network setup
|
|
312
|
+
- Integration tests become complex and brittle
|
|
313
|
+
|
|
314
|
+
CORRECT APPROACH: Use the Facade Pattern shown above
|
|
315
|
+
- Centralized API management
|
|
316
|
+
- Consistent error handling
|
|
317
|
+
- Separated concerns
|
|
318
|
+
- Testable components
|
|
319
|
+
*/
|
|
320
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Subscriber Codeunit Size Optimization - AL Code Samples
|
|
2
|
+
|
|
3
|
+
## Anti-Pattern: Monolithic Subscriber
|
|
4
|
+
|
|
5
|
+
```al
|
|
6
|
+
codeunit 50500 "Monolithic Event Subscriber"
|
|
7
|
+
{
|
|
8
|
+
// ANTI-PATTERN: All subscribers in one large codeunit
|
|
9
|
+
|
|
10
|
+
[EventSubscriber(ObjectType::Table, Database::Customer, 'OnBeforeInsertEvent', '', false, false)]
|
|
11
|
+
local procedure OnBeforeCustomerInsert(var Rec: Record Customer; RunTrigger: Boolean)
|
|
12
|
+
begin
|
|
13
|
+
ValidateCustomerData(Rec);
|
|
14
|
+
CheckCustomerCreditLimit(Rec);
|
|
15
|
+
UpdateCustomerStatistics(Rec);
|
|
16
|
+
LogCustomerCreation(Rec);
|
|
17
|
+
// Many more operations creating a massive procedure
|
|
18
|
+
end;
|
|
19
|
+
|
|
20
|
+
[EventSubscriber(ObjectType::Table, Database::Item, 'OnBeforeInsertEvent', '', false, false)]
|
|
21
|
+
local procedure OnBeforeItemInsert(var Rec: Record Item; RunTrigger: Boolean)
|
|
22
|
+
begin
|
|
23
|
+
ValidateItemData(Rec);
|
|
24
|
+
SetupItemDefaults(Rec);
|
|
25
|
+
CheckItemInventory(Rec);
|
|
26
|
+
// Many more operations
|
|
27
|
+
end;
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Optimized Pattern: Focused Subscribers
|
|
32
|
+
|
|
33
|
+
```al
|
|
34
|
+
codeunit 50501 "Customer Event Subscriber"
|
|
35
|
+
{
|
|
36
|
+
// Single responsibility: Handle only customer-related events
|
|
37
|
+
|
|
38
|
+
[EventSubscriber(ObjectType::Table, Database::Customer, 'OnBeforeInsertEvent', '', false, false)]
|
|
39
|
+
local procedure OnBeforeCustomerInsert(var Rec: Record Customer; RunTrigger: Boolean)
|
|
40
|
+
begin
|
|
41
|
+
if not RunTrigger then exit;
|
|
42
|
+
|
|
43
|
+
CustomerValidationHandler.ValidateNewCustomer(Rec);
|
|
44
|
+
CustomerSetupHandler.ApplyDefaultSettings(Rec);
|
|
45
|
+
CustomerNotificationHandler.NotifyNewCustomer(Rec);
|
|
46
|
+
end;
|
|
47
|
+
|
|
48
|
+
var
|
|
49
|
+
CustomerValidationHandler: Codeunit "Customer Validation Handler";
|
|
50
|
+
CustomerSetupHandler: Codeunit "Customer Setup Handler";
|
|
51
|
+
CustomerNotificationHandler: Codeunit "Customer Notification Handler";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
codeunit 50502 "Item Event Subscriber"
|
|
55
|
+
{
|
|
56
|
+
// Single responsibility: Handle only item-related events
|
|
57
|
+
|
|
58
|
+
[EventSubscriber(ObjectType::Table, Database::Item, 'OnBeforeInsertEvent', '', false, false)]
|
|
59
|
+
local procedure OnBeforeItemInsert(var Rec: Record Item; RunTrigger: Boolean)
|
|
60
|
+
begin
|
|
61
|
+
if not RunTrigger then exit;
|
|
62
|
+
|
|
63
|
+
ItemValidationHandler.ValidateNewItem(Rec);
|
|
64
|
+
ItemSetupHandler.ApplyDefaultSettings(Rec);
|
|
65
|
+
end;
|
|
66
|
+
|
|
67
|
+
var
|
|
68
|
+
ItemValidationHandler: Codeunit "Item Validation Handler";
|
|
69
|
+
ItemSetupHandler: Codeunit "Item Setup Handler";
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Specialized Handler Pattern
|
|
74
|
+
|
|
75
|
+
```al
|
|
76
|
+
codeunit 50510 "Customer Validation Handler"
|
|
77
|
+
{
|
|
78
|
+
// Focused on customer validation logic only
|
|
79
|
+
|
|
80
|
+
procedure ValidateNewCustomer(var Customer: Record Customer)
|
|
81
|
+
begin
|
|
82
|
+
ValidateRequiredFields(Customer);
|
|
83
|
+
ValidateBusinessRules(Customer);
|
|
84
|
+
ValidateDataIntegrity(Customer);
|
|
85
|
+
end;
|
|
86
|
+
|
|
87
|
+
local procedure ValidateRequiredFields(var Customer: Record Customer)
|
|
88
|
+
begin
|
|
89
|
+
if Customer.Name = '' then
|
|
90
|
+
Error('Customer name is required');
|
|
91
|
+
|
|
92
|
+
if Customer."Country/Region Code" = '' then
|
|
93
|
+
Error('Country/Region Code is required');
|
|
94
|
+
end;
|
|
95
|
+
|
|
96
|
+
local procedure ValidateBusinessRules(var Customer: Record Customer)
|
|
97
|
+
begin
|
|
98
|
+
if (Customer."Credit Limit (LCY)" > 100000) and (Customer."Payment Terms Code" = '') then
|
|
99
|
+
Error('Payment terms required for customers with credit limit over 100,000');
|
|
100
|
+
end;
|
|
101
|
+
}
|
|
102
|
+
```
|