From 997af5d47319ea67abbee87cb61893f7c269f835 Mon Sep 17 00:00:00 2001 From: Nurfog Date: Fri, 6 Mar 2026 12:37:39 -0300 Subject: [PATCH] feat: introduce global AI task dashboard, enhance user profiles with new fields, and update database models with default implementations. --- README.md | 1 + roadmap.md | 1 + services/cms-service/src/handlers/tasks.rs | 2 +- services/lms-service/src/lti.rs | 3 + shared/common/src/models.rs | 77 +++++++++++++++++++++- 5 files changed, 82 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c0bab8f..3703511 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ El proyecto ha sido optimizado para reducir la complejidad de la infraestructura - **Gamified Activities**: Nuevos tipos de bloques interactivos para niños y jóvenes, incluyendo Juegos de Memoria y Puntos Calientes (Hotspots). - **AI Image Generation**: Generación automática de contenido visual a partir de guiones de lecciones o prompts personalizados, con soporte para resoluciones personalizadas (HD/4K) y gestión de portadas de curso de alta calidad. - **Course Marketing & Summary**: Sistema de metadatos estructurados (objetivos, requisitos) y landing pages premium para una mejor presentación de cursos. + - **Global AI Task Dashboard**: Panel unificado de control en consola administrativa para monitorear, reintentar y cancelar tareas de IA en segundo plano (transcripciones, imágenes, etc). - **Dynamic API Resolution**: Resolución inteligente de endpoints que permite el acceso desde cualquier dispositivo en la red local (WiFi) sin configuración manual. - **Responsive UI/UX**: Interfaces optimizadas para dispositivos móviles con menús adaptativos y escalado fluido de componentes. - **AI Teaching Assistant (RAG)**: Tutor inteligente dentro de cada lección que ayuda a los estudiantes utilizando el contexto de la lección actual y el historial del curso. diff --git a/roadmap.md b/roadmap.md index 37a533f..63c058c 100644 --- a/roadmap.md +++ b/roadmap.md @@ -223,6 +223,7 @@ - [x] **Metadatos de Marketing Estructurados**: Captura de objetivos, requisitos, público objetivo y certificación en Studio. (Completado) - [x] **Premium Course Summary**: Nueva interfaz de "Acerca del Curso" en Experience con diseño de alta fidelidad y navegación por pestañas. (Completado) - [x] **Gestión de Portadas de Curso**: Integración de imágenes generadas por IA como activos principales del curso con previsualización dinámica. (Completado) +- [x] **Dashboard Global de Tareas AI**: Panel centralizado para monitorizar, reintentar y cancelar todas las generaciones en segundo plano (imágenes, videos, transcripciones). (Completado) --- diff --git a/services/cms-service/src/handlers/tasks.rs b/services/cms-service/src/handlers/tasks.rs index 5011f63..f1dbf62 100644 --- a/services/cms-service/src/handlers/tasks.rs +++ b/services/cms-service/src/handlers/tasks.rs @@ -1,4 +1,4 @@ -+use crate::handlers::run_transcription_task; +use crate::handlers::run_transcription_task; use axum::{ Json, extract::{Path, State}, diff --git a/services/lms-service/src/lti.rs b/services/lms-service/src/lti.rs index 3e5ecf9..51cb49f 100644 --- a/services/lms-service/src/lti.rs +++ b/services/lms-service/src/lti.rs @@ -196,6 +196,9 @@ pub async fn lti_launch( avatar_url: None, bio: None, language: None, + is_public_profile: Some(true), + linkedin_url: None, + github_url: None, created_at: chrono::Utc::now(), updated_at: chrono::Utc::now(), }); diff --git a/shared/common/src/models.rs b/shared/common/src/models.rs index 2f06ecf..c59e212 100644 --- a/shared/common/src/models.rs +++ b/shared/common/src/models.rs @@ -3,7 +3,8 @@ use serde::{Deserialize, Serialize}; use serde_json; use uuid::Uuid; -#[derive(Debug, Serialize, Deserialize, sqlx::FromRow, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, sqlx::FromRow)] +#[sqlx(default)] pub struct Course { pub id: Uuid, pub organization_id: Uuid, @@ -26,6 +27,32 @@ pub struct Course { pub updated_at: DateTime, } +impl Default for Course { + fn default() -> Self { + Self { + id: Uuid::new_v4(), + organization_id: Uuid::new_v4(), + title: String::new(), + description: None, + instructor_id: Uuid::new_v4(), + pacing_mode: "self_paced".to_string(), + start_date: None, + end_date: None, + passing_percentage: 0, + certificate_template: None, + price: 0.0, + currency: "USD".to_string(), + marketing_metadata: None, + course_image_url: None, + generation_status: None, + generation_progress: None, + generation_error: None, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} + #[derive(Debug, Serialize, Deserialize, sqlx::FromRow, Clone)] pub struct Module { pub id: Uuid, @@ -83,6 +110,7 @@ pub struct UserGrade { pub attempts_count: i32, pub metadata: Option, pub created_at: DateTime, + pub updated_at: DateTime, } #[derive(Debug, Serialize, Deserialize, sqlx::FromRow, Clone)] @@ -313,6 +341,7 @@ pub struct Transaction { } #[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] +#[sqlx(default)] pub struct User { pub id: Uuid, pub organization_id: Uuid, @@ -325,10 +354,36 @@ pub struct User { pub avatar_url: Option, pub bio: Option, pub language: Option, + pub is_public_profile: Option, + pub linkedin_url: Option, + pub github_url: Option, pub created_at: DateTime, pub updated_at: DateTime, } +impl Default for User { + fn default() -> Self { + Self { + id: Uuid::new_v4(), + organization_id: Uuid::new_v4(), + email: String::new(), + password_hash: String::new(), + full_name: String::new(), + role: "student".to_string(), + xp: 0, + level: 1, + avatar_url: None, + bio: None, + language: None, + is_public_profile: Some(true), + linkedin_url: None, + github_url: None, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} + #[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] pub struct UserResponse { pub id: Uuid, @@ -344,6 +399,7 @@ pub struct UserResponse { } #[derive(Debug, Serialize, Deserialize, sqlx::FromRow, Clone)] +#[sqlx(default)] pub struct Organization { pub id: Uuid, pub name: String, @@ -359,6 +415,25 @@ pub struct Organization { pub updated_at: DateTime, } +impl Default for Organization { + fn default() -> Self { + Self { + id: Uuid::new_v4(), + name: String::new(), + domain: None, + logo_url: None, + primary_color: None, + secondary_color: None, + certificate_template: None, + platform_name: None, + favicon_url: None, + logo_variant: None, + created_at: Utc::now(), + updated_at: Utc::now(), + } + } +} + #[derive(Debug, Serialize, Deserialize)] pub struct AuthResponse { pub user: UserResponse,