Ana içeriğe atla

Organization User

Organization User, bir kullanıcının belirli bir organizasyondaki üyeliğini temsil eder. Bu kayıt org düzeyi rol (RBAC), üyelik durumu ve site atamalarını içerir.
// apps/azalt/src/server/db/types/organization.ts (özet)
interface OrganizationUser {
  id: string;
  organizationId: string;
  userId: string;
  role: "VIEWER" | "COLLECTOR" | "APPROVER" | "MANAGER" | "OWNER";
  status: "ACTIVE" | "INVITED" | "INACTIVE";
  invitationToken?: string | null;
  invitationExpiresAt?: Date | null;
  tags?: string[] | null;
  createdAt: Date;
  updatedAt: Date;
}

Kısaca

  • (organizationId, userId) çifti başına tek üyelik
  • Rol (RBAC) yetkileri belirler; site atamaları kapsamı sınırlar
  • Durum yaşam döngüsü: INVITED → ACTIVE → INACTIVE
  • tags alanı hafif sınıflandırma/filtreleme için

Roller (RBAC)

  • Viewer: atandığı site(ler)i yalnızca görüntüler
  • Collector: atandığı site(ler)de veri girip düzenleyebilir
  • Approver: atandığı site(ler)de gönderimleri onaylayabilir
  • Manager: atandığı site kapsamı içinde kullanıcı/site/form yönetimi
  • Owner: organizasyonun tam yönetimi

Üyelik Durumu

  • INVITED (varsayılan): davet oluşturuldu; kabul edilene kadar sınırlı
  • ACTIVE: aktif üyelik; rol ve kapsam geçerli
  • INACTIVE: devre dışı; erişim yok
Davetler e-posta ile ve süre sınırlıdır. Kabul ile üyelik ACTIVE olur; kullanıcıda currentOrganizationId boşsa bu org atanabilir.

Kısıtlar ve Bütünlük

  • Her organizasyon için tek üyelik: (organizationId, userId)
  • Üyelik silindiğinde site atamaları (OrganizationUserSite) FK ile birlikte temizlenir (cascade)
  • Yetki kuralları gereği sahiplik/rol değişikliklerinde korumalar uygulanır

Site Erişimi (ABAC)

Site erişimi, Organization User Site bağlantıları ile atanır. Etkin erişim, doğrudan atanan site(ler)in tüm alt site(ler)ini de kapsar (rekürsif sorgu ile). Kök site atanırsa tüm organizasyona erişim verilmiş olur.

Sık Yapılan İşlemler

  • Organizasyon kullanıcılarını listeleme (çağıranın site erişimiyle filtrelenir)
  • Rol ve site atamaları ile kullanıcı davet etme
  • Bir kullanıcının rolünü ve/veya site atamalarını güncelleme
  • Çoklu kullanıcı için site atamalarını toplu güncelleme (yerine koy/ekle/kaldır)
// tRPC (apps/azalt/src/server/api/routers/organization)
organizations.listUsers(): Array<{
  id, name, email, phone, image, status, role,
  createdAt, ownerId, assignedSites: { id, name }[]
}>

organizations.inviteUser({ email, role, assignedSiteIds })
organizations.updateUserRole({ userId, role, assignedSiteIds? })
organizations.updateUserSites({ userId, assignedSiteIds })
organizations.bulkUpdateUserRoles({ userIds, role })
organizations.bulkUpdateUserSites({ userIds, siteIds, operation: "replace" | "add" | "remove" })

Güvenlik ve Filtreleme

  • Okumalar kısıtlıdır: viewer/collector, kendi erişebildiği site ağacındaki kullanıcıları görür; manager/owner tüm üyeleri görür.
  • Yazma işlemleri yalnızca manager/owner tarafından ve kendi erişim kapsamındaki site’lar için yapılabilir.
  • Row Level Security (RLS) ve yardımcı korumalar bağlam güvenliğini sağlar.

İpuçları ve Köşe Durumlar

  • Site ataması olmayan kullanıcılar listelerde görünebilir (manager/owner için); etkin erişimleri boştur.
  • Kök siteye atamak tüm organizasyona erişim verir (kök + alt site’ler).
  • Toplu işlemlerde replace idempotent güncellemeler için önerilir; add/remove artımlı değişim içindir.

İlgili Kavramlar

  • User — küresel kimlik ve profil
  • Organization User Site — üyelik için site düzeyi erişim