Skip to content

feat(tenants): host'tan kiracı kullanıcılarını görüntüleme + bürünme UI köprüsü - #36

Merged
caferaydin merged 1 commit into
mainfrom
feat/host-tenant-user-impersonation-ui
Aug 10, 2026
Merged

feat(tenants): host'tan kiracı kullanıcılarını görüntüleme + bürünme UI köprüsü#36
caferaydin merged 1 commit into
mainfrom
feat/host-tenant-user-impersonation-ui

Conversation

@caferaydin

Copy link
Copy Markdown
Member

Ne

Host operatörünün bir kiracının kullanıcılarını görüp içlerinden birine bürünmesini sağlayan UI köprüsü. Backend cross-tenant impersonation'ı (targetTenantId) zaten destekliyordu; eksik olan hedef kullanıcıyı seçecek yüzeydi.

Nasıl

  • Backend: GET /api/users?tenantId= — yalnız host bağlamı. Kiracı çağıran hangi id'yi gönderirse göndersin (kendi id'si dahil) 403: boş sayfa "kullanıcı yok" diye okunurdu; kendi id'sine 200 verilseydi durum kodu yabancı id'yi ele verirdi. UserService.listForTenant aynı iki aşamalı sayfalamayı (Q-03) kullanır; aspect'in giriş anında kurduğu hostFilter explicit tenantId predicate'iyle AND'lenip boş sayfa ürettiği için sorgu bloğunda askıya alınıp finally'de geri kurulur (TenantAdminBootstrapper deseni; RLS tabanı yerinde).
  • Frontend: Kiracılar listesine users.read korumalı "Kullanıcıları gör" aksiyonu + TenantUsersDialog (arama, sayfalama, aktiflik rozeti). Satır başına users.impersonate korumalı "Bürün" → auth.impersonate(userId, tenantId); pasif kullanıcıda ve bürünme oturumu içindeyken (cascade aynası) devre dışı. en/tr tenants.users.*; schema.d.ts yeniden üretildi.

Kanıt

  • HostTenantUserListingIT 3 IT yeşil — mutlu yol İLK koşumda hostFilter yüzünden kırmızıydı (negatif kanıt: test gerçeği ölçüyor); kiracı çağırana çift 403; parametresiz host listelemenin host satırlarında kaldığı pinli.
  • Backend 234 unit yeşil (clean verify).
  • Frontend npm run build + 194 test yeşil (5 yeni: cross-tenant sorgu dizesi, impersonate(42, 7), pasif/cascade disable, izinsizde düğme yokluğu).
  • Dikey dilim beş sütun: backend ✓ frontend ✓ izin+i18n ✓ test (mutlu+negatif) ✓ risk kaydı: yeni risk yok, CHANGELOG güncel.

🤖 Generated with Claude Code

…UI köprüsü

Backend'in zaten desteklediği cross-tenant impersonation'a eksik UI yüzeyi:

- GET /api/users?tenantId= (yalnız host bağlamı; kiracı çağırana koşulsuz 403
  — kendi id'si dahil, durum kodu yabancı id'yi ele vermesin diye)
- UserService.listForTenant: iki aşamalı sayfalama (Q-03); aspect'in kurduğu
  hostFilter explicit predicate ile AND'lenip boş sayfa ürettiğinden sorgu
  bloğunda askıya alınır, finally geri kurar (TenantAdminBootstrapper deseni)
- Kiracılar listesi: users.read korumalı "Kullanıcıları gör" + TenantUsersDialog;
  satır başına users.impersonate korumalı "Bürün" -> impersonate(userId, tenantId);
  pasif kullanıcıda ve cascade'de devre dışı; en/tr tenants.users.*
- schema.d.ts yeniden üretildi (tenantId parametresi)

Kanıt: HostTenantUserListingIT 3 IT (mutlu yol ilk koşumda filtre yüzünden
kırmızıydı — test gerçeği ölçüyor; kiracıya çift 403 negatifi; parametresiz
host listeleme pinli) yeşil; backend 234 unit yeşil; frontend build + 194 test
yeşil (5 yeni: sorgu dizesi, impersonate(42,7), disable kuralları, izin negatifi).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@caferaydin
caferaydin merged commit b5431dd into main Aug 10, 2026
6 checks passed
@caferaydin
caferaydin deleted the feat/host-tenant-user-impersonation-ui branch August 10, 2026 16:00
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