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 extiendacore_external\external_api. - En
/admin/settings.php?section=externalservicesno 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()— aceptacourseid(int) yuserid(int).execute($courseid, $userid)— llama acourse_stats,student_statsyacademic_alerts, valida capacidad, retorna estructura serializada.execute_returns()— define la estructura de retorno conexternal_single_structureyexternal_multiple_structure.
db/upgrade.php
Bump de version del plugin para que Moodle registre las nuevas capacidades.
Referencias
- Spec de alcance: Definición de alcance integración IA–Moodle (docx)
- Documentacion del plugin: local_pccntr8203403_dashboard
- Patron de referencia en core:
public/blocks/classes/external/fetch_addable_blocks.php - Documentacion de funciones externas Moodle:
public/lib/externallib.php