package repository import ( "context" "encoding/json" "github.com/jackc/pgx/v5/pgxpool" "github.com/ren/econ/backend/internal/models" ) type ContenidoRepository struct { db *pgxpool.Pool } func NewContenidoRepository(db *pgxpool.Pool) *ContenidoRepository { return &ContenidoRepository{db: db} } func (r *ContenidoRepository) GetModulos(ctx context.Context) ([]models.ModuloResumen, error) { query := ` SELECT DISTINCT modulo_numero, titulo, contenido::text FROM ejercicios ORDER BY modulo_numero ` rows, err := r.db.Query(ctx, query) if err != nil { return nil, err } defer rows.Close() var modulos []models.ModuloResumen for rows.Next() { var m models.ModuloResumen var contenidoJSON string err := rows.Scan(&m.Numero, &m.Titulo, &contenidoJSON) if err != nil { return nil, err } // Extraer descripción del contenido JSON var contenido map[string]interface{} json.Unmarshal([]byte(contenidoJSON), &contenido) if desc, ok := contenido["descripcion"].(string); ok { m.Descripcion = desc } else { m.Descripcion = "" } modulos = append(modulos, m) } return modulos, nil } func (r *ContenidoRepository) GetModulo(ctx context.Context, numero int) (*models.Modulo, error) { query := ` SELECT id, titulo, tipo, contenido, orden FROM ejercicios WHERE modulo_numero = $1 ORDER BY orden ` rows, err := r.db.Query(ctx, query, numero) if err != nil { return nil, err } defer rows.Close() modulo := &models.Modulo{Numero: numero} var ejercicios []models.Ejercicio for rows.Next() { var e models.Ejercicio var contenidoJSON string err := rows.Scan(&e.ID, &e.Titulo, &e.Tipo, &contenidoJSON, &e.Orden) if err != nil { return nil, err } json.Unmarshal([]byte(contenidoJSON), &e.Contenido) e.Numero = e.ID ejercicios = append(ejercicios, e) } if len(ejercicios) > 0 { modulo.Titulo = ejercicios[0].Titulo modulo.Ejercicios = ejercicios // Extraer descripción del primer ejercicio if desc, ok := ejercicios[0].Contenido["descripcion"].(string); ok { modulo.Descripcion = desc } } return modulo, nil }