Skip to content

fix(multi-tenancy): stamp tenant id on bulk AddRange writes - #28

Open
ahmet-cetinkaya wants to merge 1 commit into
mainfrom
fix/multitenancy-addrange-stamping
Open

fix(multi-tenancy): stamp tenant id on bulk AddRange writes#28
ahmet-cetinkaya wants to merge 1 commit into
mainfrom
fix/multitenancy-addrange-stamping

Conversation

@ahmet-cetinkaya

@ahmet-cetinkaya ahmet-cetinkaya commented Jul 31, 2026

Copy link
Copy Markdown

🚀 Context

MultiTenancyInterceptor tenant id damgasını yalnız tekil Add işlemlerinde basıyordu. Bir AddRangeOperation, OperationType.AddRange + CurrentDocument: null sunduğu için interceptor toplu yazımları atlıyor; tenant belgeleri toplu AddRange yoluyla default (boş) tenant id ile veritabanına gidiyordu — bu yolda tenant isolation sessizce bozuluyordu.

Gerçek consumer etkisi: InsurUp/core'da CustomerRelationship (ITenantEntity) repository.AddRange ile yazılıyordu, yani müşteri ilişkileri tenant damgası olmadan kaydediliyordu.

⚙️ Implementation Details

AddRangeOperation.CurrentDocuments artık unwrap edilip her belge, tekil Add ile aynı null || default kuralıyla damgalanıyor. Tekil Add yolu ve onun OperationType.Add guard'ı değişmedi; dolayısıyla:

  • Update / Delete / Replace hâlâ atlanıyor (tenant'ın değişmemesi gereken yazımlarda yeniden damgalanmıyor).
  • Açıkça set edilmiş, default olmayan tenant id overwrite edilmiyor — cross-tenant bir yazım üst katmandaki yetkilendirmede görünmeye devam ediyor.

Davranış değişimi: toplu yazımlar artık tekil yazımların zaten aldığı damgayı alıyor (eskiden hiç almıyordu). Yalnızca id'si set edilmemiş belgeler etkilenir; tenant'ı zaten veren consumer'lar etkilenmez.

🧪 Validation

Bu repoda test projesi yok; doğrulama consumer-side:

  • InsurUp/core TenantIsolationTests — gerçek MongoDB replica set üzerinde red→green koşusu, toplu AddRange belgelerinin AgentId = 00000000… (default) değerinden acting tenant id'sine geçtiğini kanıtlar. Core şu an bu değişikliğin consumer-side muadili olan geçici TenantEntityInterceptor workaround'unu taşıyor; bu fix yayınlanıp consume edilince silinecek.
  • dotnet build -c Release -t:Rebuild /warnaserror → 0 warning, 0 error (net8.0, net9.0).

Versioning: csproj'da <Version> yok; release'ler tag-driven (son v0.5.5). Merge sonrası bir maintainer tag'i (örn. v0.5.6) fix'i yayınlar.

🔗 Related

  • Consumer PR: https://github.com/InsurUp/core/pull/1251 — geçici TenantEntityInterceptor workaround'unu içeriyor ve bu upstream takibini belgeliyor; workaround, bu fix yayınlanıp core'daki MongoFlow package reference yükseltilince kaldırılacak.

MultiTenancyInterceptor only handled single Add operations. An AddRangeOperation
reports OperationType.AddRange with a null CurrentDocument, so bulk writes were
skipped and tenant entities reached the database with a default (empty) tenant id.

Unwrap AddRangeOperation.CurrentDocuments and stamp every document with the same
null/default rule used for single Adds. The single-Add path and its
OperationType.Add guard are unchanged, so Update/Delete/Replace are still skipped
and an explicitly set tenant id is never overwritten.
@ahmet-cetinkaya
ahmet-cetinkaya marked this pull request as draft August 2, 2026 18:42
@ahmet-cetinkaya
ahmet-cetinkaya marked this pull request as ready for review August 12, 2026 12:50
@ahmet-cetinkaya
ahmet-cetinkaya marked this pull request as draft August 12, 2026 12:50
@ahmet-cetinkaya
ahmet-cetinkaya marked this pull request as ready for review August 12, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant