Gestion des Modèles

Opérations CRUD complètes pour gérer les modèles de carnet. Toutes les endpoints nécessitent une clé API globale.


Liste des Modèles Globaux

GET /api/templates

Retourne tous les modèles globaux disponibles pour tous les locataires.

Réponse (200 OK)

{
  "templates": [
    {
      "templateId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "name": "Process Discovery",
      "description": "Flux de travail standard de découverte des processus",
      "category": "Templates",
      "processName": "Order to Cash",
      "tenantId": null,
      "isGlobal": true,
      "hasThumbnail": true,
      "autoAddedDefaultSortOrder": 100,
      "dateModified": "2024-01-15T10:30:00Z"
    }
  ],
  "totalCount": 1
}

Liste des Modèles pour un Locataire

GET /api/templates/tenant/{tenantId}

Retourne tous les modèles disponibles pour un locataire spécifique, incluant les modèles globaux et spécifiques au locataire.

Paramètres de chemin

Paramètre Type Obligatoire Description
tenantId GUID Oui L'identifiant du locataire

Réponse (200 OK)

{
  "templates": [
    {
      "templateId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "name": "Process Discovery",
      "description": "Flux de travail standard de découverte des processus",
      "category": "Templates",
      "processName": "Order to Cash",
      "tenantId": null,
      "isGlobal": true,
      "hasThumbnail": true,
      "autoAddedDefaultSortOrder": 100,
      "dateCreated": "2024-01-01T00:00:00Z",
      "dateModified": "2024-01-15T10:30:00Z",
      "createdByName": "System",
      "modifiedByName": "System"
    },
    {
      "templateId": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
      "name": "Custom Analysis",
      "description": "Analyse personnalisée spécifique au locataire",
      "category": "Custom",
      "processName": null,
      "tenantId": "12345678-1234-1234-1234-123456789012",
      "isGlobal": false,
      "hasThumbnail": false,
      "autoAddedDefaultSortOrder": 0,
      "dateCreated": "2024-02-01T09:00:00Z",
      "dateModified": "2024-02-15T14:30:00Z",
      "createdByName": "API",
      "modifiedByName": "API"
    }
  ],
  "totalCount": 2
}

Liste des Modèles par Catégorie

GET /api/templates/category/{category}

Retourne les modèles filtrés par catégorie.

Paramètres de chemin

Paramètre Type Obligatoire Description
category string Oui Nom de la catégorie : Templates, Custom, ou BaseKnowledge

Paramètres de requête

Paramètre Type Obligatoire Description
tenantId GUID Non Filtrer par les modèles d'un locataire spécifique

Exemple

# Obtenir tous les modèles personnalisés
curl -X GET "https://your-mindzie-instance.com/api/templates/category/Custom" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Obtenir les modèles personnalisés pour un locataire spécifique
curl -X GET "https://your-mindzie-instance.com/api/templates/category/Custom?tenantId=12345678-1234-1234-1234-123456789012" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

Obtenir les Détails d'un Modèle

GET /api/templates/{templateId}

Retourne les détails complets du modèle, y compris le texte de configuration MCL.

Paramètres de chemin

Paramètre Type Obligatoire Description
templateId GUID Oui L'identifiant du modèle

Réponse (200 OK)

{
  "templateId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  "name": "Process Discovery",
  "description": "Flux de travail standard de découverte des processus avec analyse des variantes",
  "category": "Templates",
  "processName": "Order to Cash",
  "mclText": "// Configuration MCL définissant les blocs et paramètres du carnet\n{\n  \"blocks\": [...],\n  \"settings\": {...}\n}",
  "tenantId": null,
  "isGlobal": true,
  "hasThumbnail": true,
  "autoAddedDefaultSortOrder": 100,
  "originatingNotebookId": null,
  "dateCreated": "2024-01-01T00:00:00Z",
  "dateModified": "2024-01-15T10:30:00Z",
  "createdBy": null,
  "createdByName": "System",
  "modifiedBy": null,
  "modifiedByName": "System"
}

Champs de la réponse

Champ Type Description
templateId GUID Identifiant unique
name string Nom du modèle
description string Description du modèle
category string Catégorie (Templates, Custom, BaseKnowledge)
processName string Nom du processus associé
mclText string Texte de configuration MCL
tenantId GUID ID du locataire (null pour modèles globaux)
isGlobal boolean Vrai si modèle global
hasThumbnail boolean Vrai si une miniature existe
autoAddedDefaultSortOrder integer Ordre d'affichage
originatingNotebookId GUID Carnet source si créé à partir d'un carnet existant
dateCreated datetime Date de création
dateModified datetime Date de dernière modification
createdBy GUID ID utilisateur créateur
createdByName string Nom utilisateur créateur
modifiedBy GUID ID utilisateur modificateur
modifiedByName string Nom utilisateur modificateur

Réponses d'erreur

Non trouvé (404)

{
  "error": "Template with ID 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' not found"
}

Obtenir la Miniature du Modèle

GET /api/templates/{templateId}/thumbnail

Retourne l'image miniature pour un modèle.

Paramètres de chemin

Paramètre Type Obligatoire Description
templateId GUID Oui L'identifiant du modèle

Réponse (200 OK)

Retourne les données d'image JPEG avec Content-Type: image/jpeg.

Réponses d'erreur

Non trouvé (404)

{
  "error": "Thumbnail not found for template 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'"
}

Créer un Modèle

POST /api/templates/tenant/{tenantId}

Crée un nouveau modèle spécifique à un locataire. Les modèles globaux ne peuvent pas être créés via l'API.

Paramètres de chemin

Paramètre Type Obligatoire Description
tenantId GUID Oui L'identifiant du locataire

Corps de la requête

{
  "name": "Custom Analysis Template",
  "description": "Flux de travail d'analyse personnalisée pour le reporting mensuel",
  "mclText": "// Texte de configuration MCL",
  "category": "Custom",
  "processName": "Monthly Report",
  "isGlobal": false,
  "autoAddedDefaultSortOrder": 0
}

Champs de la requête

Champ Type Obligatoire Description
name string Oui Nom du modèle (doit être unique)
description string Non Description du modèle
mclText string Oui Texte de configuration MCL
category string Non Catégorie (par défaut : "Custom")
processName string Non Nom du processus associé
isGlobal boolean Non Doit être faux pour création via API
autoAddedDefaultSortOrder integer Non Ordre d'affichage

Réponse (201 Created)

{
  "templateId": "cccccccc-dddd-eeee-ffff-000000000000",
  "name": "Custom Analysis Template",
  "description": "Flux de travail d'analyse personnalisée pour le reporting mensuel",
  "category": "Custom",
  "processName": "Monthly Report",
  "mclText": "// Texte de configuration MCL",
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "isGlobal": false,
  "hasThumbnail": false,
  "autoAddedDefaultSortOrder": 0,
  "dateCreated": "2024-03-01T10:00:00Z",
  "dateModified": "2024-03-01T10:00:00Z",
  "createdByName": "API"
}

Réponses d'erreur

Requête incorrecte (400) - Échec de validation

{
  "error": "Validation failed",
  "validationErrors": ["Name is required", "MclText is required"]
}

Conflit (409) - Nom dupliqué

{
  "error": "A template with this name already exists"
}

Mettre à Jour un Modèle

PUT /api/templates/{templateId}

Met à jour un modèle spécifique à un locataire. Les modèles globaux ne peuvent pas être mis à jour via l'API.

Paramètres de chemin

Paramètre Type Obligatoire Description
templateId GUID Oui L'identifiant du modèle

Corps de la requête

{
  "name": "Updated Template Name",
  "description": "Updated description",
  "mclText": "// Updated MCL configuration",
  "category": "Custom",
  "processName": "Updated Process",
  "autoAddedDefaultSortOrder": 10
}

Tous les champs sont optionnels - seuls les champs fournis seront mis à jour.

Réponse (200 OK)

Retourne les détails du modèle mis à jour.

Réponses d'erreur

Requête incorrecte (400) - Modèle global

{
  "error": "Cannot update global templates through the API"
}

Non trouvé (404)

{
  "error": "Template not found"
}

Conflit (409) - Nom dupliqué

{
  "error": "A template with this name already exists"
}

Supprimer un Modèle

DELETE /api/templates/{templateId}

Supprime un modèle spécifique à un locataire. Les modèles globaux ne peuvent pas être supprimés via l'API.

Paramètres de chemin

Paramètre Type Obligatoire Description
templateId GUID Oui L'identifiant du modèle

Réponse (200 OK)

{
  "message": "Template deleted successfully"
}

Réponses d'erreur

Requête incorrecte (400) - Modèle global

{
  "error": "Cannot delete global templates"
}

Non trouvé (404)

{
  "error": "Template not found"
}

Exemples d'Implémentation

cURL

# Lister tous les modèles pour un locataire
curl -X GET "https://your-mindzie-instance.com/api/templates/tenant/12345678-1234-1234-1234-123456789012" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Obtenir les détails d'un modèle
curl -X GET "https://your-mindzie-instance.com/api/templates/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

# Créer un modèle
curl -X POST "https://your-mindzie-instance.com/api/templates/tenant/12345678-1234-1234-1234-123456789012" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Custom Template",
    "description": "Flux de travail personnalisé",
    "mclText": "// Configuration MCL",
    "category": "Custom"
  }'

# Mettre à jour un modèle
curl -X PUT "https://your-mindzie-instance.com/api/templates/cccccccc-dddd-eeee-ffff-000000000000" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Updated Name"}'

# Supprimer un modèle
curl -X DELETE "https://your-mindzie-instance.com/api/templates/cccccccc-dddd-eeee-ffff-000000000000" \
  -H "Authorization: Bearer YOUR_GLOBAL_API_KEY"

Python

import requests

BASE_URL = 'https://your-mindzie-instance.com'
TENANT_ID = '12345678-1234-1234-1234-123456789012'

class TemplateManager:
    def __init__(self, global_api_key):
        self.headers = {
            'Authorization': f'Bearer {global_api_key}',
            'Content-Type': 'application/json'
        }

    def list_templates(self, tenant_id=None):
        """Lister les modèles, filtrés optionnellement par locataire."""
        if tenant_id:
            url = f'{BASE_URL}/api/templates/tenant/{tenant_id}'
        else:
            url = f'{BASE_URL}/api/templates'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def get_template(self, template_id):
        """Obtenir les détails du modèle y compris le texte MCL."""
        url = f'{BASE_URL}/api/templates/{template_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def create_template(self, tenant_id, name, mcl_text, description=None, category='Custom'):
        """Créer un nouveau modèle spécifique au locataire."""
        url = f'{BASE_URL}/api/templates/tenant/{tenant_id}'
        data = {
            'name': name,
            'mclText': mcl_text,
            'description': description,
            'category': category
        }
        response = requests.post(url, json=data, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_template(self, template_id, **kwargs):
        """Mettre à jour un modèle. Passer uniquement les champs à modifier."""
        url = f'{BASE_URL}/api/templates/{template_id}'
        response = requests.put(url, json=kwargs, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def delete_template(self, template_id):
        """Supprimer un modèle spécifique au locataire."""
        url = f'{BASE_URL}/api/templates/{template_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Utilisation
manager = TemplateManager('your-global-api-key')

# Lister les modèles
templates = manager.list_templates(TENANT_ID)
print(f"Nombre de modèles trouvés : {templates['totalCount']}")

for t in templates['templates']:
    print(f"  - {t['name']} ({'Global' if t['isGlobal'] else 'Locataire'})")

# Créer un modèle
new_template = manager.create_template(
    tenant_id=TENANT_ID,
    name='My Analysis Template',
    mcl_text='// Configuration MCL ici',
    description='Flux personnalisé'
)
print(f"Modèle créé : {new_template['templateId']}")

# Mettre à jour le modèle
updated = manager.update_template(
    new_template['templateId'],
    name='Renamed Template'
)

# Supprimer le modèle
manager.delete_template(new_template['templateId'])
print("Modèle supprimé")

JavaScript/Node.js

const BASE_URL = 'https://your-mindzie-instance.com';
const TENANT_ID = '12345678-1234-1234-1234-123456789012';

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

  async listTemplates(tenantId = null) {
    const url = tenantId
      ? `${BASE_URL}/api/templates/tenant/${tenantId}`
      : `${BASE_URL}/api/templates`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return response.json();
  }

  async getTemplate(templateId) {
    const url = `${BASE_URL}/api/templates/${templateId}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return response.json();
  }

  async createTemplate(tenantId, name, mclText, description = null, category = 'Custom') {
    const url = `${BASE_URL}/api/templates/tenant/${tenantId}`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify({ name, mclText, description, category })
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return response.json();
  }

  async updateTemplate(templateId, updates) {
    const url = `${BASE_URL}/api/templates/${templateId}`;
    const response = await fetch(url, {
      method: 'PUT',
      headers: this.headers,
      body: JSON.stringify(updates)
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return response.json();
  }

  async deleteTemplate(templateId) {
    const url = `${BASE_URL}/api/templates/${templateId}`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return response.json();
  }
}

// Utilisation
const manager = new TemplateManager('your-global-api-key');

// Lister les modèles
const templates = await manager.listTemplates(TENANT_ID);
console.log(`Nombre de modèles trouvés : ${templates.totalCount}`);

// Créer un modèle
const newTemplate = await manager.createTemplate(
  TENANT_ID,
  'My Analysis Template',
  '// Configuration MCL',
  'Flux personnalisé'
);
console.log(`Créé : ${newTemplate.templateId}`);

// Supprimer le modèle
await manager.deleteTemplate(newTemplate.templateId);

Bonnes Pratiques

  1. Utiliser des clés API globales : Les opérations sur les modèles requièrent des clés API globales
  2. Noms uniques : Les noms des modèles doivent être uniques dans leur périmètre
  3. Texte MCL : Stocker la configuration MCL complète pour des carnets reproductibles
  4. Catégories : Utiliser des catégories standards pour l'organisation
  5. Miniatures : Les modèles créés via API n'auront pas de miniature automatiquement