Files
soft_usite/rest/controllers/cloudflare_controller.go
T

147 lines
5.1 KiB
Go

package controllers
import (
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
)
// ─── Configuración ────────────────────────────────────────────────────────────
// CloudflareConfigPage renderiza la vista de gestión de Cloudflare.
func CloudflareConfigPage(c *fiber.Ctx) error {
cfg, _ := models.GetCloudflareConfig()
return c.Render("cloudflare", fiber.Map{
"Title": "Cloudflare API",
"Config": cfg,
})
}
// SaveCloudflareConfig guarda o actualiza el API token de Cloudflare.
func SaveCloudflareConfig(c *fiber.Ctx) error {
type body struct {
ID uint `json:"id" form:"id"`
APIToken string `json:"api_token" form:"api_token"`
AccountID string `json:"account_id" form:"account_id"`
Nota string `json:"nota" form:"nota"`
}
var b body
if err := c.BodyParser(&b); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
}
if b.APIToken == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "api_token requerido"})
}
cfg := models.CloudflareConfig{
APIToken: b.APIToken,
AccountID: b.AccountID,
Nota: b.Nota,
}
cfg.ID = b.ID
if err := models.SaveCloudflareConfig(cfg); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"message": "Configuración guardada"})
}
// ─── Helper ───────────────────────────────────────────────────────────────────
func cloudflareClient() (*services.CloudflareClient, error) {
cfg, err := models.GetCloudflareConfig()
if err != nil {
return nil, err
}
return services.NewCloudflareClient(cfg.APIToken, cfg.AccountID), nil
}
// ─── Endpoints de datos ───────────────────────────────────────────────────────
// GetCloudflareUser devuelve la información del usuario autenticado en Cloudflare.
func GetCloudflareUser(c *fiber.Ctx) error {
client, err := cloudflareClient()
if err != nil {
return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
"error": "No se encontró configuración activa de Cloudflare",
})
}
data, err := client.GetUser()
if err != nil {
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"data": data})
}
// GetCloudflareZones lista todas las zonas (dominios) de la cuenta.
func GetCloudflareZones(c *fiber.Ctx) error {
client, err := cloudflareClient()
if err != nil {
return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
"error": "No se encontró configuración activa de Cloudflare",
})
}
data, err := client.GetZones()
if err != nil {
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"data": data})
}
// GetCloudflareDNS devuelve los registros DNS de una zona (:zone_id).
func GetCloudflareDNS(c *fiber.Ctx) error {
zoneID := c.Params("zone_id")
if zoneID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "zone_id requerido"})
}
client, err := cloudflareClient()
if err != nil {
return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
"error": "No se encontró configuración activa de Cloudflare",
})
}
data, err := client.GetDNSRecords(zoneID)
if err != nil {
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"data": data, "zone_id": zoneID})
}
// GetCloudflareSSL devuelve los certificados SSL de una zona (:zone_id).
func GetCloudflareSSL(c *fiber.Ctx) error {
zoneID := c.Params("zone_id")
if zoneID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "zone_id requerido"})
}
client, err := cloudflareClient()
if err != nil {
return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
"error": "No se encontró configuración activa de Cloudflare",
})
}
data, err := client.GetSSLCertificates(zoneID)
if err != nil {
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"data": data, "zone_id": zoneID})
}
// GetCloudflareFirewall devuelve las reglas de firewall de una zona (:zone_id).
func GetCloudflareFirewall(c *fiber.Ctx) error {
zoneID := c.Params("zone_id")
if zoneID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "zone_id requerido"})
}
client, err := cloudflareClient()
if err != nil {
return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
"error": "No se encontró configuración activa de Cloudflare",
})
}
data, err := client.GetFirewallRules(zoneID)
if err != nil {
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"data": data, "zone_id": zoneID})
}