Tenantbeheer

Maak, lijst, haal op en werk tenants bij in het mindzieStudio-platform.

BELANGRIJK: Alle endpoints op deze pagina vereisen een Global API Key. Tenant-specifieke API-sleutels krijgen een 401 Unauthorized-fout.


Alle tenants weergeven

GET /api/tenant

Haalt een gepagineerde lijst op van alle tenants in het systeem met samenvattende statistieken.

Query Parameters

Parameter Type Standaard Beschrijving
page integer 1 Paginanummer voor paginering
pageSize integer 50 Aantal items per pagina (max: 100)

Response (200 OK)

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

Tenant Object Velden

Veld Type Beschrijving
tenantId GUID Unieke identifier voor de tenant
name string Unieke systeemnaam (gebruikt in URL's)
displayName string Menselijk leesbare weergavenaam
description string Beschrijving van de tenant
caseCount integer Totaal aantal cases over alle datasets
maxUserCount integer Maximaal toegestane gebruikers
maxAnalystCount integer Maximaal toegestane analisten
analystCount integer Huidig aantal analisten
userCount integer Huidig aantal gebruikers
preRelease boolean Of de tenant pre-release functies heeft
isAcademic boolean Of dit een academische tenant is
autoload boolean Of projecten automatisch geladen worden
dateCreated datetime Wanneer de tenant is aangemaakt
isDisabled boolean Of de tenant is uitgeschakeld

Foutantwoorden

Unauthorized (401):

{
  "error": "Dit endpoint vereist een Global API key. Tenant-specifieke API keys kunnen niet alle tenants weergeven.",
  "hint": "Global API keys kunnen worden aangemaakt via /admin/global-api-keys"
}

Tenant ophalen op ID

GET /api/tenant/{tenantId}

Haalt gedetailleerde informatie op voor een specifieke tenant via zijn ID.

Path Parameters

Parameter Type Verplicht Beschrijving
tenantId GUID Ja De unieke identifier van de tenant

Response (200 OK)

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

Foutantwoorden

Not Found (404):

{
  "error": "Tenant met ID '12345678-1234-1234-1234-123456789012' niet gevonden"
}

Tenant aanmaken

POST /api/tenant

Maakt een nieuwe tenant aan in het systeem met alle benodigde infrastructuur.

Request Body

{
  "name": "new-tenant",
  "displayName": "New Tenant Corp",
  "description": "Beschrijving van de nieuwe tenant",
  "maxUsers": 50,
  "maxAnalyst": 10,
  "maxCases": 100000,
  "timeZone": "America/New_York"
}

Request Velden

Veld Type Verplicht Beschrijving
name string Ja Unieke systeemnaam (3-63 tekens, kleine letters, cijfers en koppeltekens)
displayName string Ja Menselijk leesbare weergavenaam
description string Nee Beschrijving van de tenant
maxUsers integer Ja Maximaal aantal gebruikers
maxAnalyst integer Ja Maximaal aantal analisten
maxCases integer Ja Maximaal aantal cases
timeZone string Nee Tijdzone voor de tenant

Naamvereisten voor Tenant

  • 3-63 tekens
  • Alleen kleine letters, cijfers en koppeltekens
  • Geen spaties of speciale tekens
  • Moet uniek zijn over alle tenants

Response (201 Created)

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

Foutantwoorden

Conflict (409):

{
  "error": "Een tenant met de naam 'new-tenant' bestaat al"
}

License Limit (429):

{
  "error": "Maximum aantal tenants bereikt. Uw licentie staat 10 tenants toe.",
  "hint": "Upgrade uw licentie om meer tenants aan te maken"
}

Validatiefout (400):

{
  "error": "Validatie mislukt",
  "validationErrors": [
    "Naam moet tussen 3 en 63 tekens lang zijn",
    "Naam mag alleen kleine letters, cijfers en koppeltekens bevatten"
  ]
}

Tenant bijwerken

PUT /api/tenant

Werk de eigenschappen van een bestaande tenant bij. Alleen opgegeven velden worden bijgewerkt; null-waarden worden genegeerd.

Request Body

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

Request Velden

Veld Type Verplicht Beschrijving
tenantId GUID Ja De tenant die bijgewerkt wordt
displayName string Nee Nieuwe weergavenaam (null = geen wijziging)
description string Nee Nieuwe beschrijving (null = geen wijziging, "" = leegmaken)
maxUsers integer Nee Maximaal aantal gebruikers (null = geen wijziging)
maxAnalyst integer Nee Maximaal aantal analisten (null = geen wijziging)
maxCases integer Nee Maximaal aantal cases (null = geen wijziging, -1 = onbeperkt)
timeZone string Nee Tijdzone-ID (null = geen wijziging)
isAcademic boolean Nee Academische vlag (null = geen wijziging)
preRelease boolean Nee Pre-release functies (null = geen wijziging)
isDisabled boolean Nee Tenant uitschakelen (null = geen wijziging)

Opmerking: De tenant name kan na aanmaak niet worden gewijzigd.

Response (200 OK)

{
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "name": "acme-corp",
  "displayName": "Acme Corporation Bijgewerkt",
  "message": "Tenant 'acme-corp' succesvol bijgewerkt",
  "isDisabled": false
}

Foutantwoorden

Not Found (404):

{
  "error": "Tenant met ID '12345678-1234-1234-1234-123456789012' niet gevonden"
}

Validatiefout (400):

{
  "error": "Validatie mislukt",
  "validationErrors": ["Weergavenaam mag niet langer zijn dan 255 tekens"]
}

Implementatie Voorbeelden

cURL

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

# Specifieke tenant ophalen op ID
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Tenant aanmaken
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
  }'

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

    def list_tenants(self, page=1, page_size=50):
        """Lijst van alle tenants in het systeem."""
        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):
        """Haal een specifieke tenant op via 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):
        """Maak een nieuwe tenant aan."""
        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):
        """Werk een bestaande tenant bij."""
        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()

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

# Alle tenants weergeven
result = manager.list_tenants()
print(f"Totaal aantal tenants: {result['totalCount']}")
for tenant in result['tenants']:
    print(f"- {tenant['displayName']} ({tenant['name']})")
    print(f"  Gebruikers: {tenant['userCount']}/{tenant['maxUserCount']}")

# Nieuwe tenant aanmaken
new_tenant = manager.create_tenant(
    name='test-tenant',
    display_name='Test Tenant',
    description='Aangemaakt via API',
    max_users=25,
    max_analyst=5,
    max_cases=50000
)
print(f"Tenant aangemaakt: {new_tenant['tenantId']}")

# Tenant limieten bijwerken
manager.update_tenant(
    tenant_id=new_tenant['tenantId'],
    max_users=50,
    max_analyst=10
)
print("Tenant limieten bijgewerkt")

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

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

// Tenants weergeven
const tenants = await manager.listTenants();
console.log(`Aantal gevonden tenants: ${tenants.totalCount}`);

// Tenant aanmaken
const newTenant = await manager.createTenant({
  name: 'new-tenant',
  displayName: 'Nieuwe Tenant',
  maxUsers: 50,
  maxAnalyst: 10,
  maxCases: 100000
});
console.log(`Aangemaakt: ${newTenant.tenantId}`);

// Tenant bijwerken
await manager.updateTenant(newTenant.tenantId, {
  displayName: 'Bijgewerkte Tenant Naam',
  maxUsers: 100
});

Beste Praktijken

  1. Global API Keys: Gebruik alleen global API keys voor tenantbeheer - deze hebben significante systeem-brede bevoegdheden
  2. Licentie Bewustzijn: Houd het aantal tenants in de gaten ten opzichte van licentiebeperkingen voordat u nieuwe tenants aanmaakt
  3. Capaciteitsplanning: Stel passende limieten in voor gebruikers en analisten op basis van verwachte gebruik
  4. Naamgevingsconventies: Gebruik consistente, kleine letters met koppeltekens voor tenantnamen