Documentación técnica

Arquitectura

Diseño de la integración de Nexo con los sistemas institucionales, organización del estado y persistencia en el dispositivo.

Visión general

┌──────────────────┐ HTTPS ┌─────────────────────┐ │ │ ──────────────────▶ │ sigma.upla.edu.pe │ │ Dispositivo │ Acceso/Login (JWT) │ (autenticación + │ │ del usuario │ Estudiante/* │ datos académicos) │ │ │ └─────────────────────┘ │ ┌────────────┐ │ │ │ AppStore │ │ HTTPS ┌─────────────────────┐ │ │ (memoria) │ │ ──────────────────▶ │ intranet.upla.edu.pe│ │ └────┬───────┘ │ Cookie PHPSESSID │ (datos complementa- │ │ │ │ │ rios) │ │ ┌────▼───────┐ │ └─────────────────────┘ │ │ Persisten- │ │ │ │ cia local │ │ HTTPS ┌─────────────────────┐ │ │ (SQLite + │ │ ──────────────────▶ │ login.microsoft │ │ │ SharedPref)│ │ OAuth2 Device Code │ online.com + │ │ └────────────┘ │ (opcional) │ graph.microsoft.com │ │ │ └─────────────────────┘ │ ┌────────────┐ │ │ │ Lumen │ │ No se realizan solicitudes adicionales: │ │ (modelo IA │ │ ningún servidor propio, ninguna telemetría, │ │ local) │ │ ninguna API de IA externa. │ └────────────┘ │ └──────────────────┘

Integraciones

1. SIGMA

  • URL base: https://sigma.upla.edu.pe/api
  • Autenticación: JWT. La aplicación envía las credenciales al endpoint Acceso/Login, recibe un token y lo conserva en SharedPreferences. Cada solicitud posterior incluye la cabecera Authorization: Bearer <token>.

Endpoints utilizados (representativos):

  • Estudiante/perfil
  • Estudiante/horario
  • Estudiante/notas
  • Estudiante/cuotas
  • Estudiante/Publicaciones
  • Acceso/cambiarPassword

Los endpoints utilizados son los mismos que invoca el portal web oficial de SIGMA.

2. Intranet UPLA

La Intranet (intranet.upla.edu.pe) expone información complementaria no disponible en SIGMA, mediante cookies de sesión PHP:

  • consultarPensiones y consultartotalPensiones
  • obtenerCronograma
  • repRankingPromocionalEst
  • repMallaCurricularEst
  • verhorariomatriz-matriculadosEstudiante

Nexo autentica con las mismas credenciales de SIGMA y conserva la cookie PHPSESSID localmente hasta su caducidad.

3. Microsoft Graph Education (opcional)

  1. Autenticación: OAuth2 Device Code Flow contra https://login.microsoftonline.com/organizations/oauth2/v2.0/.
  2. API: Microsoft Graph Education.
  3. Permisos delegados: EduRoster.ReadBasic, EduAssignments.ReadBasic, User.Read, openid, profile, offline_access.

Los tokens se almacenan localmente y se renuevan automáticamente.

Sin activación explícita, Nexo no realiza ninguna solicitud a servicios de Microsoft.

Patrón Resolver

Determinados datos están disponibles en SIGMA y en la Intranet UPLA. Nexo implementa un patrón Resolver: para cada dato se declara una cadena de fuentes y se selecciona la primera que responda con información válida. Si una fuente presenta indisponibilidad temporal, la aplicación continúa funcionando con la alternativa.

Gestión de estado

La aplicación mantiene el estado en una instancia de AppStore (basada en ChangeNotifier de Flutter, con un contenedor AsyncValue<T> para representar los estados idle, loading, data y error).

Las pantallas observan al store mediante ListenableBuilder y se redibujan automáticamente cuando los datos cambian.

Persistencia local

DatoUbicaciónEliminación
Token SIGMASharedPreferencesLogout o desinstalación
Cookie IntranetSharedPreferencesLogout o desinstalación
Tokens MicrosoftSharedPreferences (JSON)Revocación o desinstalación
Credenciales (con "Recordar")SharedPreferences (Base64)Desactivación o desinstalación
Perfil, horario, cuotas (caché)SharedPreferences (JSON con TTL)Logout o desinstalación
Histórico de pagosSQLite localLogout o desinstalación
Snapshot de calificacionesSharedPreferencesLogout o desinstalación
Preferencias (tema, idioma)SharedPreferencesDesinstalación
Modelo Lumen (290-530 MB)getApplicationSupportDirectory()Configuración → "Borrar modelo"
Historial de chat de LumenMemoria volátilCierre de la aplicación

Toda la información persistida reside en el sandbox privado de la aplicación. En Android moderno no es accesible a otras aplicaciones sin acceso root.

Seguridad del transporte

Nexo incluye el almacén de autoridades certificadoras de Mozilla en assets/certs/cacert.pem. Este recurso aborda un problema observado en producción: determinados dispositivos Android (modelos Xiaomi con MIUI antiguo, algunos Samsung) presentan un almacén raíz desactualizado o reciben certificados intermedios incompletos por parte de SIGMA, lo que provoca el error CERTIFICATE_VERIFY_FAILED.

El almacén se carga en un SecurityContext y se utiliza en todos los clientes HTTP de la aplicación.

Notificaciones

Nexo utiliza flutter_local_notifications para programar avisos locales:

  • Recordatorios de clases (quince minutos antes del inicio).
  • Avisos de vencimiento de cuotas (un día antes de la fecha límite).
  • Detección de calificaciones nuevas al actualizar el registro.

La aplicación no utiliza servicios de notificaciones push. Esta decisión es coherente con el principio de no operar infraestructura propia.

Comparativa con el portal web oficial

AspectoPortal web UPLANexo
AutenticaciónIndependiente por sistemaUnificada con credenciales SIGMA
Modo sin conexiónNo disponibleDisponible (datos en caché)
NotificacionesNo disponiblesDisponibles (locales)
Diseño móvilParcialOptimizado
Asistente integradoNo disponibleOpcional, ejecución local
CosteGratuitoGratuito
PublicidadNoNo
TelemetríaProbableNo

Mantenimiento ante cambios en APIs

Las APIs institucionales pueden modificarse sin previo aviso. Un cambio en el formato de respuesta puede causar que la sección correspondiente de Nexo presente errores. La resolución requiere la publicación de una versión actualizada de la aplicación.