Saltar al contenido principal

ADR-001: Capa de funciones externas para exponer datos del dashboard al agente IA

Estado: Aceptado | Fecha: 2026-06-09 | Autores: jcarroyos@gmail.com


Contexto

El plugin local_pccntr8203403_dashboard contiene toda la logica de negocio necesaria para el Scope 3 del proyecto (acceso de un agente IA externo al contexto academico del estudiante). Las clases course_stats, student_stats y academic_alerts estan implementadas, estables y con datos reales en produccion.

Sin embargo, el plugin no tiene capa de Web Services. Verificacion al 2026-06-09:

  • No existe db/services.php — ninguna funcion externa registrada.
  • No existe classes/external/ — ninguna clase que extienda core_external\external_api.
  • En /admin/settings.php?section=externalservices no hay nada que agregar porque Moodle solo lista funciones ya declaradas.

Como resultado, los datos de alertas, progreso y calificaciones son internamente accesibles para el tema y el bloque, pero no consultables desde fuera de Moodle (ni via REST, ni via SOAP, ni via token).

Lo que ya esta listo

La estructura de retorno de las funciones principales ya es limpia y serializable sin cambios:

// academic_alerts::get_active_alerts()
['code' => string, 'level' => 'leve'|'critico', 'motivational' => bool]

// course_stats::get_user_progress()
['completed' => int, 'total' => int, 'percentage' => float]

// course_stats::get_user_module_progress()
['name' => string, 'pct' => int, 'complete' => bool, 'activities' => string]

Todos los metodos relevantes son public static sin dependencias de sesion de usuario web, lo que facilita su uso desde una funcion externa.


Decision

Implementar una capa de funciones externas Moodle dentro de local_pccntr8203403_dashboard (sin crear un plugin separado) que envuelva los datos del dashboard y los exponga via REST con autenticacion por token y verificacion de capacidades.

Se elige extender el plugin existente (no crear local_pccntr8203403_api) para mantener la cohesion: la logica de datos y su exposicion externa viven en el mismo componente.


Lo que hay que construir

db/services.php

Registrar la funcion externa principal:

$functions = [
'local_pccntr8203403_dashboard_get_learner_context' => [
'classname' => 'local_pccntr8203403_dashboard\external\get_learner_context',
'methodname' => 'execute',
'description' => 'Returns full learner context for a course: progress, grades, alerts.',
'type' => 'read',
'capabilities'=> 'local/pccntr8203403_dashboard:viewlearnercontext',
'ajax' => false,
'services' => [],
],
];

db/access.php

Capacidad que el token debe tener para llamar a la funcion:

$capabilities = [
'local/pccntr8203403_dashboard:viewlearnercontext' => [
'riskbitmask' => RISK_PERSONAL,
'captype' => 'read',
'contextlevel'=> CONTEXT_COURSE,
'archetypes' => ['manager' => CAP_ALLOW],
],
];

classes/external/get_learner_context.php

Clase que extiende core_external\external_api:

  • execute_parameters() — acepta courseid (int) y userid (int).
  • execute($courseid, $userid) — llama a course_stats, student_stats y academic_alerts, valida capacidad, retorna estructura serializada.
  • execute_returns() — define la estructura de retorno con external_single_structure y external_multiple_structure.

db/upgrade.php

Bump de version del plugin para que Moodle registre las nuevas capacidades.


Referencias