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
- Utiliser des clés API globales : Les opérations sur les modèles requièrent des clés API globales
- Noms uniques : Les noms des modèles doivent être uniques dans leur périmètre
- Texte MCL : Stocker la configuration MCL complète pour des carnets reproductibles
- Catégories : Utiliser des catégories standards pour l'organisation
- Miniatures : Les modèles créés via API n'auront pas de miniature automatiquement