Files
soft_usite/rest/controllers/oss_api_controller.go
T
2026-05-26 20:54:10 -05:00

160 lines
5.5 KiB
Go

package controllers
import (
"math"
"strconv"
"strings"
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)
// OssApiIndex renderiza la vista del panel de gestión de Alibaba Cloud OSS.
func OssApiIndex(c *fiber.Ctx) error {
data := fiber.Map{
"user": c.Locals("user").(map[string]interface{}),
"modules": c.Locals("userModules"),
}
return c.Render("oss_api", data, "layouts/main")
}
// GetOssApiConfigs devuelve la lista paginada de configuraciones en JSON.
func GetOssApiConfigs(c *fiber.Ctx) error {
page, _ := strconv.Atoi(c.Query("page", "1"))
if page < 1 {
page = 1
}
limit := 20
offset := (page - 1) * limit
search := c.Query("search", "")
items, total, err := models.GetAllOssApi(limit, offset, search)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{
"items": items,
"total": total,
"totalPages": int(math.Ceil(float64(total) / float64(limit))),
"page": page,
"limit": limit,
})
}
// CreateOssApiConfig crea una nueva configuración de Alibaba Cloud OSS.
func CreateOssApiConfig(c *fiber.Ctx) error {
type Req struct {
Name string `json:"name"`
Endpoint string `json:"endpoint"`
AccessKeyID string `json:"access_key_id"`
AccessKeySecret string `json:"access_key_secret"`
BucketName string `json:"bucket_name"`
Region string `json:"region"`
IsActive bool `json:"is_active"`
Notes string `json:"notes"`
}
var req Req
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
}
if strings.TrimSpace(req.Name) == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "name es requerido"})
}
if strings.TrimSpace(req.Endpoint) == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "endpoint es requerido"})
}
if strings.TrimSpace(req.AccessKeyID) == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "access_key_id es requerido"})
}
if strings.TrimSpace(req.AccessKeySecret) == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "access_key_secret es requerido"})
}
if strings.TrimSpace(req.BucketName) == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "bucket_name es requerido"})
}
item := models.OssApi{
Name: strings.TrimSpace(req.Name),
Endpoint: strings.TrimSpace(req.Endpoint),
AccessKeyID: strings.TrimSpace(req.AccessKeyID),
AccessKeySecret: strings.TrimSpace(req.AccessKeySecret),
BucketName: strings.TrimSpace(req.BucketName),
Region: strings.TrimSpace(req.Region),
IsActive: req.IsActive,
Notes: strings.TrimSpace(req.Notes),
}
if err := models.CreateOssApi(&item); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.Status(fiber.StatusCreated).JSON(fiber.Map{"ok": true, "item": item})
}
// UpdateOssApiConfig actualiza una configuración existente de Alibaba Cloud OSS.
func UpdateOssApiConfig(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"})
}
existing, err := models.GetOssApiByID(uint(id))
if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "configuración no encontrada"})
}
type Req struct {
Name string `json:"name"`
Endpoint string `json:"endpoint"`
AccessKeyID string `json:"access_key_id"`
AccessKeySecret string `json:"access_key_secret"`
BucketName string `json:"bucket_name"`
Region string `json:"region"`
IsActive bool `json:"is_active"`
Notes string `json:"notes"`
}
var req Req
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
}
if strings.TrimSpace(req.Name) == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "name es requerido"})
}
existing.Name = strings.TrimSpace(req.Name)
existing.Endpoint = strings.TrimSpace(req.Endpoint)
existing.BucketName = strings.TrimSpace(req.BucketName)
existing.Region = strings.TrimSpace(req.Region)
existing.IsActive = req.IsActive
existing.Notes = strings.TrimSpace(req.Notes)
// Solo actualizar secrets si se envían valores no vacíos
if strings.TrimSpace(req.AccessKeyID) != "" {
existing.AccessKeyID = strings.TrimSpace(req.AccessKeyID)
}
if strings.TrimSpace(req.AccessKeySecret) != "" {
existing.AccessKeySecret = strings.TrimSpace(req.AccessKeySecret)
}
if err := models.UpdateOssApi(existing); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"ok": true, "item": existing})
}
// DeleteOssApiConfig elimina una configuración de Alibaba Cloud OSS.
func DeleteOssApiConfig(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"})
}
item, err := models.GetOssApiByID(uint(id))
if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "configuración no encontrada"})
}
if err := models.DeleteOssApi(item); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"ok": true})
}