API

İzinler API'si

Ekip organizasyonlarını, kaynak bazlı grant'leri ve bekleyen grant'lere sahip davetiyeleri yönetin.

Permissions API, Alaf Server'ın ekip ve erişim kontrol modelini çalıştırır: aktif org'un bir ekip olup olmadığını raporlar, grant edebileceğiniz kaynakları listeler, kişisel bir workspace'i bir ekip org'una yükseltir ve bir restricted üyeyi belirli projelere, server'lara veya diğer kaynaklara sınırlayan üye bazlı grant'leri ve davetiyeleri yönetir. dashboard'da bu, organizasyonun Ekip sekmesidir. Rollerin ve grant'lerin nasıl birleştiğini görmek için Kimlik Doğrulama ve Erişim bölümüne bakın.

Temel yol ve kimlik doğrulama

Tüm yollar, örneğin https://your-host/api/permissions/grants gibi, /api altında, instance'ınıza göredir. alaf server token create ile oluşturulmuş bir kişisel erişim token'ını bir bearer header olarak gönderin (Authorization: Bearer <token>). dashboard bunun yerine oturum cookie'nizi kullanır. Tam kimlik doğrulama modeli için API genel bakış bölümüne bakın.

Grant'ler yalnızca restricted rolünü etkiler

owner, admin ve member rolleri, grant'ler dikkate alınmadan önce çözümlenir, bu nedenle grant'lerin bunlar üzerinde hiçbir etkisi yoktur. Grant'ler, bir restricted üyeyi "erişim yok" durumundan belirli kaynaklara kadar genişletmek için mevcuttur. Bir grant, (kullanıcı, resourceType, resourceId, permissions[]) şeklinde bir tuple'dır; resourceId, org genelinde erişim için * olabilir.

Endpoint'ler

Metot ve yolİzinNe işe yarar
GET /api/permissions/org-metapermissions:readAktif org'un isTeam bayrağı ve üye sayısı.
GET /api/permissions/resourcespermissions:read?type= için grant edilebilir kaynakların kataloğu (grant seçici).
POST /api/permissions/create-team-orgpermissions:writeYeni bir ekip organizasyonu oluşturun ("ekibe yükselt").
POST /api/permissions/invitations/:id/materializepermissions:writeKabul edilmiş bir davetiyenin bekleyen grant'lerini gerçek grant'lere dönüştürün.
GET /api/permissions/grantspermissions:readBir üyenin grant'lerini listele (?userId=).
POST /api/permissions/grantspermissions:writeBir grant'i upsert edin (boş permissions onu iptal eder).
PUT /api/permissions/grantspermissions:writeBir üyenin tüm grant setini değiştirin, server tarafında diff'lenir.
DELETE /api/permissions/grants/:idpermissions:adminTek bir grant'i iptal edin.
GET /api/permissions/invitationspermissions:readBekleyen grant'leri ile birlikte bekleyen davetiyeleri listele.
POST /api/permissions/invite-with-grantspermissions:writeBir üyeyi davet edin ve tek bir çağrıda bekleyen grant'leri ekleyin.

† Yalnızca Admin/Owner

ile işaretlenmiş her route, ayrıca çağrı yapanın aktif org'daki rolünün admin veya owner olmasını gerektirir (bir requireRole("admin") gate'i). İşaretlenmemiş dört route, herhangi bir kimliği doğrulanmış üyeye açıktır — bunlar davetiyeyi kabul etme ve ekibe yükseltme akışlarını destekler. GET /resources ayrıca github_installation ve github_repository türleri için admin/owner yetkisini kendi kendine uygular.

Kaynak türleri ve izin seviyeleri

resourceType, project, server, mail_server, backup_destination, billing, audit, github_installation veya github_repository'den biridir. Her grant'in permissions dizisi read, write, admin'den herhangi birini içerir.

Bir ekip organizasyonu oluşturun

Yepyeni bir organizasyon oluşturur, onu bir ekip olarak işaretler ve çağrı yapanı sahibi olarak ayarlar. Kişisel workspace'ler kişisel kalır — bu, paylaşılan, çok üyeli bir org elde etmenin yoludur.

POST /api/permissions/create-team-org

Prop

Type

curl -X POST https://your-host/api/permissions/create-team-org \
  -H "Authorization: Bearer $ALAFSERVER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Acme Platform"}'

Dönüş değeri 201 ve { data: { id, name, isTeam: true } } şeklindedir.

Grant edilebilir kaynakları listele

Grant modal'ı ve davet akışı için yan etkisi olmayan seçici payload'ı. Kaynak type'ını geçin; { id, label, meta? }[] geri alın. * wildcard'ı listelenmez — seçici onu kendi ekler.

GET /api/permissions/resources?type=project
curl "https://your-host/api/permissions/resources?type=server" \
  -H "Authorization: Bearer $ALAFSERVER_TOKEN"

type=billing veya type=audit için tek giriş org genelindeki *'dır. type=github_repository için &owner=<login> ile bir hesaba daraltabilirsiniz.

Bir kaynağa grant ver

Tek bir grant tuple'ının idempotent upsert'i. Aynı (userId, resourceType, resourceId)'ı yeniden göndermek, permissions'ını yerinde değiştirir. Boş bir permissions dizisi grant'i iptal eder (Alaf Server sıfır izinli placeholder satırları tutmaz).

POST /api/permissions/grants

Prop

Type

curl -X POST https://your-host/api/permissions/grants \
  -H "Authorization: Bearer $ALAFSERVER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"userId":"user_123","resourceType":"project","resourceId":"proj_abc","permissions":["read","write"]}'

Dönüş değeri 201 ve { data: <grant> } şeklindedir veya permissions boş olduğunda { data: null, revoked: true } şeklindedir.

Bir üyenin grant setini değiştir

Üyenin tüm istenen grant setini gönderir; server mevcut olanla diff'ler — eklenen/değiştirilen tuple'ları upsert eder ve mevcut olmayanları siler. Bu, üye-grant'ler editörü için tek kaydetme yoludur. Sıfır izinli girişler düşürülür.

PUT /api/permissions/grants

Prop

Type

grants'in her bir girişi bir Grant nesnesidir:

Prop

Type

curl -X PUT https://your-host/api/permissions/grants \
  -H "Authorization: Bearer $ALAFSERVER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "userId":"user_123",
    "grants":[
      {"resourceType":"project","resourceId":"proj_abc","permissions":["read","write"]},
      {"resourceType":"server","resourceId":"srv_1","permissions":["read"]}
    ]
  }'

Wildcard olmayan, satır tabanlı kaynakların aktif org'a ait olup olmadığı kontrol edilir; yabancı bir id 400 RESOURCE_NOT_IN_ORG ile reddedilir.

Grant'lerle bir üye davet et

Better Auth'un davetini sarmalar ve aynı çağrıda davetiyeye karşı bekleyen grant'leri saklar. Davetli kabul ettiğinde, kabul-davet sayfası bu bekleyen grant'leri gerçek grant'lere dönüştürmek için POST /invitations/:id/materialize çağrısını yapar.

POST /api/permissions/invite-with-grants

Prop

Type

curl -X POST https://your-host/api/permissions/invite-with-grants \
  -H "Authorization: Bearer $ALAFSERVER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email":"dev@acme.com",
    "role":"restricted",
    "grants":[{"resourceType":"project","resourceId":"proj_abc","permissions":["read","write"]}]
  }'

Dönüş değeri 201 ve { data: { id, email, role, pendingGrantCount } } şeklindedir.

Bir davetiyenin grant'lerini somutlaştır

Better Auth kabulü kaydettikten sonra kabul-davet sayfasından çağrılır. Davetiyenin bekleyen grant'lerini bulur, bunları artık katılmış olan kullanıcı için gerçek grant'ler olarak upsert eder ve bekleyen satırları temizler. Davetiyenin kendisi tarafından yetkilendirilir — çağrı yapanın e-postası davetiye ile eşleşmeli ve durumu accepted olmalıdır.

POST /api/permissions/invitations/:id/materialize
curl -X POST https://your-host/api/permissions/invitations/inv_123/materialize \
  -H "Authorization: Bearer $ALAFSERVER_TOKEN"

Dönüş değeri { data: { materialized: <count> } } şeklindedir.

Görebileceğiniz hatalar

400 — eksik veya geçersiz alanlar

POST /grants üzerinde userId, resourceType ve resourceId zorunludur; create-team-org üzerinde name zorunludur; invite-with-grants üzerinde email zorunludur. Bilinmeyen bir resourceType, code: "INVALID_RESOURCE_TYPE" döndürür. Davetiye akışında, 400 ayrıca davetiyenin henüz kabul edilmediği veya süresinin dolduğu anlamına gelir.

403 — admin değil veya yanlış davetli

Grant/davetiye route'ları, çağrı yapanın aktif org'da admin veya owner olmasını gerektirir. /invitations/:id/materialize üzerinde, 403 hesabınızın e-postasının davetiye ile eşleşmediği anlamına gelir.

404 — üye değil / grant bulunamadı

POST /grants, hedef userId aktif org'un bir üyesi olmadığında 404 döndürür; DELETE /grants/:id, id'niz organizasyonunuza ait olmadığında 404 döndürür (grant'ler org kapsamlıdır, bu nedenle id'yi tahmin ederek bile başka bir tenant'ın satırlarına dokunamazsınız).

On this page