API Documentation - Mayeutica
Introducción
Esta API proporciona endpoints para gestionar cursos, sesiones, interacciones con IA, datos de usuario y más para la plataforma Mayeutica.
Base URL: La URL base para todas las llamadas a la API es: https://api.mayeutica.school/api (Producción) ohttps://apimayeutica.test/api (Desarrollo Local)
Autenticación: La mayoría de los endpoints requieren autenticación. Hay dos tipos de tokens:
- Token API (
token_api): Para operaciones generales de la API (comologininicial sin usuario). Se obtiene con la funciónloginusando credenciales de API predefinidas. Se envía en el header:Authorization: Bearer {token_api}. El interceptor de Axios (main.js) intenta añadirlo automáticamente si no hay otro token de autorización presente. - Token Usuario (
token_user): Para operaciones específicas del usuario autenticado (comogetUser,getPreferences, etc.). Se obtiene con las funcionessignInosignUp. Se envía en el header:Authorization: Bearer {token_user}.
Formato de Datos: Todas las solicitudes (a menos que se indique lo contrario) deben tener un Content-Type de application/json. Las respuestas también serán en formato JSON, excepto generateSpeech que devuelve audio/mpeg.
Manejo de Errores: La API utiliza códigos de estado HTTP estándar:
200 OK: Solicitud exitosa.201 Created: Recurso creado exitosamente.400 Bad Request: Solicitud mal formada o datos inválidos (posiblemente error de Factory).401 Unauthorized: Token inválido o expirado. El interceptor del frontend redirige a/login.403 Forbidden: Permisos insuficientes.404 Not Found: Recurso no encontrado (usuario, curso, etc.).422 Unprocessable Entity: Errores de validación. La respuesta incluirá un objetodetailsoerrorscon los campos fallidos.500 Internal Server Error: Error inesperado en el servidor.503 Service Unavailable: Error de comunicación con servicios externos (como la API de IA).
Endpoints de Autenticación y Usuario
Estos endpoints gestionan el inicio/cierre de sesión y los datos del usuario.
POST /login (Inicio de Sesión API)
Inicia una sesión general para la API usando credenciales predefinidas (variables de entorno).
- Descripción: Obtiene un token (
token_api) para interactuar con endpoints que no requieren un usuario específico logueado. - Request Body:
{ "email": "tu_api_user@ejemplo.com", // Desde import.meta.env.VITE_MAYEUTICA_API_USER "password": "tu_api_key" // Desde import.meta.env.VITE_MAYEUTICA_API_KEY } - Successful Response (200 OK):
{ "accessToken": "..." // token_api } - Notas: El frontend almacena este token en
sessionStoragecomotoken_api.
POST /login (Inicio de Sesión Usuario)
Autentica a un usuario existente con email y contraseña.
- Descripción: Inicia la sesión para un usuario registrado.
- Request Body:
{ "email": "usuario@ejemplo.com", // Requerido | string "password": "password_del_usuario" // Requerido | string } - Successful Response (200 OK):
{ "accessToken": "...", // token_user "user": { "id": 1, "name": "Nombre Usuario", "email": "usuario@ejemplo.com", // ... otros datos del usuario } } - Error Response (401 Unauthorized): Credenciales inválidas.
- Notas: El frontend almacena
accessTokencomotoken_usery los datos deuserensessionStorage. Recarga la página después del login exitoso.
POST /register (Registro de Usuario)
Registra un nuevo usuario. Requiere obtener primero una cookie CSRF.
- Descripción: Crea una nueva cuenta de usuario.
- Prerrequisito: El frontend primero hace una llamada
GET /sanctum/csrf-cookiepara obtener la cookie CSRF necesaria para la protección de Laravel Sanctum. - Request Body:
{ "name": "Nuevo Usuario", // Requerido | string "email": "nuevo@ejemplo.com", // Requerido | string | unique "password": "password_seguro" // Requerido | string | (Laravel suele requerir confirmación: password_confirmation) } - Successful Response (201 Created):
{ // Datos del usuario recién creado o mensaje de éxito "id": 2, "name": "Nuevo Usuario", "email": "nuevo@ejemplo.com", // ... } - Error Response (422 Unprocessable Entity): Fallos de validación (email ya existe, contraseña débil, etc.).
GET /user (Obtener Datos del Usuario Autenticado)
Obtiene los datos del usuario actualmente autenticado mediante token_user.
- Descripción: Devuelve la información del usuario asociado al token Bearer enviado.
- Headers:
Authorization: Bearer {token_user}(Requerido)
- Successful Response (200 OK):
{ "id": 1, "name": "Nombre Usuario", "email": "usuario@ejemplo.com", "user_preferences": { "language": "es", "aiprovider": "openai" }, // ... otros datos del usuario } - Error Response (401 Unauthorized): Si el token no es válido o ha expirado.
POST /logout (Cierre de Sesión API/Usuario)
Invalida el token de autenticación proporcionado (puede ser token_api o token_user).
- Descripción: Cierra la sesión asociada al token Bearer enviado.
- Headers:
Authorization: Bearer {token}(Requerido:token_apiotoken_user)
- Request Body: Objeto vacío
{} - Successful Response (200 OK):
{ "message": "Successfully logged out" // o similar } - Notas: El frontend elimina el token correspondiente (
token_apiotoken_user) desessionStorage.
Endpoints Principales (Orden Alfabético)
POST /countInteracciones
Cuenta las interacciones de tipo 'assistant' para una sesión específica.
- Descripción: Devuelve el número total de mensajes enviados por el asistente en una sesión, útil para determinar si se alcanzó el límite o cuándo mostrar un cuestionario.
- Request Body:
{ "id_user": 1, // Requerido | integer "id_curso": 10, // Requerido | integer "id_sesion": 55 // Requerido | integer } - Successful Response (200 OK):
// Devuelve directamente el número (integer) 3 - Error Response (422 Unprocessable Entity): Si faltan parámetros requeridos.
POST /cupones
Obtiene una lista de todos los cupones disponibles.
- Descripción: Devuelve un array con todos los registros de la tabla
Cupon. - Request Body: (Aunque el backend no lo usa, el frontend envía
requestData. Puede ser un objeto vacío{}). - Successful Response (200 OK):
[ { "id": 1, "codigo": "DESC10", "descuento": 10, ... }, { "id": 2, "codigo": "PROMO20", "descuento": 20, ... } ]
POST /cursos
Obtiene información sobre los cursos.
- Descripción: Devuelve una lista de todos los cursos o la información de un curso específico si se proporciona
cursold. - Request Body:
{ "cursold": 10 // Opcional | integer - ID del curso a obtener } - Successful Response (200 OK):
- Si
cursoldse omite: Array de todos los objetos Curso. - Si
cursoldse proporciona: Array con un único objeto Curso.
[ { "id": 10, "nombre": "Introducción a Vue.js", "descripcion": "...", ... } ] - Si
POST /engineInteraction
Procesa la interacción principal entre el usuario y la IA.
- Descripción: Recibe el historial de chat, el contexto del curso y el proveedor de IA seleccionado, genera una respuesta de la IA y la devuelve. Es el endpoint central del chat.
- Request Body:
{ "chatHistory": [ // Requerido | array { "role": "system", "content": "..." }, { "role": "user", "content": "Hola" }, { "role": "assistant", "content": "¿En qué puedo ayudarte?" } ], "data_curso": { // Requerido | object "id_user": 1, "curso_name": "Introducción a Vue.js", "session_name": "Componentes", "tema_name": "Conceptos Básicos", "name_user": "Nombre Usuario" // Se añaden id_curso, id_sesion, id_matricula en el frontend }, "aiprovider": "openai" // Requerido | string | 'openai', 'anthropic', 'deepseek', 'gemini' } - Successful Response (200 OK):
{ "message": "Aquí está la respuesta generada por la IA..." // string } - Error Response:
422 Unprocessable Entity: Si la validación falla (estructura incorrecta, valores inválidos).404 Not Found: Si elid_userendata_cursono existe.503 Service Unavailable/4xx: Errores devueltos por la API del proveedor de IA (OpenAI, Gemini, etc.).400 Bad Request: Si elaiproviderno es soportado o hay errores de configuración.
POST /enroll
Registra la matrícula de un usuario a un curso después de un pago exitoso (ej. PayPal).
- Descripción: Recibe los detalles del pago y el email del usuario, busca al usuario, crea un registro de
Matriculay un registro dePago. - Request Body:
{ "user_mail": "usuario@ejemplo.com", // Requerido | string "cursold": 10, // Requerido | integer "details": "{...}" // Requerido | string (JSON string de los detalles del pago, ej. de PayPal) } - Successful Response (200 OK / 201 Created): Devuelve un mensaje de éxito o el objeto
Matriculacreado. - Error Response:
404 Not Found: Si eluser_mailno corresponde a ningún usuario registrado.- Errores de base de datos si falla la inserción.
POST /enrolled
Verifica si un usuario está matriculado en un curso específico.
- Descripción: Comprueba si existe un registro de matrícula para la combinación de
userIdycursold. - Request Body:
{ "userId": 1, // Requerido | integer "cursold": 10 // Requerido | integer } - Successful Response (200 OK):
- Si está matriculado: Objeto
Matricula.
{ "id": 123, "id_user": 1, "id_curso": 10, "id_sesion": 55, "estado": "Matriculado", // ... }- Si no está matriculado: Devuelve
0onull(según la implementación exacta, el frontend espera algo falsy).
- Si está matriculado: Objeto
POST /generateSpeech
Convierte texto a voz usando la API de OpenAI TTS.
- Descripción: Recibe texto y devuelve los datos de audio correspondientes.
- Request Body:
{ "text": "Este es el texto a convertir en audio.", // Requerido | string "user_id": 1 // Requerido | integer (Usado para nombrar el archivo temporalmente en backend) } - Successful Response (200 OK):
- Content-Type:
audio/mpeg - Body: Los datos binarios del archivo de audio. (El frontend lo recibe como
Blob).
- Content-Type:
- Error Response: Si falla la comunicación con la API de OpenAI o la escritura del archivo temporal.
POST /getInteracciones
Obtiene el historial de interacciones (mensajes) para una sesión específica.
- Descripción: Devuelve todos los mensajes de usuario y asistente para un usuario, curso y sesión dados.
- Request Body:
{ "id_user": 1, // Requerido | integer "id_curso": 10, // Requerido | integer "id_sesion": 55 // Requerido | integer } - Successful Response (200 OK):
[ { "id": 1, "role": "user", "content": "Hola", ... }, { "id": 2, "role": "assistant", "content": "¿Cómo estás?", ... }, // ... más interacciones ] - Error Response (422 Unprocessable Entity): Si faltan parámetros requeridos.
POST /getPreferences
Obtiene las preferencias guardadas para un usuario específico.
- Descripción: Devuelve el objeto de preferencias del usuario (idioma, proveedor IA, etc.).
- Request Body:
{ "user_id": 1 // Requerido | integer } - Successful Response (200 OK):
{ "language": "es", "aiprovider": "openai" // ... otras preferencias }- Devuelve
nullo un objeto vacío si no hay preferencias guardadas.
- Devuelve
- Error Response (404 Not Found): Si el
user_idno existe.
POST /language
Obtiene el mapa de idiomas soportados.
- Descripción: Devuelve un objeto JSON que mapea códigos de idioma (ej. 'en') a nombres completos (ej. 'English').
- Request Body: (Aunque el backend no lo usa, el frontend envía
requestData. Puede ser un objeto vacío{}). - Successful Response (200 OK):
{ "ar": "Arabic", "en": "English", "es": "Spanish", // ... etc }
POST /next_session
Obtiene los datos de la siguiente sesión para una matrícula dada.
- Descripción: Recibe el ID de la matrícula actual y calcula/devuelve el objeto de la siguiente sesión en el curso. Actualiza
id_sesionen la matrícula. - Request Body:
{ "id_matricula": 123 // Requerido | integer } - Successful Response (200 OK):
- Si hay una siguiente sesión: Objeto
Sesionde la siguiente sesión.
{ "id": 56, "id_curso": 10, "id_tema": 21, "nombre": "Props", ... }- Si es la última sesión: Devuelve
false.
- Si hay una siguiente sesión: Objeto
- Error Response (404 Not Found): Si el
id_matriculano existe.
POST /sesiones
Obtiene información sobre las sesiones de un curso o tema.
- Descripción: Devuelve sesiones filtradas por ID de curso, ID de tema, o ID de sesión específico, o todas las sesiones si no se proporcionan filtros.
- Request Body:
{ "cursold": 10, // Opcional | integer "temald": 20, // Opcional | integer "sesionId": 55 // Opcional | integer } - Successful Response (200 OK): Array de objetos
Sesionque coinciden con los filtros.[ { "id": 55, "nombre": "Estado Local", "id_curso": 10, "id_tema": 20, ... }, { "id": 56, "nombre": "Props", "id_curso": 10, "id_tema": 21, ... } ]
POST /storeInteraccion
Guarda una nueva interacción (mensaje de usuario o asistente) en la base de datos.
- Descripción: Almacena un mensaje del chat. Usado internamente por
interaction_enginedespués de una respuesta. - Request Body:
{ "id_user": 1, // Requerido | integer "id_curso": 10, // Requerido | integer "id_sesion": 55, // Requerido | integer "role": "user", // Requerido | string ('user' o 'assistant') "content": "Mensaje...", // Requerido | string "ia_provider": "openai" // Requerido | string (Proveedor que generó la respuesta si role='assistant') } - Successful Response (201 Created):
// Objeto de la Interaccion recién creada { "id": 3, "id_user": 1, "id_curso": 10, "id_sesion": 55, "role": "user", "content": "Mensaje...", "ia_provider": "openai", // ... timestamps } - Error Response (422 Unprocessable Entity): Si faltan datos o son inválidos.
POST /storePregunta
Guarda la respuesta y evaluación de una pregunta del cuestionario.
- Descripción: Almacena los detalles de una pregunta del cuestionario, la respuesta del usuario, y la evaluación/calificación generada por la IA.
- Request Body:
{ "data_curso": { // Requerido | object (Debe contener id_user, id_sesion) "id_user": 1, "id_sesion": 55, // ...otros datos que puedan ser útiles si la API los necesitara }, "pregunta": "¿Qué son los props?", // Requerido | string "consecutivo": "1", // Requerido | string o integer (Número de pregunta, ej. '1', '2') "respuesta": "Son propiedades...",// Requerido | string (Respuesta del usuario) "evaluacion": "Buena respuesta...", // Requerido | string (Feedback cualitativo de IA) "calificacion": "4", // Requerido | string o number (Score numérico de IA) "Alprovider": "openai" // Requerido | string (Proveedor IA que evaluó) } - Successful Response (201 Created): Devuelve el objeto
Preguntacreado o un mensaje de éxito. - Error Response (422 Unprocessable Entity): Si faltan datos o son inválidos.
POST /temas
Obtiene información sobre los temas de un curso.
- Descripción: Devuelve temas filtrados por ID de curso o ID de tema específico, o todos los temas si no se proporcionan filtros.
- Request Body:
{ "cursold": 10, // Opcional | integer "temald": 20 // Opcional | integer } - Successful Response (200 OK): Array de objetos
Temaque coinciden con los filtros.[ { "id": 20, "nombre": "Conceptos Básicos", "id_curso": 10, ... }, { "id": 21, "nombre": "Componentes Avanzados", "id_curso": 10, ... } ]
POST /updateMatricula
Actualiza el estado o la sesión actual de una matrícula.
- Descripción: Puede usarse para avanzar a la siguiente sesión (
next_session) o para marcar un curso como completado (estado). - Request Body (Opción 1: Avanzar Sesión):
{ "data_curso": { // Requerido | object "id_user": 1, "id_curso": 10 // El ID de la matrícula se infiere buscando con id_user y id_curso }, "next_session": 56 // Requerido para avanzar | integer (ID de la nueva sesión) } - Request Body (Opción 2: Actualizar Estado):
{ "data_curso": { ... }, // Requerido | object (Como arriba) "estado": "completed" // Requerido para cambiar estado | string (ej. "completed") // El frontend también envía el ID de matrícula directamente a veces: // "id": 123 // ID de la matrícula a actualizar (Ajustar API si es necesario) } - Successful Response (200 OK):
- Si se envió
next_session: Devuelve el objetoSesioncorrespondiente anext_session. - Si se envió
estado: Devuelve el objetoMatriculaactualizado.
- Si se envió
- Error Response (404 Not Found): Si no se encuentra la matrícula basada en
data_curso.
POST /updatepreferences
Actualiza las preferencias de un usuario.
- Descripción: Guarda las nuevas preferencias de idioma y proveedor de IA para el usuario.
- Request Body:
{ "data": { // Requerido | object "user_id": 1, // Requerido | integer "language": "en", // Requerido | string (código de idioma, ej. 'en', 'es') "aiProvider": "gemini" // Requerido | string (ej. 'openai', 'gemini') } } - Successful Response (200 OK): Devuelve las preferencias actualizadas o un mensaje de éxito.
- Error Response (404 Not Found): Si el
user_idno existe.