Gestion de Projet

Gérez les projets au sein des locataires mindzieStudio. Créez, récupérez, mettez à jour et supprimez des projets contenant des jeux de données, des investigations, des tableaux de bord et des workflows d'analyse.

Test de Connectivité

Ping Non Autorisé

GET /api/{tenantId}/project/unauthorized-ping

Point de terminaison de test ne nécessitant pas d'authentification. Utilisez-le pour vérifier la connectivité réseau.

Réponse

Ping Successful

Ping Authentifié

GET /api/{tenantId}/project/ping

Point de terminaison ping authentifié pour vérifier l'accès à l'API pour un locataire spécifique.

Réponse (200 OK)

Ping Successful (tenant id: {tenantId})

Lister Tous les Projets

GET /api/{tenantId}/project

Récupère une liste paginée de tous les projets auxquels l'utilisateur authentifié a accès dans le locataire spécifié.

Paramètres de Chemin

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

Paramètres de Requête

Paramètre Type Par défaut Description
page entier 1 Numéro de page pour la pagination
pageSize entier 50 Nombre d'éléments par page (max recommandé : 100)

Réponse (200 OK)

{
  "projects": [
    {
      "projectId": "87654321-4321-4321-4321-210987654321",
      "tenantId": "12345678-1234-1234-1234-123456789012",
      "projectName": "Purchase Order Analysis",
      "projectDescription": "Process mining analysis of P2P workflow",
      "dateCreated": "2024-01-15T10:30:00Z",
      "dateModified": "2024-01-20T14:45:00Z",
      "createdBy": "user@example.com",
      "modifiedBy": "user@example.com",
      "isActive": true,
      "datasetCount": 3,
      "investigationCount": 5,
      "dashboardCount": 2,
      "userCount": 8
    }
  ],
  "totalCount": 15,
  "page": 1,
  "pageSize": 50
}

Champs de l'Objet Projet

Champ Type Description
projectId GUID Identifiant unique du projet
tenantId GUID Locataire auquel appartient le projet
projectName string Nom affiché du projet
projectDescription string Description du projet
dateCreated datetime Date de création du projet
dateModified datetime Date de dernière modification du projet
createdBy string Utilisateur ayant créé le projet
modifiedBy string Utilisateur ayant modifié le projet pour la dernière fois
isActive boolean Indique si le projet est actif
datasetCount integer Nombre de jeux de données dans le projet
investigationCount integer Nombre d'investigations
dashboardCount integer Nombre de tableaux de bord
userCount integer Nombre d'utilisateurs ayant accès

Obtenir les Détails d'un Projet

GET /api/{tenantId}/project/{projectId}

Récupère les informations détaillées pour un projet spécifique.

Paramètres de Chemin

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

Réponse (200 OK)

Même structure que l'objet projet dans la réponse de liste.

Réponses d'Erreur

Non Trouvé (404) :

{
  "error": "Project not found with ID '{projectId}'. The project may have been deleted or the ID is incorrect.",
  "projectId": "87654321-4321-4321-4321-210987654321"
}

Obtenir le Résumé d'un Projet

GET /api/{tenantId}/project/{projectId}/summary

Récupère des statistiques agrégées et des métriques clés pour le projet.

Réponse (200 OK)

{
  "projectId": "87654321-4321-4321-4321-210987654321",
  "projectName": "Purchase Order Analysis",
  "projectDescription": "Process mining analysis of P2P workflow",
  "dateCreated": "2024-01-15T10:30:00Z",
  "dateModified": "2024-01-20T14:45:00Z",
  "statistics": {
    "totalDatasets": 3,
    "totalInvestigations": 5,
    "totalDashboards": 2,
    "totalNotebooks": 12,
    "totalUsers": 8
  }
}

Créer un Projet

POST /api/{tenantId}/project

Crée un nouveau projet dans le locataire spécifié.

Corps de la Requête

{
  "projectName": "New Analysis Project",
  "projectDescription": "Process mining analysis for procurement workflow"
}

Champs de la Requête

Champ Type Obligatoire Description
projectName string Oui Nom du projet (max 255 caractères)
projectDescription string Non Description (max 1000 caractères)

Réponse (201 Created)

Retourne l'objet projet créé (même structure que Get Project).

Réponses d'Erreur

Requête Incorrecte (400) :

{
  "error": "Validation failed",
  "validationErrors": ["Project name is required"]
}

Mettre à Jour un Projet

PUT /api/{tenantId}/project/{projectId}

Met à jour les propriétés d'un projet existant.

Paramètres de Chemin

Paramètre Type Description
tenantId GUID L'identifiant du locataire
projectId GUID L'identifiant du projet

Corps de la Requête

{
  "projectName": "Updated Project Name",
  "projectDescription": "Updated description",
  "isActive": true
}

Champs de la Requête

Champ Type Obligatoire Description
projectName string Oui Nouveau nom du projet
projectDescription string Non Nouvelle description
isActive boolean Non Activer/désactiver le projet

Réponse (200 OK)

Retourne l'objet projet mis à jour.


Supprimer un Projet

DELETE /api/{tenantId}/project/{projectId}

Supprime définitivement un projet et TOUTES les données associées.

ATTENTION : Il s'agit d'une opération DESTRUCTRICE qui NE PEUT PAS être annulée.

Suppression en Cascade Inclut

  • Tous les jeux de données du projet
  • Toutes les investigations et notebooks
  • Tous les tableaux de bord
  • Toutes les permissions des utilisateurs
  • Tous les fichiers stockés dans les blobs (journaux d'événements, pièces jointes)

Paramètres de Chemin

Paramètre Type Description
tenantId GUID L'identifiant du locataire
projectId GUID L'identifiant du projet

Réponse (200 OK)

{
  "message": "Project deleted successfully",
  "projectId": "87654321-4321-4321-4321-210987654321"
}

Exemples d'Implémentation

cURL

# Lister tous les projets
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Obtenir les détails d'un projet
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Créer un nouveau projet
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "Q4 Analysis",
    "projectDescription": "Quarterly procurement analysis"
  }'

# Mettre à jour un projet
curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "Q4 Analysis - Final",
    "projectDescription": "Updated description"
  }'

# Supprimer un projet (ATTENTION : Irréversible !)
curl -X DELETE "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Python

import requests

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

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

    def list_projects(self, page=1, page_size=50):
        """Lister tous les projets dans le locataire."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project'
        params = {'page': page, 'pageSize': page_size}
        response = requests.get(url, headers=self.headers, params=params)
        response.raise_for_status()
        return response.json()

    def get_project(self, project_id):
        """Obtenir les détails d'un projet."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def create_project(self, name, description=''):
        """Créer un nouveau projet."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project'
        payload = {
            'projectName': name,
            'projectDescription': description
        }
        response = requests.post(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_project(self, project_id, name=None, description=None, is_active=None):
        """Mettre à jour un projet existant."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        payload = {}
        if name:
            payload['projectName'] = name
        if description is not None:
            payload['projectDescription'] = description
        if is_active is not None:
            payload['isActive'] = is_active
        response = requests.put(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def delete_project(self, project_id):
        """Supprimer un projet (ATTENTION : Irréversible !)."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Utilisation
manager = ProjectManager('your-auth-token')

# Lister tous les projets
result = manager.list_projects()
print(f"Total projets : {result['totalCount']}")

for project in result['projects']:
    print(f"- {project['projectName']} : {project['datasetCount']} jeux de données")

# Créer un nouveau projet
new_project = manager.create_project(
    name='API Test Project',
    description='Créé via API'
)
print(f"Créé : {new_project['projectId']}")

JavaScript/Node.js

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

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

  async listProjects(page = 1, pageSize = 50) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project?page=${page}&pageSize=${pageSize}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Échec : ${response.status}`);
    return await response.json();
  }

  async getProject(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Échec : ${response.status}`);
    return await response.json();
  }

  async createProject(name, description = '') {
    const url = `${BASE_URL}/api/${TENANT_ID}/project`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify({ projectName: name, projectDescription: description })
    });
    if (!response.ok) throw new Error(`Échec : ${response.status}`);
    return await response.json();
  }

  async deleteProject(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers
    });
    if (!response.ok) throw new Error(`Échec : ${response.status}`);
    return await response.json();
  }
}

// Utilisation
const manager = new ProjectManager('your-auth-token');

const projects = await manager.listProjects();
console.log(`Trouvé ${projects.totalCount} projets`);