Kiracı Yönetimi

mindzieStudio platformunda kiracı oluşturun, listeleyin, alın ve güncelleyin.

ÖNEMLİ: Bu sayfadaki tüm endpointler Global API Anahtarı gerektirir. Kiracıya özel API anahtarları 401 Yetkisiz hatası alacaktır.


Tüm Kiracıları Listele

GET /api/tenant

Sistemdeki tüm kiracıların özet istatistiklerle birlikte sayfalanmış listesini alır.

Sorgu Parametreleri

Parametre Tür Varsayılan Açıklama
page tam sayı 1 Sayfalama için sayfa numarası
pageSize tam sayı 50 Sayfa başına öğe sayısı (maks: 100)

Yanıt (200 OK)

{
  "tenants": [
    {
      "tenantId": "12345678-1234-1234-1234-123456789012",
      "name": "acme-corp",
      "displayName": "Acme Corporation",
      "description": "Acme Corporation için ana kiracı",
      "caseCount": 50000,
      "maxUserCount": 100,
      "maxAnalystCount": 20,
      "analystCount": 12,
      "userCount": 45,
      "preRelease": false,
      "isAcademic": false,
      "autoload": true,
      "dateCreated": "2024-01-15T10:30:00Z",
      "isDisabled": false
    }
  ],
  "totalCount": 5,
  "page": 1,
  "pageSize": 50
}

Kiracı Nesnesi Alanları

Alan Tür Açıklama
tenantId GUID Kiracının benzersiz tanımlayıcısı
name string Sistem içinde benzersiz isim (URL'lerde kullanılır)
displayName string Okunaklı gösterim adı
description string Kiracının açıklaması
caseCount tam sayı Tüm veri setlerindeki toplam vaka sayısı
maxUserCount tam sayı İzin verilen maksimum kullanıcı sayısı
maxAnalystCount tam sayı İzin verilen maksimum analist sayısı
analystCount tam sayı Mevcut analist sayısı
userCount tam sayı Mevcut kullanıcı sayısı
preRelease boolean Kiracının ön sürüm özelliklerine sahip olup olmadığı
isAcademic boolean Akademik bir kiracı olup olmadığı
autoload boolean Projelerin otomatik yüklenip yüklenmediği
dateCreated datetime Kiracının oluşturulma tarihi
isDisabled boolean Kiracının devre dışı olup olmadığı

Hata Yanıtları

Yetkisiz (401):

{
  "error": "Bu endpoint bir Global API anahtarı gerektirir. Kiracıya özel API anahtarları tüm kiracıları listeleyemez.",
  "hint": "Global API anahtarları /admin/global-api-keys adresinden oluşturulabilir"
}

ID ile Kiracı Getir

GET /api/tenant/{tenantId}

Belirtilen ID'ye sahip belirli bir kiracının detaylı bilgilerini getirir.

Yol Parametreleri

Parametre Tür Zorunlu Açıklama
tenantId GUID Evet Kiracının benzersiz tanımlayıcısı

Yanıt (200 OK)

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "name": "acme-corp",
  "displayName": "Acme Corporation",
  "description": "Acme Corporation için ana kiracı",
  "isAcademic": false,
  "preRelease": false,
  "maxUserCount": 100,
  "maxAnalystCount": 20,
  "maxCases": 100000,
  "dateCreated": "2024-01-15T10:30:00Z",
  "isDisabled": false
}

Hata Yanıtları

Bulunamadı (404):

{
  "error": "'12345678-1234-1234-1234-123456789012' ID'li kiracı bulunamadı"
}

Kiracı Oluştur

POST /api/tenant

Sistemde gerekli tüm altyapıyla yeni bir kiracı oluşturur.

İstek Gövdesi

{
  "name": "new-tenant",
  "displayName": "New Tenant Corp",
  "description": "Yeni kiracının açıklaması",
  "maxUsers": 50,
  "maxAnalyst": 10,
  "maxCases": 100000,
  "timeZone": "America/New_York"
}

İstek Alanları

Alan Tür Zorunlu Açıklama
name string Evet Benzersiz sistem ismi (3-63 karakter, küçük harf alfanümerik ve tire içerebilir)
displayName string Evet Okunaklı gösterim adı
description string Hayır Kiracının açıklaması
maxUsers tam sayı Evet Maksimum kullanıcı sayısı
maxAnalyst tam sayı Evet Maksimum analist sayısı
maxCases tam sayı Evet Maksimum vaka sayısı
timeZone string Hayır Kiracı için zaman dilimi

Kiracı İsim Gereksinimleri

  • 3-63 karakter olmalı
  • Sadece küçük harf, rakam ve tire içermeli
  • Boşluk veya özel karakter olmamalı
  • Tüm kiracılar arasında benzersiz olmalı

Yanıt (201 Created)

{
  "tenantId": "aabbccdd-1234-1234-1234-123456789012",
  "name": "new-tenant",
  "displayName": "New Tenant Corp",
  "message": "'New Tenant Corp' kiracı başarıyla oluşturuldu",
  "storageContainerCreated": true
}

Hata Yanıtları

Çakışma (409):

{
  "error": "'new-tenant' ismindeki bir kiracı zaten mevcut"
}

Lisans Limiti (429):

{
  "error": "Maksimum kiracı sayısına ulaşıldı. Lisansınız 10 kiracıya izin veriyor.",
  "hint": "Daha fazla kiracı oluşturmak için lisansınızı yükseltin"
}

Doğrulama Hatası (400):

{
  "error": "Doğrulama başarısız",
  "validationErrors": [
    "İsim 3 ile 63 karakter arasında olmalıdır",
    "İsim sadece küçük harf, rakam ve tire içerebilir"
  ]
}

Kiracı Güncelle

PUT /api/tenant

Var olan bir kiracının özelliklerini günceller. Sadece sağlanan alanlar değiştirilecektir; null değerler yok sayılır.

İstek Gövdesi

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "displayName": "Acme Corporation Güncellendi",
  "description": "Güncellenmiş açıklama",
  "maxUsers": 100,
  "maxAnalyst": 25,
  "maxCases": 200000,
  "timeZone": "America/New_York",
  "isAcademic": false,
  "preRelease": true,
  "isDisabled": false
}

İstek Alanları

Alan Tür Zorunlu Açıklama
tenantId GUID Evet Güncellenecek kiracı
displayName string Hayır Yeni gösterim adı (null = değişiklik yok)
description string Hayır Yeni açıklama (null = değişiklik yok, "" = temizle)
maxUsers tam sayı Hayır Maksimum kullanıcı (null = değişiklik yok)
maxAnalyst tam sayı Hayır Maksimum analist (null = değişiklik yok)
maxCases tam sayı Hayır Maksimum vaka (null = değişiklik yok, -1 = sınırsız)
timeZone string Hayır Zaman Dilimi ID (null = değişiklik yok)
isAcademic boolean Hayır Akademik bayrak (null = değişiklik yok)
preRelease boolean Hayır Ön sürüm özellikleri (null = değişiklik yok)
isDisabled boolean Hayır Kiracıyı devre dışı bırak (null = değişiklik yok)

Not: Kiracı name alanı oluşturulduktan sonra değiştirilemez.

Yanıt (200 OK)

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "name": "acme-corp",
  "displayName": "Acme Corporation Güncellendi",
  "message": "'acme-corp' kiracı başarıyla güncellendi",
  "isDisabled": false
}

Hata Yanıtları

Bulunamadı (404):

{
  "error": "'12345678-1234-1234-1234-123456789012' ID'li kiracı bulunamadı"
}

Doğrulama Hatası (400):

{
  "error": "Doğrulama başarısız",
  "validationErrors": ["Gösterim adı 255 karakteri aşamaz"]
}

Uygulama Örnekleri

cURL

# Tüm kiracıları listele
curl -X GET "https://your-mindzie-instance.com/api/tenant?page=1&pageSize=50" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# ID ile belirli kiracıyı al
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Kiracı oluştur
curl -X POST "https://your-mindzie-instance.com/api/tenant" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "new-tenant",
    "displayName": "New Tenant Corp",
    "description": "Test tenant",
    "maxUsers": 50,
    "maxAnalyst": 10,
    "maxCases": 100000
  }'

# Kiracıyı güncelle
curl -X PUT "https://your-mindzie-instance.com/api/tenant" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "12345678-1234-1234-1234-123456789012",
    "displayName": "New Tenant Corp Updated",
    "maxUsers": 100,
    "isDisabled": false
  }'

Python

import requests

BASE_URL = 'https://your-mindzie-instance.com'

class TenantManager:
    def __init__(self, global_api_key):
        """GLOBAL API anahtarı (kiracıya özel olmayan) ile başlat."""
        self.headers = {
            'Authorization': f'Bearer {global_api_key}',
            'Content-Type': 'application/json'
        }

    def list_tenants(self, page=1, page_size=50):
        """Sistemdeki tüm kiracıları listele."""
        url = f'{BASE_URL}/api/tenant'
        params = {'page': page, 'pageSize': page_size}
        response = requests.get(url, headers=self.headers, params=params)
        response.raise_for_status()
        return response.json()

    def get_tenant(self, tenant_id):
        """Belirtilen ID'ye sahip kiracıyı getir."""
        url = f'{BASE_URL}/api/tenant/{tenant_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def create_tenant(self, name, display_name, description='', max_users=50,
                      max_analyst=10, max_cases=100000, timezone=None):
        """Yeni bir kiracı oluştur."""
        url = f'{BASE_URL}/api/tenant'
        payload = {
            'name': name,
            'displayName': display_name,
            'description': description,
            'maxUsers': max_users,
            'maxAnalyst': max_analyst,
            'maxCases': max_cases
        }
        if timezone:
            payload['timeZone'] = timezone

        response = requests.post(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_tenant(self, tenant_id, display_name=None, description=None,
                      max_users=None, max_analyst=None, is_disabled=None):
        """Mevcut bir kiracıyı güncelle."""
        url = f'{BASE_URL}/api/tenant'
        payload = {'tenantId': tenant_id}
        if display_name is not None:
            payload['displayName'] = display_name
        if description is not None:
            payload['description'] = description
        if max_users is not None:
            payload['maxUsers'] = max_users
        if max_analyst is not None:
            payload['maxAnalyst'] = max_analyst
        if is_disabled is not None:
            payload['isDisabled'] = is_disabled

        response = requests.put(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Kullanım
manager = TenantManager('your-global-api-key')

# Tüm kiracıları listele
result = manager.list_tenants()
print(f"Toplam kiracı: {result['totalCount']}")
for tenant in result['tenants']:
    print(f"- {tenant['displayName']} ({tenant['name']})")
    print(f"  Kullanıcılar: {tenant['userCount']}/{tenant['maxUserCount']}")

# Yeni kiracı oluştur
new_tenant = manager.create_tenant(
    name='test-tenant',
    display_name='Test Tenant',
    description='API üzerinden oluşturuldu',
    max_users=25,
    max_analyst=5,
    max_cases=50000
)
print(f"Oluşturulan kiracı: {new_tenant['tenantId']}")

# Kiracı limitlerini güncelle
manager.update_tenant(
    tenant_id=new_tenant['tenantId'],
    max_users=50,
    max_analyst=10
)
print("Kiracı limitleri güncellendi")

JavaScript

const BASE_URL = 'https://your-mindzie-instance.com';

class TenantManager {
  constructor(globalApiKey) {
    this.headers = {
      'Authorization': `Bearer ${globalApiKey}`,
      'Content-Type': 'application/json'
    };
  }

  async listTenants(page = 1, pageSize = 50) {
    const url = `${BASE_URL}/api/tenant?page=${page}&pageSize=${pageSize}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Başarısız: ${response.status}`);
    return await response.json();
  }

  async getTenant(tenantId) {
    const url = `${BASE_URL}/api/tenant/${tenantId}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Başarısız: ${response.status}`);
    return await response.json();
  }

  async createTenant(config) {
    const url = `${BASE_URL}/api/tenant`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify(config)
    });
    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.error || `Başarısız: ${response.status}`);
    }
    return await response.json();
  }

  async updateTenant(tenantId, updates) {
    const url = `${BASE_URL}/api/tenant`;
    const response = await fetch(url, {
      method: 'PUT',
      headers: this.headers,
      body: JSON.stringify({ tenantId, ...updates })
    });
    if (!response.ok) throw new Error(`Başarısız: ${response.status}`);
    return await response.json();
  }
}

// Kullanım
const manager = new TenantManager('your-global-api-key');

// Kiracıları listele
const tenants = await manager.listTenants();
console.log(`${tenants.totalCount} kiracı bulundu`);

// Kiracı oluştur
const newTenant = await manager.createTenant({
  name: 'new-tenant',
  displayName: 'New Tenant',
  maxUsers: 50,
  maxAnalyst: 10,
  maxCases: 100000
});
console.log(`Oluşturuldu: ${newTenant.tenantId}`);

// Kiracıyı güncelle
await manager.updateTenant(newTenant.tenantId, {
  displayName: 'Güncellenmiş Kiracı Adı',
  maxUsers: 100
});

En İyi Uygulamalar

  1. Global API Anahtarları: Kiracı yönetimi için sadece global API anahtarlarını kullanın - sistem genelinde önemli ayrıcalıklara sahiptirler
  2. Lisans Farkındalığı: Yeni kiracı oluşturmadan önce kiracı sayısını lisans limitlerine karşı izleyin
  3. Kapasite Planlaması: Beklenen kullanıma göre uygun kullanıcı ve analist limitlerini belirleyin
  4. İsimlendirme Kuralları: Kiracı isimleri için tutarlı, küçük harf ve tire kullanılan isimlendirme kullanın