package controllers import ( "strconv" "strings" "github.com/gofiber/fiber/v2" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // UmindPlanesPage renderiza la administración de planes de uMind (solo staff). func UmindPlanesPage(c *fiber.Ctx) error { return c.Render("umind_planes", fiber.Map{ "user": c.Locals("user"), "modules": c.Locals("userModules"), }, "layouts/main") } func GetUmindPlanesHandler(c *fiber.Ctx) error { items, err := models.GetUmindPlanes() if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } return c.JSON(fiber.Map{"items": items}) } type umindPlanReq struct { Nombre string `json:"nombre"` MaxAgentes int `json:"max_agentes"` PrecioMensual float64 `json:"precio_mensual"` PrecioPor1kTokens float64 `json:"precio_por_1k_tokens"` PrecioPorOCR float64 `json:"precio_por_ocr"` PrecioPorTranscripcion float64 `json:"precio_por_transcripcion"` Moneda string `json:"moneda"` TopeConsumoMensual float64 `json:"tope_consumo_mensual"` Activo bool `json:"activo"` } func (r umindPlanReq) moneda() string { m := strings.ToUpper(strings.TrimSpace(r.Moneda)) if len(m) != 3 { return "COP" } return m } func CreateUmindPlanHandler(c *fiber.Ctx) error { var req umindPlanReq if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"}) } if strings.TrimSpace(req.Nombre) == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "nombre es requerido"}) } if req.MaxAgentes < 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "max_agentes no puede ser negativo"}) } plan := &models.UmindPlan{ Nombre: strings.TrimSpace(req.Nombre), MaxAgentes: req.MaxAgentes, PrecioMensual: req.PrecioMensual, PrecioPor1kTokens: req.PrecioPor1kTokens, PrecioPorOCR: req.PrecioPorOCR, PrecioPorTranscripcion: req.PrecioPorTranscripcion, Moneda: req.moneda(), TopeConsumoMensual: req.TopeConsumoMensual, Activo: true, } if err := models.CreateUmindPlan(plan); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } return c.Status(fiber.StatusCreated).JSON(fiber.Map{"ok": true, "id": plan.ID}) } func UpdateUmindPlanHandler(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "id inválido"}) } var req umindPlanReq if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"}) } if req.MaxAgentes < 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "max_agentes no puede ser negativo"}) } updates := map[string]interface{}{ "nombre": strings.TrimSpace(req.Nombre), "max_agentes": req.MaxAgentes, "precio_mensual": req.PrecioMensual, "precio_por_1k_tokens": req.PrecioPor1kTokens, "precio_por_ocr": req.PrecioPorOCR, "precio_por_transcripcion": req.PrecioPorTranscripcion, "moneda": req.moneda(), "tope_consumo_mensual": req.TopeConsumoMensual, "activo": req.Activo, } if err := models.UpdateUmindPlan(uint(id), updates); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } return c.JSON(fiber.Map{"ok": true}) } func DeleteUmindPlanHandler(c *fiber.Ctx) error { id, err := strconv.ParseUint(c.Params("id"), 10, 64) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "id inválido"}) } if err := models.DeleteUmindPlan(uint(id)); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) } return c.JSON(fiber.Map{"ok": true}) }