Kiracı Silme

Bir kiracıyı ve tüm ilgili verileri kalıcı olarak silin. Bu işlem güvenlik için üçlü doğrulama gerektirir.

ÖNEMLİ: Bu sayfadaki tüm uç noktalar Global API Anahtarı gerektirir. Bu tehlikeli bir işlemdir ve geri alınamaz.


Kiracı Sil

DELETE /api/tenant

Bir kiracıyı ve tüm ilgili verileri kalıcı olarak siler. Güvenlik için üçlü doğrulama gerektirir.

UYARI

Bu işlem GERİ ALINAMAZ. Tüm kiracı verileri kalıcı olarak silinecektir, bunlar şunları içerir:

  • Tüm projeler ve veri setleri
  • Tüm araştırmalar, not defterleri ve panolar
  • Blob depolama konteyneri ve dosyaları
  • Veritabanı kayıtları ve ayarları
  • Kiracıya atanmış kullanıcılar (kullanıcıların kendileri silinmez)

Kiracıyı silmeden önce önemli verileri her zaman dışa aktarın.


İstek Gövdesi

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "name": "acme-corp",
  "displayName": "Acme Corporation"
}

Üçlü Doğrulama

Silme işleminin devam etmesi için tüm üç tanımlayıcının tam olarak eşleşmesi gerekir:

Alan Tip Zorunlu Açıklama
tenantId GUID Evet Silinecek kiracı ID'si
name string Evet Kiracı adı (tam olarak eşleşmeli)
displayName string Evet Görünen ad (tam olarak eşleşmeli)

Bu üçlü doğrulama, tüm üç tanımlayıcıyı bilmenizi ve onaylamanızı gerektirerek yanlışlıkla silinmeleri engeller.


Yanıt (200 OK)

{
  "message": "Tenant 'Acme Corporation' deleted successfully",
  "tenantName": "acme-corp",
  "tenantDisplayName": "Acme Corporation",
  "storageContainerDeleted": true
}

Yanıt Alanları

Alan Tip Açıklama
message string Başarı onay mesajı
tenantName string Silinen kiracının sistem adı
tenantDisplayName string Silinen kiracının görünen adı
storageContainerDeleted boolean Blob depolamanın silinip silinmediği

Hata Yanıtları

Bulunamadı (404)

{
  "error": "Tenant not found with ID '12345678-1234-1234-1234-123456789012'"
}

Doğrulama Hatası (400)

Kiracı adı eşleşmediğinde:

{
  "error": "Tenant name 'wrong-name' does not match the tenant with ID '12345678-1234-1234-1234-123456789012'. Expected 'acme-corp'.",
  "hint": "Tüm üç tanımlayıcı (ID, ad, görünen ad) tam olarak eşleşmeli"
}

Görünen ad eşleşmediğinde:

{
  "error": "Display name 'Wrong Name' does not match the tenant with ID '12345678-1234-1234-1234-123456789012'. Expected 'Acme Corporation'.",
  "hint": "Tüm üç tanımlayıcı (ID, ad, görünen ad) tam olarak eşleşmeli"
}

Yetkisiz (401)

{
  "error": "This endpoint requires a Global API key.",
  "hint": "Global API anahtarları /admin/global-api-keys adresinden oluşturulabilir"
}

Uygulama Örnekleri

cURL

# Kiracıyı sil (üçlü doğrulama gerektirir)
curl -X DELETE "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",
    "name": "test-tenant",
    "displayName": "Test Tenant"
  }'

Python

import requests

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

class TenantDeleter:
    def __init__(self, global_api_key):
        """GLOBAL API anahtarı ile başlatılır (kiracıya özgü değil)."""
        self.headers = {
            'Authorization': f'Bearer {global_api_key}',
            'Content-Type': 'application/json'
        }

    def get_tenant(self, tenant_id):
        """Doğrulama için kiracı detaylarını alır."""
        url = f'{BASE_URL}/api/tenant/{tenant_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def delete_tenant(self, tenant_id, name, display_name, confirm=False):
        """
        Üçlü doğrulama ile kiracı siler.

        Argümanlar:
            tenant_id: Kiracı GUID
            name: Kiracı sistem adı (tam eşleşmeli)
            display_name: Kiracı görünen adı (tam eşleşmeli)
            confirm: Silme işlemini gerçekştirmek için True yapın
        """
        if not confirm:
            # Doğrulama modu - değerlerin eşleşip eşleşmediğini kontrol et
            tenant = self.get_tenant(tenant_id)

            errors = []
            if tenant['name'] != name:
                errors.append(f"Ad uyuşmazlığı: beklenen '{tenant['name']}', alınan '{name}'")
            if tenant['displayName'] != display_name:
                errors.append(f"Görünen ad uyuşmazlığı: beklenen '{tenant['displayName']}', alınan '{display_name}'")

            if errors:
                raise ValueError("Doğrulama başarısız:\n" + "\n".join(errors))

            print(f"'{display_name}' ({name}) kiracısı doğrulaması geçti")
            print(f"  - ID: {tenant_id}")
            print(f"  - Kullanıcı sayısı: {tenant.get('userCount', 'N/A')}")
            print(f"  - Durum sayısı: {tenant.get('caseCount', 'N/A')}")
            print("\nSilmek için confirm=True ile çağırın.")
            return None

        # Silme işlemini yap
        url = f'{BASE_URL}/api/tenant'
        payload = {
            'tenantId': tenant_id,
            'name': name,
            'displayName': display_name
        }

        response = requests.delete(url, json=payload, headers=self.headers)

        if response.ok:
            return response.json()
        elif response.status_code == 404:
            raise Exception(f'Kiracı bulunamadı: {tenant_id}')
        elif response.status_code == 400:
            error = response.json()
            raise Exception(f"Doğrulama başarısız: {error.get('error', 'Bilinmeyen hata')}")
        else:
            raise Exception(f'Kiracı silme başarısız: {response.text}')

# Kullanım - Güvenli silme iş akışı
deleter = TenantDeleter('your-global-api-key')

tenant_id = '12345678-1234-1234-1234-123456789012'
tenant_name = 'test-tenant'
display_name = 'Test Tenant'

# Adım 1: Doğrula (silme olmaz)
try:
    deleter.delete_tenant(tenant_id, tenant_name, display_name, confirm=False)
except ValueError as e:
    print(f"Doğrulama başarısız: {e}")
    exit(1)

# Adım 2: Silmeyi onayla (hazır olduğunda yorumu kaldırın)
# result = deleter.delete_tenant(tenant_id, tenant_name, display_name, confirm=True)
# print(f"Silindi: {result['message']}")

JavaScript

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

class TenantDeleter {
  constructor(globalApiKey) {
    this.headers = {
      'Authorization': `Bearer ${globalApiKey}`,
      'Content-Type': 'application/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(`Kiracı alınamadı: ${response.status}`);
    return await response.json();
  }

  async deleteTenant(tenantId, name, displayName, confirm = false) {
    if (!confirm) {
      // Doğrulama modu
      const tenant = await this.getTenant(tenantId);

      const errors = [];
      if (tenant.name !== name) {
        errors.push(`Ad uyuşmazlığı: beklenen '${tenant.name}', alınan '${name}'`);
      }
      if (tenant.displayName !== displayName) {
        errors.push(`Görünen ad uyuşmazlığı: beklenen '${tenant.displayName}', alınan '${displayName}'`);
      }

      if (errors.length > 0) {
        throw new Error('Doğrulama başarısız:\n' + errors.join('\n'));
      }

      console.log(`'${displayName}' (${name}) kiracısı doğrulaması geçti`);
      console.log(`  - ID: ${tenantId}`);
      console.log(`  - Kullanıcılar: ${tenant.userCount || 'N/A'}`);
      console.log('\nSilmek için confirm=true ile çağırın.');
      return null;
    }

    // Silme işlemini yap
    const url = `${BASE_URL}/api/tenant`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers,
      body: JSON.stringify({ tenantId, name, displayName })
    });

    if (response.ok) {
      return await response.json();
    }

    const error = await response.json();
    throw new Error(error.error || `Silme başarısız: ${response.status}`);
  }
}

// Kullanım - Güvenli silme iş akışı
const deleter = new TenantDeleter('your-global-api-key');

const tenantId = '12345678-1234-1234-1234-123456789012';
const tenantName = 'test-tenant';
const displayName = 'Test Tenant';

// Adım 1: Doğrula (silme olmaz)
try {
  await deleter.deleteTenant(tenantId, tenantName, displayName, false);
} catch (e) {
  console.error(`Doğrulama başarısız: ${e.message}`);
  process.exit(1);
}

// Adım 2: Silmeyi onayla (hazır olduğunda yorumu kaldırın)
// const result = await deleter.deleteTenant(tenantId, tenantName, displayName, true);
// console.log(`Silindi: ${result.message}`);

Güvenlik için En İyi Uygulamalar

Silmeden Önce

  1. Tüm Verileri Dışa Aktar: Proje API'si kullanarak tüm projeleri .mpz dosyası olarak dışa aktarın
  2. Kullanıcıları Doğrula: Hangi kullanıcıların atandığını kontrol edin ve onları bilgilendirin
  3. Belgeleyin: Denetim amaçlı neyin neden silindiğini kaydedin
  4. Çift Kontrol Yapın: Kiracı ID'sinin, adının ve görünen adının doğru olduğundan emin olun

Silme Esnasında

  1. Doğrulama Modelini Kullanın: Önce sadece doğrulama modunda silme uç noktasını çağırın
  2. Yanıtı Kontrol Edin: Yanıtın doğru kiracı bilgilerini gösterdiğinden emin olun
  3. Kasdetli Onay Verin: Sadece manuel doğrulamadan sonra confirm=True parametresini geçirin

Sildikten Sonra

  1. Silindiğini Doğrula: Kiracının artık kiracılar listesinde olmadığını kontrol edin
  2. Kullanıcıları Kontrol Edin: Etkilenen kullanıcıların silinen kiracıya erişemediğini kontrol edin
  3. Belgelendirmeyi Güncelleyin: Silme işlemini sistem dokümantasyonunuza kaydedin

Alternatif: Silmek Yerine Devre Dışı Bırakma

Kiracı verilerini korurken erişimi engellemek için kiracıyı silmek yerine devre dışı bırakmayı düşünün:

# Kiracı devre dışı bırakma (veriler korunur)
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",
    "isDisabled": true
  }'

Devre dışı bırakılmış kiracılar:

  • Kullanıcılar kiracıya giriş yapamaz
  • Tüm veriler korunur
  • isDisabled: false ayarlanarak daha sonra tekrar etkinleştirilebilir
  • Kiracılar listesinde isDisabled: true olarak görünür

Bu, kalıcı silme işleminden genellikle daha güvenli bir seçenektir.