Gestión de Acciones

Operaciones CRUD completas para gestionar acciones en tu proyecto mindzieStudio. Las acciones son componentes del flujo de trabajo que se pueden ejecutar para realizar tareas automatizadas.


Endpoints de API

Método Endpoint Descripción
GET /api/{tenantId}/{projectId}/action Listar todas las acciones
GET /api/{tenantId}/{projectId}/action/{actionId} Obtener detalles de una acción
POST /api/{tenantId}/{projectId}/action Crear acción
PUT /api/{tenantId}/{projectId}/action/{actionId} Actualizar acción
DELETE /api/{tenantId}/{projectId}/action/{actionId} Eliminar acción
POST /api/{tenantId}/{projectId}/action/{actionId}/enable Habilitar acción
POST /api/{tenantId}/{projectId}/action/{actionId}/disable Deshabilitar acción

Listar Todas las Acciones

GET /api/{tenantId}/{projectId}/action

Recuperar todas las acciones configuradas para un proyecto.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador de tu tenant
projectId GUID Identificador de tu proyecto

Respuesta (200 OK)

{
  "actions": [
    {
      "actionId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "projectId": "87654321-4321-4321-4321-210987654321",
      "name": "Daily Data Refresh",
      "description": "Refreshes data from source systems daily",
      "isEnabled": true,
      "maxRunTime": 3600,
      "actionStatus": "Idle",
      "nextRunTime": "2024-01-16T06:00:00Z",
      "lastRunTime": "2024-01-15T06:00:00Z",
      "lastRunResult": "Success",
      "dateCreated": "2024-01-01T10:00:00Z",
      "dateModified": "2024-01-15T14:30:00Z",
      "createdBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "modifiedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "triggers": [...],
      "steps": [...]
    }
  ],
  "totalCount": 1
}

Obtener Detalles de una Acción

GET /api/{tenantId}/{projectId}/action/{actionId}

Recuperar información detallada sobre una acción específica.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador de tu tenant
projectId GUID Identificador de tu proyecto
actionId GUID Acción a recuperar

Respuesta (200 OK)

{
  "actionId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  "projectId": "87654321-4321-4321-4321-210987654321",
  "name": "Daily Data Refresh",
  "description": "Refreshes data from source systems daily",
  "isEnabled": true,
  "maxRunTime": 3600,
  "actionStatus": "Idle",
  "nextRunTime": "2024-01-16T06:00:00Z",
  "lastRunTime": "2024-01-15T06:00:00Z",
  "lastRunResult": "Success",
  "dateCreated": "2024-01-01T10:00:00Z",
  "dateModified": "2024-01-15T14:30:00Z",
  "createdBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "modifiedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "triggers": [
    {
      "triggerId": "11111111-1111-1111-1111-111111111111",
      "actionId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "triggerType": "DailyScheduler",
      "settings": "{}",
      "frequency": 1,
      "eventName": null,
      "startDate": "2024-01-01",
      "dateCreated": "2024-01-01T10:00:00Z"
    }
  ],
  "steps": [
    {
      "stepId": "22222222-2222-2222-2222-222222222222",
      "actionId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "stepNumber": 1,
      "stepType": "Python",
      "description": "Execute data refresh script",
      "settings": "{\"script\": \"refresh_data.py\"}",
      "dateCreated": "2024-01-01T10:00:00Z"
    }
  ]
}

Campos de la Respuesta

Campo Tipo Descripción
actionId GUID Identificador único de la acción
projectId GUID Proyecto al que pertenece la acción
name string Nombre para mostrar
description string Descripción de la acción
isEnabled boolean Si la acción está habilitada
maxRunTime integer Tiempo máximo de ejecución en segundos
actionStatus string Estado actual (Idle, Running, etc.)
nextRunTime datetime Próxima ejecución programada
lastRunTime datetime Última hora de ejecución
lastRunResult string Resultado de la última ejecución
triggers array Configuraciones de disparadores
steps array Definiciones de los pasos de la acción

Crear Acción

POST /api/{tenantId}/{projectId}/action

Crear una nueva acción en el proyecto.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador de tu tenant
projectId GUID Identificador de tu proyecto

Cuerpo de la Solicitud

{
  "name": "Weekly Report",
  "description": "Generate weekly analysis report",
  "isEnabled": true,
  "maxRunTime": 1800,
  "steps": [
    {
      "stepNumber": 1,
      "stepType": "Python",
      "description": "Generate report",
      "settings": "{\"script\": \"generate_report.py\"}"
    },
    {
      "stepNumber": 2,
      "stepType": "Email",
      "description": "Send report via email",
      "settings": "{\"recipients\": [\"team@company.com\"]}"
    }
  ],
  "triggers": [
    {
      "triggerType": "WeeklyScheduler",
      "frequency": 1,
      "startDate": "2024-01-08"
    }
  ]
}

Campos de la Solicitud

Campo Tipo Obligatorio Descripción
name string Nombre de la acción (debe ser único en el proyecto)
description string No Descripción de la acción
isEnabled boolean No Si la acción está habilitada (por defecto: true)
maxRunTime integer No Tiempo máximo de ejecución en segundos (por defecto: 3600)
steps array Se requiere al menos un paso
triggers array No Configuraciones opcionales de disparadores

Objeto Paso

Campo Tipo Obligatorio Descripción
stepNumber integer No Orden de ejecución (se asigna automáticamente si no se proporciona)
stepType string Tipo: Python, Email, Webhook, etc.
description string No Descripción del paso
settings string Configuración JSON para el paso

Objeto Disparador

Campo Tipo Obligatorio Descripción
triggerType string Tipo: HourlyScheduler, DailyScheduler, WeeklyScheduler, MonthlyScheduler, EventTrigger
frequency integer No Multiplicador de frecuencia
startDate date No Cuándo iniciar la programación
eventName string No Nombre del evento (para EventTrigger)
settings string No Configuraciones adicionales del disparador

Respuesta (201 Created)

Devuelve la acción creada con los IDs asignados.

Respuestas de Error

Conflicto (409) - Nombre duplicado

{
  "Error": "An action with this name already exists in the project"
}

Actualizar Acción

PUT /api/{tenantId}/{projectId}/action/{actionId}

Actualizar una acción existente.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador de tu tenant
projectId GUID Identificador de tu proyecto
actionId GUID Acción a actualizar

Cuerpo de la Solicitud

{
  "name": "Updated Weekly Report",
  "description": "Updated description",
  "isEnabled": true,
  "maxRunTime": 2400,
  "steps": [
    {
      "stepId": "22222222-2222-2222-2222-222222222222",
      "stepNumber": 1,
      "stepType": "Python",
      "description": "Updated step",
      "settings": "{\"script\": \"updated_report.py\"}"
    }
  ],
  "triggers": [
    {
      "triggerId": "11111111-1111-1111-1111-111111111111",
      "triggerType": "DailyScheduler",
      "frequency": 1,
      "startDate": "2024-02-01"
    }
  ]
}

Todos los campos son opcionales - solo se actualizarán los campos proporcionados.

Respuesta (200 OK)

Devuelve la acción actualizada.


Eliminar Acción

DELETE /api/{tenantId}/{projectId}/action/{actionId}

Eliminar una acción permanentemente.

Parámetros de Ruta

Parámetro Tipo Obligatorio Descripción
tenantId GUID Identificador de tu tenant
projectId GUID Identificador de tu proyecto
actionId GUID Acción a eliminar

Respuesta (204 No Content)

Respuesta vacía en caso de éxito.


Habilitar Acción

POST /api/{tenantId}/{projectId}/action/{actionId}/enable

Habilitar una acción deshabilitada.

Respuesta (200 OK)

Devuelve la acción actualizada con isEnabled: true.


Deshabilitar Acción

POST /api/{tenantId}/{projectId}/action/{actionId}/disable

Deshabilitar una acción.

Respuesta (200 OK)

Devuelve la acción actualizada con isEnabled: false.


Ejemplos de Implementación

cURL

# Listar todas las acciones
curl -X GET "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/action" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Crear una acción
curl -X POST "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/action" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Daily Report",
    "description": "Generate daily report",
    "isEnabled": true,
    "steps": [
      {
        "stepNumber": 1,
        "stepType": "Python",
        "description": "Run report script",
        "settings": "{\"script\": \"daily_report.py\"}"
      }
    ],
    "triggers": [
      {
        "triggerType": "DailyScheduler",
        "frequency": 1,
        "startDate": "2024-01-15"
      }
    ]
  }'

# Actualizar una acción
curl -X PUT "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/action/{actionId}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Updated Daily Report"}'

# Eliminar una acción
curl -X DELETE "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/action/{actionId}" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Habilitar/Deshabilitar acción
curl -X POST "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/action/{actionId}/enable" \
  -H "Authorization: Bearer YOUR_API_KEY"

curl -X POST "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/action/{actionId}/disable" \
  -H "Authorization: Bearer YOUR_API_KEY"

Python

import requests

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

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

    def list_actions(self):
        """Listar todas las acciones."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def get_action(self, action_id):
        """Obtener detalles de una acción."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action/{action_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def create_action(self, name, steps, description=None, triggers=None):
        """Crear una nueva acción."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action'
        data = {
            'name': name,
            'description': description,
            'isEnabled': True,
            'steps': steps,
            'triggers': triggers or []
        }
        response = requests.post(url, json=data, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_action(self, action_id, **kwargs):
        """Actualizar una acción."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action/{action_id}'
        response = requests.put(url, json=kwargs, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def delete_action(self, action_id):
        """Eliminar una acción."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action/{action_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()

    def enable_action(self, action_id):
        """Habilitar una acción."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action/{action_id}/enable'
        response = requests.post(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def disable_action(self, action_id):
        """Deshabilitar una acción."""
        url = f'{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/action/{action_id}/disable'
        response = requests.post(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Uso
manager = ActionManager('your-api-key')

# Crear una acción
action = manager.create_action(
    name='Daily Report',
    description='Generate daily analysis report',
    steps=[
        {
            'stepNumber': 1,
            'stepType': 'Python',
            'description': 'Generate report',
            'settings': '{"script": "daily_report.py"}'
        }
    ],
    triggers=[
        {
            'triggerType': 'DailyScheduler',
            'frequency': 1,
            'startDate': '2024-01-15'
        }
    ]
)
print(f"Acción creada: {action['actionId']}")

# Deshabilitar y luego habilitar
manager.disable_action(action['actionId'])
print("Acción deshabilitada")

manager.enable_action(action['actionId'])
print("Acción habilitada")

# Actualizar la acción
updated = manager.update_action(action['actionId'], name='Updated Daily Report')

# Eliminar la acción
manager.delete_action(action['actionId'])
print("Acción eliminada")

JavaScript/Node.js

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

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

  async listActions() {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/action`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Falló: ${response.status}`);
    return response.json();
  }

  async createAction(name, steps, description = null, triggers = []) {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/action`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify({ name, description, isEnabled: true, steps, triggers })
    });
    if (!response.ok) throw new Error(`Falló: ${response.status}`);
    return response.json();
  }

  async updateAction(actionId, updates) {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/action/${actionId}`;
    const response = await fetch(url, {
      method: 'PUT',
      headers: this.headers,
      body: JSON.stringify(updates)
    });
    if (!response.ok) throw new Error(`Falló: ${response.status}`);
    return response.json();
  }

  async deleteAction(actionId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/action/${actionId}`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers
    });
    if (!response.ok) throw new Error(`Falló: ${response.status}`);
  }

  async enableAction(actionId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/action/${actionId}/enable`;
    const response = await fetch(url, { method: 'POST', headers: this.headers });
    if (!response.ok) throw new Error(`Falló: ${response.status}`);
    return response.json();
  }

  async disableAction(actionId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/${PROJECT_ID}/action/${actionId}/disable`;
    const response = await fetch(url, { method: 'POST', headers: this.headers });
    if (!response.ok) throw new Error(`Falló: ${response.status}`);
    return response.json();
  }
}

// Uso
const manager = new ActionManager('your-api-key');

// Crear acción
const action = await manager.createAction(
  'Daily Report',
  [{ stepNumber: 1, stepType: 'Python', description: 'Run script', settings: '{}' }],
  'Generate daily report',
  [{ triggerType: 'DailyScheduler', frequency: 1, startDate: '2024-01-15' }]
);

// Alternar habilitar/deshabilitar
await manager.disableAction(action.actionId);
await manager.enableAction(action.actionId);

// Eliminar
await manager.deleteAction(action.actionId);

Mejores Prácticas

  1. Nombres Únicos: Los nombres de las acciones deben ser únicos dentro de un proyecto.
  2. Orden de Pasos: Los pasos se ejecutan en el orden de stepNumber.
  3. Habilitar/Deshabilitar: Usa los endpoints de habilitar/deshabilitar en lugar de eliminar y recrear.
  4. Disparadores: Usa tipos de disparadores apropiados para tus necesidades de programación.
  5. MaxRunTime: Establece tiempos límite razonables para evitar que las acciones se ejecuten sin control.