Tenant Verwijderen

Verwijder een tenant en alle gerelateerde gegevens permanent. Deze handeling vereist drievoudige verificatie voor veiligheid.

BELANGRIJK: Alle endpoints op deze pagina vereisen een Global API Key. Dit is een gevaarlijke handeling die niet ongedaan gemaakt kan worden.


Tenant Verwijderen

DELETE /api/tenant

Verwijdert een tenant en alle gerelateerde gegevens permanent. Vereist drievoudige verificatie voor veiligheid.

WAARSCHUWING

Deze operatie is NIET OMKEERBAAR. Alle tenantgegevens worden permanent verwijderd, inclusief:

  • Alle projecten en hun datasets
  • Alle onderzoeken, notitieboeken en dashboards
  • Blob storage container en bestanden
  • Database records en instellingen
  • Gebruikers toewijzingen aan de tenant (gebruikers zelf worden niet verwijderd)

Exporteer altijd belangrijke gegevens voordat u een tenant verwijdert.


Request Body

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

Drievoudige Verificatie

Alle drie de identifiers moeten exact overeenkomen om de verwijdering door te laten gaan:

Veld Type Vereist Beschrijving
tenantId GUID Ja Tenant-ID om te verwijderen
name string Ja Tenant-naam (moet exact overeenkomen)
displayName string Ja Weergavenaam (moet exact overeenkomen)

Deze drievoudige verificatie voorkomt per ongeluk verwijderen door te eisen dat u alle drie de identifiers kent en bevestigt.


Response (200 OK)

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

Response Velden

Veld Type Beschrijving
message string Bevestigingsbericht succes
tenantName string De systeemnaam van de verwijderde tenant
tenantDisplayName string De weergavenaam van de verwijderde tenant
storageContainerDeleted boolean Of de blob opslag is verwijderd

Foutantwoorden

Niet Gevonden (404)

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

Verificatie Gefaald (400)

Als de tenantnaam niet overeenkomt:

{
  "error": "Tenant name 'wrong-name' does not match the tenant with ID '12345678-1234-1234-1234-123456789012'. Expected 'acme-corp'.",
  "hint": "All three identifiers (ID, name, display name) must match exactly for safety"
}

Als de weergavenaam niet overeenkomt:

{
  "error": "Display name 'Wrong Name' does not match the tenant with ID '12345678-1234-1234-1234-123456789012'. Expected 'Acme Corporation'.",
  "hint": "All three identifiers (ID, name, display name) must match exactly for safety"
}

Ongeautoriseerd (401)

{
  "error": "This endpoint requires a Global API key.",
  "hint": "Global API keys can be created at /admin/global-api-keys"
}

Implementatie Voorbeelden

cURL

# Tenant verwijderen (vereist drievoudige verificatie)
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):
        """Initialiseer met een GLOBAL API-sleutel (niet tenant-specifiek)."""
        self.headers = {
            'Authorization': f'Bearer {global_api_key}',
            'Content-Type': 'application/json'
        }

    def get_tenant(self, tenant_id):
        """Haalt tenantgegevens op voor verificatie."""
        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):
        """
        Verwijdert een tenant met drievoudige verificatie.

        Args:
            tenant_id: De tenant GUID
            name: De systeemnaam van de tenant (moet exact overeenkomen)
            display_name: De weergavenaam van de tenant (moet exact overeenkomen)
            confirm: Zet op True om daadwerkelijk te verwijderen
        """
        if not confirm:
            # Verificatiemodus - controleer of waarden overeenkomen
            tenant = self.get_tenant(tenant_id)

            errors = []
            if tenant['name'] != name:
                errors.append(f"Naam komt niet overeen: verwacht '{tenant['name']}', kreeg '{name}'")
            if tenant['displayName'] != display_name:
                errors.append(f"Weergavenaam komt niet overeen: verwacht '{tenant['displayName']}', kreeg '{display_name}'")

            if errors:
                raise ValueError("Verificatie mislukt:\n" + "\n".join(errors))

            print(f"Verificatie geslaagd voor tenant '{display_name}' ({name})")
            print(f"  - ID: {tenant_id}")
            print(f"  - Gebruikers: {tenant.get('userCount', 'N/B')}")
            print(f"  - Cases: {tenant.get('caseCount', 'N/B')}")
            print("\nRoep aan met confirm=True om door te gaan met verwijderen.")
            return None

        # Voer de verwijdering uit
        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'Tenant niet gevonden: {tenant_id}')
        elif response.status_code == 400:
            error = response.json()
            raise Exception(f"Verificatie mislukt: {error.get('error', 'Onbekende fout')}")
        else:
            raise Exception(f'Verwijderen tenant mislukt: {response.text}')

# Gebruik - Veilige verwijder workflow
deleter = TenantDeleter('your-global-api-key')

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

# Stap 1: Verifiëren (geen verwijdering)
try:
    deleter.delete_tenant(tenant_id, tenant_name, display_name, confirm=False)
except ValueError as e:
    print(f"Verificatie mislukt: {e}")
    exit(1)

# Stap 2: Verwijderen bevestigen (uitcommentaar wanneer klaar)
# result = deleter.delete_tenant(tenant_id, tenant_name, display_name, confirm=True)
# print(f"Verwijderd: {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(`Opvragen tenant mislukt: ${response.status}`);
    return await response.json();
  }

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

      const errors = [];
      if (tenant.name !== name) {
        errors.push(`Naam komt niet overeen: verwacht '${tenant.name}', kreeg '${name}'`);
      }
      if (tenant.displayName !== displayName) {
        errors.push(`Weergavenaam komt niet overeen: verwacht '${tenant.displayName}', kreeg '${displayName}'`);
      }

      if (errors.length > 0) {
        throw new Error('Verificatie mislukt:\n' + errors.join('\n'));
      }

      console.log(`Verificatie geslaagd voor tenant '${displayName}' (${name})`);
      console.log(`  - ID: ${tenantId}`);
      console.log(`  - Gebruikers: ${tenant.userCount || 'N/B'}`);
      console.log('\nRoep aan met confirm=true om door te gaan met verwijderen.');
      return null;
    }

    // Voer de verwijdering uit
    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 || `Verwijderen mislukt: ${response.status}`);
  }
}

// Gebruik - Veilige verwijder workflow
const deleter = new TenantDeleter('your-global-api-key');

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

// Stap 1: Verifiëren (geen verwijdering)
try {
  await deleter.deleteTenant(tenantId, tenantName, displayName, false);
} catch (e) {
  console.error(`Verificatie mislukt: ${e.message}`);
  process.exit(1);
}

// Stap 2: Verwijderen bevestigen (uitcommentaar wanneer klaar)
// const result = await deleter.deleteTenant(tenantId, tenantName, displayName, true);
// console.log(`Verwijderd: ${result.message}`);

Veiligheidsrichtlijnen

Voor Verwijderen

  1. Exporteer Alle Data: Gebruik de Project API om alle projecten als .mpz-bestanden te exporteren
  2. Controleer Gebruikers: Kijk welke gebruikers zijn toegewezen en informeer hen
  3. Documenteer: Noteer wat wordt verwijderd en waarom voor auditdoeleinden
  4. Dubbelcheck: Controleer dat tenant-ID, naam en weergavenaam correct zijn

Tijdens Verwijderen

  1. Gebruik het Verificatiepatroon: Roep het delete-endpoint eerst aan in verificatiemodus
  2. Controleer Antwoord: Verifieer dat het antwoord de juiste tenantgegevens toont
  3. Bevestig Bewust: Geef alleen confirm=True door na handmatige verificatie

Na Verwijderen

  1. Verifieer Verwijdering: Controleer dat de tenant niet meer verschijnt in de tenantlijst
  2. Controleer Gebruikers: Controleer dat getroffen gebruikers geen toegang meer hebben tot de verwijderde tenant
  3. Werk Documentatie Bij: Noteer de verwijdering in je systeemdocumentatie

Alternatief: Uitschakelen in Plaats van Verwijderen

Overweeg een tenant uit te schakelen in plaats van te verwijderen om data te behouden en toch de toegang te blokkeren:

# Tenant uitschakelen (data blijft behouden)
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
  }'

Uitgeschakelde tenants:

  • Gebruikers kunnen niet inloggen op de tenant
  • Alle data blijft behouden
  • Kan later opnieuw ingeschakeld worden door isDisabled: false te zetten
  • Verschijnt in de tenantlijst met isDisabled: true

Dit is vaak een veiligere keuze dan permanente verwijdering.