Gestión de Proyectos

Administre proyectos dentro de los tenants de mindzieStudio. Cree, recupere, actualice y elimine proyectos que contengan conjuntos de datos, investigaciones, paneles e flujos de trabajo de análisis.

Pruebas de Conectividad

Ping No Autorizado

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

Endpoint de prueba que no requiere autenticación. Úselo para verificar la conectividad de red.

Respuesta

Ping Successful

Ping Autenticado

GET /api/{tenantId}/project/ping

Endpoint de ping autenticado para verificar el acceso a la API para un tenant específico.

Respuesta (200 OK)

Ping Successful (tenant id: {tenantId})

Listar Todos los Proyectos

GET /api/{tenantId}/project

Recupera una lista paginada de todos los proyectos a los que el usuario autenticado tiene acceso dentro del tenant especificado.

Parámetros de Ruta

Parámetro Tipo Requerido Descripción
tenantId GUID El identificador del tenant

Parámetros de Consulta

Parámetro Tipo Predeterminado Descripción
page entero 1 Número de página para paginación
pageSize entero 50 Número de elementos por página (máximo recomendado: 100)

Respuesta (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
}

Campos del Objeto Proyecto

Campo Tipo Descripción
projectId GUID Identificador único del proyecto
tenantId GUID Tenant al que pertenece el proyecto
projectName string Nombre visible del proyecto
projectDescription string Descripción del proyecto
dateCreated datetime Fecha de creación del proyecto
dateModified datetime Fecha de última modificación del proyecto
createdBy string Usuario que creó el proyecto
modifiedBy string Usuario que modificó por última vez el proyecto
isActive boolean Indica si el proyecto está activo
datasetCount integer Número de conjuntos de datos en el proyecto
investigationCount integer Número de investigaciones
dashboardCount integer Número de paneles
userCount integer Número de usuarios con acceso

Obtener Detalles del Proyecto

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

Recupera información detallada de un proyecto específico.

Parámetros de Ruta

Parámetro Tipo Requerido Descripción
tenantId GUID El identificador del tenant
projectId GUID El identificador del proyecto

Respuesta (200 OK)

Estructura igual al objeto proyecto en la respuesta de lista.

Respuestas de Error

No Encontrado (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"
}

Obtener Resumen del Proyecto

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

Recupera estadísticas agregadas y métricas clave del proyecto.

Respuesta (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
  }
}

Crear Proyecto

POST /api/{tenantId}/project

Crea un nuevo proyecto en el tenant especificado.

Cuerpo de la Solicitud

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

Campos de la Solicitud

Campo Tipo Requerido Descripción
projectName string Nombre del proyecto (máx. 255 caracteres)
projectDescription string No Descripción (máx. 1000 caracteres)

Respuesta (201 Created)

Devuelve el objeto del proyecto creado (misma estructura que Obtener Proyecto).

Respuestas de Error

Solicitud Incorrecta (400):

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

Actualizar Proyecto

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

Actualiza las propiedades de un proyecto existente.

Parámetros de Ruta

Parámetro Tipo Descripción
tenantId GUID Identificador del tenant
projectId GUID Identificador del proyecto

Cuerpo de la Solicitud

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

Campos de la Solicitud

Campo Tipo Requerido Descripción
projectName string Nuevo nombre del proyecto
projectDescription string No Nueva descripción
isActive boolean No Habilitar/deshabilitar proyecto

Respuesta (200 OK)

Devuelve el objeto proyecto actualizado.


Eliminar Proyecto

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

Elimina permanentemente un proyecto y TODOS los datos asociados.

ADVERTENCIA: Esta es una operación DESTRUCTIVA que NO PUEDE deshacerse.

Eliminación en Cascada Incluye

  • Todos los conjuntos de datos en el proyecto
  • Todas las investigaciones y notebooks
  • Todos los paneles
  • Todos los permisos de usuario
  • Todos los archivos en almacenamiento blob (registros de eventos, adjuntos)

Parámetros de Ruta

Parámetro Tipo Descripción
tenantId GUID Identificador del tenant
projectId GUID Identificador del proyecto

Respuesta (200 OK)

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

Ejemplos de Implementación

cURL

# Listar todos los proyectos
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Obtener detalles del proyecto
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"

# Crear un nuevo proyecto
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"
  }'

# Actualizar un proyecto
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"
  }'

# Eliminar un proyecto (¡PRECAUCIÓN: Irreversible!)
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):
        """Lista todos los proyectos en el tenant."""
        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):
        """Obtiene detalles de un proyecto."""
        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=''):
        """Crea un nuevo proyecto."""
        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):
        """Actualiza un proyecto existente."""
        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):
        """Elimina un proyecto (¡PRECAUCIÓN: Irreversible!)."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

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

# Listar todos los proyectos
result = manager.list_projects()
print(f"Total de proyectos: {result['totalCount']}")

for project in result['projects']:
    print(f"- {project['projectName']}: {project['datasetCount']} conjuntos de datos")

# Crear un nuevo proyecto
new_project = manager.create_project(
    name='API Test Project',
    description='Created via API'
)
print(f"Creado: {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(`Failed: ${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(`Failed: ${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(`Failed: ${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(`Failed: ${response.status}`);
    return await response.json();
  }
}

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

const projects = await manager.listProjects();
console.log(`Se encontraron ${projects.totalCount} proyectos`);