Bağlantı Haritası
Kim kiminle nasıl konuşuyor: DI kayıtları, uçtan-uca çağrı zincirleri, api↔batch köprüleri, FinevoConnect YÖS↔api-hhs (cross-project) ve katman kuralları.
Bağımlılık enjeksiyonu (özet)
FinevoConnect YÖS (Program + DI)
- AddApplication → servisler (scoped), ILiveRefreshCoordinator, ISyncIntentService, IErrorLocalizer (singleton)
- AddInfrastructure → AppDbContext + repository'ler, IUnitOfWork, güvenlik (JWT, DataProtection),
ILiveQueryClient(named HttpClient "batch-live-query") - JWT auth (HS256), Hangfire SqlServer (storage), Serilog HTTP sink, OpenTelemetry
batch (Program + DI)
- AddBatchApplication → 19 ISyncIntentHandler (keyed), IConnectionSyncService, ILiveQueryService, IConsentActivationService
- AddBatchInfrastructure → 8 Hangfire job, ÖHVPS slice client'lar + factory, DelegatingHandler zinciri (Auth→JWS→Log), named HttpClient "ohvps" (mTLS) + "jwks"
- Paylaşımlı: IClock, IIdGenerator, ITokenProtector (aynı key-ring), IFeatureFlags
Çağrı zinciri: Rıza (yazma → outbox)
Kullanıcının "beni bu bankaya/kuruma bağla" demesinden ilk verilerin gelmesine kadar isteğin geçtiği duraklar:
Çağrı zinciri: E canlı-okuma (senkron, outbox'suz)
Kullanıcı ?fresh=true ile "bana o anki hâli göster" dediğinde niyet kutusuna uğranmaz; API batch'i doğrudan çağırır:
?fresh=true yolları bu tek noktadan geçer.Çağrı zinciri: Ödeme
Ödeme, rıza akışının aynısını izler — fark: her ödeme kendi rızasını kendi taşır ve istekte Idempotency-Key zorunludur:
api ↔ batch köprüleri
| Köprü | Yazan → Okuyan | Ne |
|---|---|---|
SyncIntents (outbox) | FinevoConnect YÖS (tx-içi) → batch SyncIntentConsumerJob | Yazma banka/kurum işleri (rıza/ödeme). FIFO, at-least-once, OutboxConsumed idempotency. |
HhsQueryQuota | batch (atomik ExecuteUpdate) → batch | Bağlantı+kind başına kota sayacı. Yalnız Autonomous(H) sayar; E/O muaf. |
DataProtection key-ring | batch (şifreler) → FinevoConnect YÖS (çözer) | Paylaşımlı volume + SetApplicationName('yos-shared'). Token/PII at-rest. İsim uyuşmazlığı → CryptographicException. |
/internal/live-query RPC | FinevoConnect YÖS (senkron POST) → batch LiveQueryController | E canlı-okuma. X-Internal-Secret fixed-time. Niyet yok, anlık. |
Paylaşımlı MSSQL | iki app → iki app | Tek DB. Migration sahibi FinevoConnect YÖS (boot'ta uygular); batch bekler. Hangfire tabloları da burada. |
Cross-project: FinevoConnect YÖS ↔ api-hhs (banka/kurum)
Giden (yalnız batch)
mTLS istemci sertifikası + PS256 detached JWS ile: rıza, token, hesap/bakiye/işlem/kart, ödeme, olay-abonelik. host.docker.internal:8443 (ob-shared, cert-SAN geçerli).
Gelen
GKD callback (FinevoConnect YÖS alır: /api/v1/*/callback) + olay-bildirim (batch: /api/v1/ohvps/events, JWS-verify). JWKS ("jwks" client) yanıt imzası doğrulama.
Katman kuralları (NetArchTest zorlar)
Not: E canlı-okumada FinevoConnect YÖS batch'i çağırır (iç HTTP) — bu Ohvps* değildir, kural korunur. Sertifikalar yalnız batch'te.
Config/env → bileşen
| Env | Besler |
|---|---|
JWT_SIGNING_KEY | api JWT auth (HS256) + JwtTokenGenerator |
OHVPS_YOS_KOD | batch JWS issuer + katılımcı bloğu (yosKod) |
OHVPS_CALLBACK_BASE_URL | GKD callback URL'leri (api alır) |
OHVPS_CONSUMER_{CONSENT,PAYMENT}_{SUCCESS,ERROR}_URL | GKD callback 302 dönüş adresleri — YALNIZ fallback: create isteği consumerSuccessUrl/consumerErrorUrl vermediyse kullanılır ({kind} şablonu yalnız ödeme fallback'inde) |
OHVPS_DEFAULT_HHS_BASE_URL | batch HHS istemci base. (JWKS için düz env yoktur; her banka/kurum için DB'deki Bank.JwksUrl kayıt değeri kullanılır.) |
BATCH_LIVE_QUERY_BASE_URL | api → batch iç RPC adresi (http://batch-api:8080) |
BATCH_LIVE_QUERY_SECRET | iki app: X-Internal-Secret (fixed-time compare) |
DataProtection:VolumePath | iki app: paylaşımlı anahtar halkası volume |
Ohvps__Cert__* (RootCa/Client crt+key) | yalnız batch: mTLS istemci sertifikası |
MSSQL_TRUST_CERT | DB TLS: prod=false (doğrular), dev=true (self-signed) |