Mandantenverwaltung

Erstellen, auflisten, abrufen und aktualisieren Sie Mandanten auf der mindzieStudio-Plattform.

WICHTIG: Alle Endpunkte auf dieser Seite erfordern einen Globalen API-Schlüssel. Mandantenspezifische API-Schlüssel erhalten einen 401 Unauthorized-Fehler.


Alle Mandanten auflisten

GET /api/tenant

Gibt eine paginierte Liste aller Mandanten im System mit Zusammenfassungsstatistiken zurück.

Abfrageparameter

Parameter Typ Standard Beschreibung
page Ganzzahl 1 Seitenzahl für die Paginierung
pageSize Ganzzahl 50 Anzahl der Elemente pro Seite (max.: 100)

Antwort (200 OK)

{
  "tenants": [
    {
      "tenantId": "12345678-1234-1234-1234-123456789012",
      "name": "acme-corp",
      "displayName": "Acme Corporation",
      "description": "Hauptmandant für Acme Corporation",
      "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
}

Felder des Mandantenobjekts

Feld Typ Beschreibung
tenantId GUID Eindeutige Identifikationsnummer des Mandanten
name string Eindeutiger Systemname (wird in URLs verwendet)
displayName string Menschenlesbarer Anzeigename
description string Beschreibung des Mandanten
caseCount Ganzzahl Gesamtanzahl der Fälle über alle Datensätze
maxUserCount Ganzzahl Maximal erlaubte Benutzeranzahl
maxAnalystCount Ganzzahl Maximal erlaubte Analystenzahl
analystCount Ganzzahl Aktuelle Anzahl der Analysten
userCount Ganzzahl Aktuelle Anzahl der Benutzer
preRelease boolean Ob der Mandant Vorab-Funktionen hat
isAcademic boolean Ob es sich um einen akademischen Mandanten handelt
autoload boolean Ob Projekte automatisch geladen werden sollen
dateCreated datetime Zeitpunkt der Erstellung des Mandanten
isDisabled boolean Ob der Mandant deaktiviert ist

Fehlerantworten

Unauthorized (401):

{
  "error": "Dieser Endpunkt erfordert einen Globalen API-Schlüssel. Mandantenspezifische API-Schlüssel können nicht alle Mandanten auflisten.",
  "hint": "Globale API-Schlüssel können unter /admin/global-api-keys erstellt werden"
}

Mandanten nach ID abrufen

GET /api/tenant/{tenantId}

Gibt detaillierte Informationen für einen bestimmten Mandanten anhand seiner ID zurück.

Pfadparameter

Parameter Typ Erforderlich Beschreibung
tenantId GUID Ja Die eindeutige Identifikationsnummer des Mandanten

Antwort (200 OK)

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "name": "acme-corp",
  "displayName": "Acme Corporation",
  "description": "Hauptmandant für Acme Corporation",
  "isAcademic": false,
  "preRelease": false,
  "maxUserCount": 100,
  "maxAnalystCount": 20,
  "maxCases": 100000,
  "dateCreated": "2024-01-15T10:30:00Z",
  "isDisabled": false
}

Fehlerantworten

Not Found (404):

{
  "error": "Mandant mit der ID '12345678-1234-1234-1234-123456789012' wurde nicht gefunden"
}

Mandanten erstellen

POST /api/tenant

Erstellt einen neuen Mandanten im System mit aller notwendigen Infrastruktur.

Anfragekörper

{
  "name": "new-tenant",
  "displayName": "New Tenant Corp",
  "description": "Beschreibung des neuen Mandanten",
  "maxUsers": 50,
  "maxAnalyst": 10,
  "maxCases": 100000,
  "timeZone": "America/New_York"
}

Anfragefelder

Feld Typ Erforderlich Beschreibung
name string Ja Eindeutiger Systemname (3-63 Zeichen, Kleinbuchstaben, Zahlen und Bindestriche)
displayName string Ja Menschenlesbarer Anzeigename
description string Nein Beschreibung des Mandanten
maxUsers Ganzzahl Ja Maximale Anzahl von Benutzern
maxAnalyst Ganzzahl Ja Maximale Anzahl von Analysten
maxCases Ganzzahl Ja Maximale Anzahl von Fällen
timeZone string Nein Zeitzone des Mandanten

Anforderungen an den Mandantennamen

  • 3–63 Zeichen
  • Nur Kleinbuchstaben, Zahlen und Bindestriche
  • Keine Leerzeichen oder Sonderzeichen
  • Muss mandantenübergreifend eindeutig sein

Antwort (201 Created)

{
  "tenantId": "aabbccdd-1234-1234-1234-123456789012",
  "name": "new-tenant",
  "displayName": "New Tenant Corp",
  "message": "Mandant 'New Tenant Corp' erfolgreich erstellt",
  "storageContainerCreated": true
}

Fehlerantworten

Conflict (409):

{
  "error": "Ein Mandant mit dem Namen 'new-tenant' existiert bereits"
}

Lizenzlimit (429):

{
  "error": "Maximale Anzahl von Mandanten erreicht. Ihre Lizenz erlaubt 10 Mandanten.",
  "hint": "Erweitern Sie Ihre Lizenz, um mehr Mandanten zu erstellen"
}

Validierungsfehler (400):

{
  "error": "Validierung fehlgeschlagen",
  "validationErrors": [
    "Name muss zwischen 3 und 63 Zeichen lang sein",
    "Name darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten"
  ]
}

Mandanten aktualisieren

PUT /api/tenant

Aktualisiert die Eigenschaften eines vorhandenen Mandanten. Es werden nur angegebene Felder aktualisiert; Nullwerte werden ignoriert.

Anfragekörper

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "displayName": "Acme Corporation Aktualisiert",
  "description": "Aktualisierte Beschreibung",
  "maxUsers": 100,
  "maxAnalyst": 25,
  "maxCases": 200000,
  "timeZone": "America/New_York",
  "isAcademic": false,
  "preRelease": true,
  "isDisabled": false
}

Anfragefelder

Feld Typ Erforderlich Beschreibung
tenantId GUID Ja Zu aktualisierender Mandant
displayName string Nein Neuer Anzeigename (null = keine Änderung)
description string Nein Neue Beschreibung (null = keine Änderung, "" = löschen)
maxUsers Ganzzahl Nein Maximale Benutzer (null = keine Änderung)
maxAnalyst Ganzzahl Nein Maximale Analysten (null = keine Änderung)
maxCases Ganzzahl Nein Maximale Fälle (null = keine Änderung, -1 = unbegrenzt)
timeZone string Nein Zeitzonen-ID (null = keine Änderung)
isAcademic boolean Nein Akademisches Flag (null = keine Änderung)
preRelease boolean Nein Vorab-Funktionen (null = keine Änderung)
isDisabled boolean Nein Mandant deaktivieren (null = keine Änderung)

Hinweis: Der Mandantenname name kann nach der Erstellung nicht geändert werden.

Antwort (200 OK)

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "name": "acme-corp",
  "displayName": "Acme Corporation Aktualisiert",
  "message": "Mandant 'acme-corp' erfolgreich aktualisiert",
  "isDisabled": false
}

Fehlerantworten

Not Found (404):

{
  "error": "Mandant mit der ID '12345678-1234-1234-1234-123456789012' wurde nicht gefunden"
}

Validierungsfehler (400):

{
  "error": "Validierung fehlgeschlagen",
  "validationErrors": ["Anzeigename darf 255 Zeichen nicht überschreiten"]
}

Implementierungsbeispiele

cURL

# Alle Mandanten auflisten
curl -X GET "https://your-mindzie-instance.com/api/tenant?page=1&pageSize=50" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Bestimmten Mandanten per ID abrufen
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Mandanten erstellen
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 mandant",
    "maxUsers": 50,
    "maxAnalyst": 10,
    "maxCases": 100000
  }'

# Mandanten aktualisieren
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 Aktualisiert",
    "maxUsers": 100,
    "isDisabled": false
  }'

Python

import requests

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

class TenantManager:
    def __init__(self, global_api_key):
        """Initialisiert mit einem GLOBALEN API-Schlüssel (nicht mandantenspezifisch)."""
        self.headers = {
            'Authorization': f'Bearer {global_api_key}',
            'Content-Type': 'application/json'
        }

    def list_tenants(self, page=1, page_size=50):
        """Listet alle Mandanten im System auf."""
        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):
        """Holt einen spezifischen Mandanten per ID."""
        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):
        """Erstellt einen neuen Mandanten."""
        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):
        """Aktualisiert einen bestehenden Mandanten."""
        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()

# Verwendung
manager = TenantManager('your-global-api-key')

# Alle Mandanten auflisten
result = manager.list_tenants()
print(f"Gesamtzahl der Mandanten: {result['totalCount']}")
for tenant in result['tenants']:
    print(f"- {tenant['displayName']} ({tenant['name']})")
    print(f"  Benutzer: {tenant['userCount']}/{tenant['maxUserCount']}")

# Neuen Mandanten erstellen
new_tenant = manager.create_tenant(
    name='test-tenant',
    display_name='Test Mandant',
    description='Per API erstellt',
    max_users=25,
    max_analyst=5,
    max_cases=50000
)
print(f"Mandant erstellt: {new_tenant['tenantId']}")

# Mandantenlimits aktualisieren
manager.update_tenant(
    tenant_id=new_tenant['tenantId'],
    max_users=50,
    max_analyst=10
)
print("Mandantenlimits aktualisiert")

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(`Fehler: ${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(`Fehler: ${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 || `Fehler: ${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(`Fehler: ${response.status}`);
    return await response.json();
  }
}

// Verwendung
const manager = new TenantManager('your-global-api-key');

// Mandanten auflisten
const tenants = await manager.listTenants();
console.log(`Gefundene Mandanten: ${tenants.totalCount}`);

// Mandanten erstellen
const newTenant = await manager.createTenant({
  name: 'new-tenant',
  displayName: 'Neuer Mandant',
  maxUsers: 50,
  maxAnalyst: 10,
  maxCases: 100000
});
console.log(`Erstellt: ${newTenant.tenantId}`);

// Mandanten aktualisieren
await manager.updateTenant(newTenant.tenantId, {
  displayName: 'Aktualisierter Mandantenname',
  maxUsers: 100
});

Best Practices

  1. Globale API-Schlüssel: Verwenden Sie nur globale API-Schlüssel für die Mandantenverwaltung - sie besitzen weitreichende systemweite Berechtigungen
  2. Lizenzüberwachung: Überwachen Sie die Anzahl der Mandanten im Verhältnis zu den Lizenzbeschränkungen, bevor Sie neue Mandanten erstellen
  3. Kapazitätsplanung: Legen Sie angemessene Benutzer- und Analystenlimits basierend auf der erwarteten Nutzung fest
  4. Namenskonventionen: Verwenden Sie konsistente, klein geschriebene Namen mit Bindestrichen für Mandantennamen