# Fähigkeiten-Katalog

> Katalog aller Fähigkeiten der dsyr.DataBridge mit ihrer technischen Umsetzung.

---

Site [llms.txt](/llms.txt)

---

## Integration und Datenfluss

| Fähigkeit | Umsetzung |
|---|---|
| Change Detection (Pull) | `GetChanges` → `ProcessJobsForRetrievalInOrderService`; je Connector `RetrieveChangesAsync` (BC/NAV `$filter`, CE `RetrieveEntityChangesRequest`, SQL seitenweises SELECT, OpenAPI Query-String) |
| Orchestrierter Abruf | Durable: `GetChangesOrchestrator`, `GetChangesActivity`, Entity `JobState` |
| Asynchrone Entkopplung | Service Bus mit sieben Queues, `ServiceBusService` mit Batch bis 200 |
| Priorisierte Verarbeitung | `JobPriorityType` → Queue; drei Trigger |
| Reihenfolgensteuerung | `Job.Order` |
| Idempotentes Schreiben | `Connector.Upsert/Delete`; `TargetKey`/`TargetKeys` mit `KeyRank`, erster Treffer gewinnt |
| Aktions-Jobs | `InvokeAction`: Job-`Action` ohne CRUD-Bedeutung ruft einen benannten Endpunkt |
| Job-eigene Pfade | `Source`/`Target` am Job überschreiben `SourceTable`/`TargetTable` des Mappings |
| Eingebettete Kinder | `EmbedChildren` (nur CE als Quelle) |
| Response-Jobs | `Upsert(..., responseMapping, job)` → Response-Nachricht |
| Watermarking | `WatermarkService` + `WatermarkValue`; Typen `date`, `datetime`, `string` |

## Konnektivität

| Fähigkeit | Umsetzung |
|---|---|
| D365 Business Central | `BcConnector : HttpConnectorBase`, OAuth2 / Basic / Managed Identity |
| D365 CE / Dataverse | `CeConnector : ConnectorBase`, `ServiceClient` (Connection-String oder `url` + Managed Identity) |
| D365 NAV | `NavConnector : HttpConnectorBase` |
| REST über OpenAPI | `OpenApiConnector : HttpConnectorBase`, Spec aus `openApiSpecUrl` |
| MSSQL, PostgreSQL, MySQL, Oracle | `SqlConnectorBase<T>`, nur lesend |
| Auth-Varianten HTTP | Basic, OAuth2 Client Credentials mit `tokenUrl`, API-Key, Managed Identity (explizit über `authmethod`) |
| Key-Vault-Bezug | `keyVaultUrl` in der Connection + `DefaultAzureCredential` |
| Schema-Metadaten | `IConnector.GetTableNames`, `GetTableMetadata` für alle Connector-Typen |
| Ad-hoc-HTTP | `ExecuteHttpRequest` (nur GET) |

## Transformation und Mapping

| Fähigkeit | Umsetzung |
|---|---|
| Feld-Mapping | `TableMapping` + `FieldMapping` aus `mappings` |
| Typ-Coercion | `AttributeResolver`-Familien je Systemtyp |
| Metadaten-basierte Resolver-Wahl | `TargetValueMapper` je Connector, statische `FrozenDictionary`-Registry mit Coverage-Tests |
| Default-Werte | Target-Operationen `DefaultValue`, `DefaultValueIfNullOrEmpty`, `DefaultValueMap` |
| Option-/Picklist-Mapping | `OptionMapping`, CE-Resolver für Picklist, MultiSelect, State/Status |
| Lookup-Auflösung | Source-Operation `LookupValue` mit Cache; CE mit Batch-Pre-Caching; `DoNotCreate` |
| CE-Beziehungen | `ActivityParty`, `LinkToRecord` |
| ReadFromMessage | Wert aus der Nachricht übernehmen |
| Virtuelle Felder | `_`-Präfix im `SourceField`, nie gegen Metadaten validiert |
| Erweiterbarkeit | Source-Operation-Handler per Reflection |

## Konfiguration und Steuerung

| Fähigkeit | Umsetzung |
|---|---|
| Konfigurationsgetriebener Betrieb | Table Storage, `StorageService`, `SettingsService` |
| Cron je Job | `Job.Schedule`, `NCrontab.Signed`, sechs Felder |
| Manueller Job-Start | `ExecuteJob` |
| Function-Toggles | `AzureWebJobs.<Name>.Disabled`, Bicep `disabledFunctions` |
| Konfig-Diagnose | `CheckList`, `Validate`, `JobApi`, `MappingApi` |
| KI-Anbindung | MCP-Server mit read-only Tools |
| Self-Repair der Initialisierung | `ResetInitialization` bei Fehlern |
| Quell-Filter | `Job.Filter` mit `{{…}}`-Templating |
| Veraltete Nachrichten überspringen | `SkipOutdatedMessages` → `sbqignored` |

## Resilienz

| Fähigkeit | Umsetzung |
|---|---|
| Backoff-Retry | `DeliveryCount² · 1000 ms` |
| Lock-Renewal | Hintergrund-Task alle 30 s |
| Konflikt-Isolation | `TransitiveException` → `sbqtransitive*` |
| Dead-Lettering | `maxDeliveryCount`, Fehler-Properties an der Nachricht |
| Requeue | `DeadLetterMover` |
| Kommunikationsfehler | `GetChanges` fängt `EndpointNotFoundException`, `CommunicationException` |

## Observability

| Fähigkeit | Umsetzung |
|---|---|
| Gepuffertes Logging | `BufferingLoggerProvider`, Flush pro Invocation |
| Dependency-Sampling | `DependencySamplingProcessor` |
| Custom Metrics | `MetricsService` (`ChangesDetected`, `MessagesProcessed`) |
| Korrelation | `InvocationContext`, `operation_id` |
| Steuerung | `TELEMETRY_CONTROL`, drei Raten-Settings |
| Alerts | DLQ-Stufen, Queue-Länge, Action Group |
| Dashboard | Grafana-Dashboard aus Bicep |
| Version | `GetInfo` |

## Infrastruktur und Auslieferung

| Fähigkeit | Umsetzung |
|---|---|
| Infrastructure as Code | Bicep mit Modulen und `.bicepparam` |
| Marketplace | `createUiDefinition.json`, generierte `mainTemplate.json` |
| Identitätsbasierter Zugriff | `enableManagedIdentity` + Rollen |
| Serverless-Skalierung | Y1 / EP1–EP3, `functionScaleLimit` |
| Run-from-Package | `WEBSITE_RUN_FROM_PACKAGE=1` |
| Container | `Dockerfile`, `compose.yml` |
| Versionierung | `Major.Minor.yyyy.MMdd`, manueller Bump |
| CI/CD | Azure Pipelines unter `cicd/` |
| Lokale Entwicklung | [Podman-Testumgebung](../../lokale-testumgebung/) mit DBs und HTTP-Mocks |

## Qualitätssicherung

| Fähigkeit | Umsetzung |
|---|---|
| Unit-Tests | `DataBridge.Test`, xUnit v3, Moq |
| Coverage | Microsoft Testing Platform Code Coverage |
| Resolver-Vollständigkeit | `*TargetValueMapperCoverageTests` |
| Dokumentation | Hugo/Docsy unter `docs/`, veröffentlicht per Pipeline |
