Herramientas

Un puente entre plataformas de aprendizaje

Migrar y sincronizar usuarios y cursos entre una plataforma vieja y una nueva: integraciones, scripts y cuidado con datos reales.

Un puente entre plataformas de aprendizaje

Tenía varios WordPress con LearnDash —cursos en varias instalaciones— y había que llevarlo todo a un único Moodle. No era una migración puntual: además de migrar, había que seguir sincronizando. De esa necesidad salió un puente entre las dos plataformas, y el proyecto más serio que he hecho por cuenta propia.

El problema de verdad no eran los cursos

Migrar cursos es mecánico. El problema eran las personas: el mismo alumno existía en varias instalaciones con el mismo correo, y si no lo tratabas bien acababas duplicando cuentas o, peor, perdiendo el progreso que ya tenía. Por eso la decisión central del proyecto es que el correo es la identidad única, y la deduplicación se hace en un sistema canónico propio: el WordPress es el origen de datos, el puente es el sistema canónico, y el Moodle es la plataforma final de formación.

Cómo está hecho

Un plugin propio de WordPress expone los datos de LearnDash por REST: cursos, usuarios, matrículas y progreso, con paginación y filtros por fecha para la sincronización incremental. Las matrículas se detectan tres veces para no perder ninguna: las órdenes de WooCommerce, las nativas de LearnDash y la tabla de actividad. En medio, un panel de control con FastAPI, React y PostgreSQL, y Celery con Redis para que las operaciones largas corran en segundo plano: la API nunca se bloquea, y cada ejecución queda registrada con sus logs y se puede repetir si ha fallado.

Lecciones que aprendí por las malas

La primera: idempotencia o muerte. Repetir una importación no debe generar nunca duplicados, porque en la práctica siempre se repite. La segunda: nunca confiar en el orden de las cosas; el mapeo es por slug o por ID, nunca por posición. Y la tercera: dry-run antes de escribir. Todo cambio contra el Moodle de producción se simula primero, se valida en el panel y solo entonces se aplica. Cuando trabajas con el progreso real de alumnos, la simulación no es una opinión de diseño: es la diferencia entre un incidente y un trabajo tranquilo.

Qué haría distinto hoy

Empezaría por el plan de fases, que fui escribiendo a medida que el proyecto crecía, y sería más estricto cerrando el alcance inicial: las suscripciones y el SSO los dejé fuera por una buena razón y habría sido más honesto aún. Y pondría pruebas de integración contra un Moodle de pruebas desde el primer día, porque la API oficial también te da sorpresas.