Files
soft_usite/rest/controllers/smtp_config_controller.go
T

111 lines
3.5 KiB
Go

package controllers
import (
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/app"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
"github.com/sujit-baniya/fiber-boilerplate/utils"
)
func SmtpConfigView(c *fiber.Ctx) error {
cfg, _ := models.GetSmtpConfig()
return c.Render("renovaciones/smtp", fiber.Map{
"user": c.Locals("user"),
"modules": c.Locals("userModules"),
"config": cfg,
}, "layouts/main")
}
func GetSmtpConfig(c *fiber.Ctx) error {
cfg, err := models.GetSmtpConfig()
if err != nil {
return c.JSON(fiber.Map{"ok": false, "config": nil})
}
// No exponer contraseña en claro
cfg.Password = "***"
return c.JSON(fiber.Map{"ok": true, "config": cfg})
}
func SaveSmtpConfig(c *fiber.Ctx) error {
type Input struct {
Host string `json:"host"`
Port int `json:"port"`
Username string `json:"username"`
Password string `json:"password"`
Encryption string `json:"encryption"`
FromAddress string `json:"from_address"`
FromName string `json:"from_name"`
}
var inp Input
if err := c.BodyParser(&inp); err != nil {
return c.Status(400).JSON(fiber.Map{"error": err.Error()})
}
// Cifrar contraseña solo si se provee una nueva (no es placeholder)
passEncrypted := inp.Password
if inp.Password != "" && inp.Password != "***" {
passEncrypted = utils.Encrypt(inp.Password, app.Http.Server.Key)
} else if inp.Password == "***" {
// Mantener contraseña ya guardada
if existing, err := models.GetSmtpConfig(); err == nil {
passEncrypted = existing.Password
}
}
cfg := models.SmtpConfig{
Host: inp.Host,
Port: inp.Port,
Username: inp.Username,
Password: passEncrypted,
Encryption: inp.Encryption,
FromAddress: inp.FromAddress,
FromName: inp.FromName,
}
if err := models.SaveSmtpConfig(cfg); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
// Recargar el mailer en memoria con la nueva config
app.Http.Mail.Host = cfg.Host
app.Http.Mail.Port = cfg.Port
app.Http.Mail.Username = cfg.Username
app.Http.Mail.Password = utils.Decrypt(passEncrypted, app.Http.Server.Key)
app.Http.Mail.Encryption = cfg.Encryption
app.Http.Mail.FromAddress = cfg.FromAddress
app.Http.Mail.FromName = cfg.FromName
app.Http.Mail.SetupMailer()
return c.JSON(fiber.Map{"message": "Configuración guardada", "ok": true})
}
func TestSmtpConfig(c *fiber.Ctx) error {
var body struct {
Email string `json:"email"`
}
if err := c.BodyParser(&body); err != nil || body.Email == "" {
return c.Status(400).JSON(fiber.Map{"error": "Email de destino requerido"})
}
// Recargar siempre la config activa desde BD para evitar usar credenciales
// del .env que pudieran estar desactualizadas en memoria.
cfg, err := models.GetSmtpConfig()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "No hay configuración SMTP activa"})
}
app.Http.Mail.Host = cfg.Host
app.Http.Mail.Port = cfg.Port
app.Http.Mail.Username = cfg.Username
app.Http.Mail.Password = utils.Decrypt(cfg.Password, app.Http.Server.Key)
app.Http.Mail.Encryption = cfg.Encryption
app.Http.Mail.FromAddress = cfg.FromAddress
app.Http.Mail.FromName = cfg.FromName
app.Http.Mail.SetupMailer()
htmlBody := "<h2>Test SMTP</h2><p>La configuración SMTP funciona correctamente.</p>"
if err := app.Http.Mail.Send(body.Email, "Test SMTP - U-site", htmlBody); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"message": "Correo de prueba enviado", "ok": true})
}