Saltar al contenido principal

MIH API (Guía del Desarrollador)

La MIH API permite a otros plugins de Moodle despachar eventos o realizar peticiones a servicios registrados sin preocuparse del transporte subyacente, la autenticación o los patrones de resiliencia.

Concepto

En lugar de usar curl o guzzle directamente, usas la fachada mih. Esto asegura que tu petición sea registrada, monitoreada y reintentada automáticamente.

Uso

1. Petición Estática

La forma más simple de hacer una petición.

use local_integrationhub\mih;

try {
$response = mih::request('slug-mi-servicio', '/api/users', ['id' => 123], 'POST');

if ($response->is_ok()) {
$data = $response->json();
// ...
}
} catch (\moodle_exception $e) {
// Manejar servicio no encontrado o circuit breaker abierto.
}

2. Interfaz Fluida (Recomendado)

Una forma más legible de construir peticiones.

use local_integrationhub\mih;

$response = mih::send('slug-mi-servicio')
->to('/api/users')
->with(['id' => 123])
->dispatch();

Valor de Retorno

Devuelve un objeto \local_integrationhub\mih_response.


El Objeto mih_response

Propiedades

PropiedadTipoDescripción
$successbooltrue si la petición se completó exitosamente (HTTP 2xx, o publicación AMQP exitosa)
$httpstatusint|nullCódigo de respuesta HTTP. null para AMQP.
$bodystring|nullCuerpo de respuesta crudo como string. null si no hubo cuerpo.
$errorstring|nullMensaje de error legible. null en éxito.
$latencymsintTiempo total desde inicio de petición hasta respuesta, en milisegundos. Incluye todos los delays de reintento.
$attemptsintNúmero total de intentos realizados (1 = sin reintentos necesarios).

Métodos

is_ok(): bool

Devuelve true si $success === true.

json(bool $assoc = true): mixed

Decodifica $body como JSON. $assoc = true (por defecto): devuelve array asociativo. $assoc = false: devuelve stdClass.


Ejemplos de Uso

Petición POST Básica

$response = \local_integrationhub\mih::request(
'mi-api',
'/api/v1/eventos',
[
'tipo' => 'usuario.login',
'user_id' => $USER->id,
'tiempo' => time(),
],
'POST'
);

if ($response->is_ok()) {
$resultado = $response->json();
} else {
debugging("Integración fallida: {$response->error} (HTTP {$response->httpstatus})");
}

Publicar en AMQP

// El endpoint actúa como routing key
$response = \local_integrationhub\mih::request(
'rabbitmq-prod',
'events.course.completed',
[
'user_id' => $userid,
'course_id' => $courseid,
'timestamp' => time(),
]
// El método se ignora para AMQP
);

Llamada SOAP

// El endpoint es el nombre del método SOAP
$response = \local_integrationhub\mih::request(
'erp-legado',
'SincronizarUsuario',
[
'UserId' => $userid,
'NombreCompleto' => fullname($user),
'Email' => $user->email,
]
);

Patrón Completo de Manejo de Errores

function mi_plugin_sincronizar_usuario(int $userid): bool {
global $DB;

$user = $DB->get_record('user', ['id' => $userid], '*', MUST_EXIST);

try {
$response = \local_integrationhub\mih::request(
'api-sincronizacion',
'/usuarios',
[
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
],
'POST'
);

if ($response->is_ok()) {
debugging("Usuario {$userid} sincronizado. Latencia: {$response->latencyms}ms");
return true;
}

debugging("Fallo de sincronización: HTTP {$response->httpstatus} — {$response->error}");
return false;

} catch (\moodle_exception $e) {
// Servicio no encontrado, desactivado o circuito abierto
debugging("Error de Integration Hub: " . $e->getMessage(), DEBUG_DEVELOPER);
return false;
}
}

Uso de MIH en Tareas Programadas

La API MIH funciona dentro de tareas programadas y adhoc de Moodle:

class mi_plugin_tarea_sync extends \core\task\scheduled_task {

public function get_name(): string {
return 'Sincronizar usuarios con CRM externo';
}

public function execute(): void {
global $DB;

$usuarios = $DB->get_records('user', ['deleted' => 0, 'suspended' => 0]);

foreach ($usuarios as $usuario) {
try {
$response = \local_integrationhub\mih::request(
'crm-api',
'/sync/usuarios',
['id' => $usuario->id, 'email' => $usuario->email],
'POST'
);

if (!$response->is_ok()) {
mtrace("Fallo al sincronizar usuario {$usuario->id}: {$response->error}");
}
} catch (\moodle_exception $e) {
mtrace("Error MIH para usuario {$usuario->id}: " . $e->getMessage());
// Continuar con el siguiente usuario
}
}
}
}