package handlers import ( "net/http" "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/ren/econ/backend/internal/models" "github.com/ren/econ/backend/internal/repository" ) type ProgresoHandler struct { progresoRepo *repository.ProgresoRepository } func NewProgresoHandler(progresoRepo *repository.ProgresoRepository) *ProgresoHandler { return &ProgresoHandler{progresoRepo: progresoRepo} } // GetProgreso godoc // @Summary Obtener todo el progreso // @Description Obtiene todo el progreso del usuario autenticado // @Tags progreso // @Produce json // @Security BearerAuth // @Success 200 {array} models.Progreso // @Router /api/progreso [get] func (h *ProgresoHandler) GetProgreso(c *gin.Context) { userID, exists := c.Get("user_id") if !exists { c.JSON(http.StatusUnauthorized, gin.H{"error": "No autorizado"}) return } progresos, err := h.progresoRepo.GetProgresoByUsuarioID(userID.(uuid.UUID)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al obtener progreso"}) return } if progresos == nil { progresos = []models.Progreso{} } c.JSON(http.StatusOK, progresos) } // SaveProgreso godoc // @Summary Guardar/actualizar progreso // @Description Guarda o actualiza el progreso de un ejercicio // @Tags progreso // @Accept json // @Produce json // @Param progreso body models.Progreso true "Datos del progreso" // @Security BearerAuth // @Success 200 {object} map[string]string // @Router /api/progreso [post] func (h *ProgresoHandler) SaveProgreso(c *gin.Context) { userID, exists := c.Get("user_id") if !exists { c.JSON(http.StatusUnauthorized, gin.H{"error": "No autorizado"}) return } var progreso models.Progreso if err := c.ShouldBindJSON(&progreso); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } progreso.UsuarioID = userID.(uuid.UUID) err := h.progresoRepo.SaveProgreso(&progreso) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al guardar progreso: " + err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Progreso guardado exitosamente"}) } // GetResumen godoc // @Summary Obtener resumen // @Description Obtiene estadísticas del progreso del usuario (puntos totales, etc.) // @Tags progreso // @Produce json // @Security BearerAuth // @Success 200 {object} models.ResumenProgreso // @Router /api/progreso/resumen [get] func (h *ProgresoHandler) GetResumen(c *gin.Context) { userID, exists := c.Get("user_id") if !exists { c.JSON(http.StatusUnauthorized, gin.H{"error": "No autorizado"}) return } resumen, err := h.progresoRepo.GetResumen(userID.(uuid.UUID)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Error al obtener resumen"}) return } c.JSON(http.StatusOK, resumen) }