Files
soft_usite/rest/controllers/pasarelas_controller.go
T
2026-05-01 22:55:51 -05:00

184 lines
6.6 KiB
Go

package controllers
import (
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)
// PasarelasPage renderiza la vista unificada de pasarelas de pago.
func PasarelasPage(c *fiber.Ctx) error {
boldCfg, _ := models.GetBoldConfig()
dlocalCfg, _ := models.GetLastActiveDlocalApi()
data := fiber.Map{
"Title": "Pasarelas de Pago",
"Bold": boldCfg,
"Dlocal": dlocalCfg,
"user": c.Locals("user"),
"modules": c.Locals("userModules"),
}
if err := c.Render("pasarelas_pago", data, "layouts/main"); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return nil
}
// ─── Bold ─────────────────────────────────────────────────────────────────────
// SaveBoldConfig guarda o actualiza la configuración de Bold.
func SaveBoldConfig(c *fiber.Ctx) error {
type body struct {
ID uint `json:"id" form:"id"`
ApiKeyProd string `json:"api_key_prod" form:"api_key_prod"`
SecretKeyProd string `json:"secret_key_prod" form:"secret_key_prod"`
ApiKeyTest string `json:"api_key_test" form:"api_key_test"`
SecretKeyTest string `json:"secret_key_test" form:"secret_key_test"`
Modo string `json:"modo" form:"modo"`
CallbackUrl string `json:"callback_url" form:"callback_url"`
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.Modo == "" {
b.Modo = "test"
}
cfg := models.BoldConfig{
ApiKeyProd: b.ApiKeyProd,
SecretKeyProd: b.SecretKeyProd,
ApiKeyTest: b.ApiKeyTest,
SecretKeyTest: b.SecretKeyTest,
Modo: b.Modo,
CallbackUrl: b.CallbackUrl,
Nota: b.Nota,
}
cfg.ID = b.ID
if err := models.SaveBoldConfig(cfg); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"message": "Configuración Bold guardada"})
}
// GetBoldConfig devuelve la configuración activa de Bold (para cargar el form).
func GetBoldConfigAPI(c *fiber.Ctx) error {
cfg, err := models.GetBoldConfig()
if err != nil {
return c.JSON(fiber.Map{"data": nil})
}
return c.JSON(fiber.Map{"data": cfg})
}
// ─── dLocal ───────────────────────────────────────────────────────────────────
// SaveDlocalConfig guarda o actualiza la configuración de dLocal.
func SaveDlocalConfigWeb(c *fiber.Ctx) error {
type body struct {
ID uint `json:"id" form:"id"`
AccessKeyID string `json:"access_key_id" form:"access_key_id"`
AccessKeySecret string `json:"access_key_secret" form:"access_key_secret"`
AccessKeyIDdev string `json:"access_key_id_dev" form:"access_key_id_dev"`
AccessKeySecretdev string `json:"access_key_secret_dev" form:"access_key_secret_dev"`
UrlProd string `json:"url_prod" form:"url_prod"`
UrlDev string `json:"url_dev" form:"url_dev"`
Modo string `json:"modo" form:"modo"`
}
var b body
if err := c.BodyParser(&b); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "body inválido"})
}
if b.Modo == "" {
b.Modo = "dev"
}
cfg := models.DlocalApi{
AccessKeyID: b.AccessKeyID,
AccessKeySecret: b.AccessKeySecret,
AccessKeyIDdev: b.AccessKeyIDdev,
AccessKeySecretdev: b.AccessKeySecretdev,
UrlProd: b.UrlProd,
UrlDev: b.UrlDev,
Modo: b.Modo,
IsActive: true,
}
cfg.ID = b.ID
// Desactivar configs previas
if cfg.ID == 0 {
if err := models.CreateDlocalApi(&cfg); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
} else {
if err := models.UpdateDlocalApi(&cfg); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
}
return c.JSON(fiber.Map{"message": "Configuración dLocal guardada"})
}
// GetDlocalConfigAPI devuelve la configuración activa de dLocal.
func GetDlocalConfigAPI(c *fiber.Ctx) error {
cfg, err := models.GetLastActiveDlocalApi()
if err != nil {
return c.JSON(fiber.Map{"data": nil})
}
return c.JSON(fiber.Map{"data": cfg})
}
// ─── Logs Bold ────────────────────────────────────────────────────────────────
// BoldWebhookLogs devuelve los logs de notificaciones con paginación y filtro por tipo.
// Query params: page (default 1), limit (default 25), tipo (SALE_APPROVED|SALE_REJECTED|...|TODOS)
func BoldWebhookLogs(c *fiber.Ctx) error {
page := c.QueryInt("page", 1)
limit := c.QueryInt("limit", 25)
tipo := c.Query("tipo", "")
if page < 1 {
page = 1
}
logs, total, err := models.GetBoldWebhookLogsPaginated(page, limit, tipo)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{
"data": logs,
"total": total,
"page": page,
"limit": limit,
})
}
// BoldCallbackLogs devuelve los intentos de pago (visitas al callback) con paginación y filtro.
// Query params: page (default 1), limit (default 25), estado (pendiente|pagado|fallido|revertido|TODOS)
func BoldCallbackLogs(c *fiber.Ctx) error {
page := c.QueryInt("page", 1)
limit := c.QueryInt("limit", 25)
estado := c.Query("estado", "")
if page < 1 {
page = 1
}
logs, total, err := models.GetBoldCallbackLogsPaginated(page, limit, estado)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{
"data": logs,
"total": total,
"page": page,
"limit": limit,
})
}
// ─── Logs dLocal ──────────────────────────────────────────────────────────────
// DlocalPaymentLogs devuelve los últimos 100 registros de pagos de dLocal.
func DlocalPaymentLogs(c *fiber.Ctx) error {
logs, err := models.GetDlocalPaymentLogs(100)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"data": logs})
}