feat: API pública para envío de SMS vía WebSMS
Agrega POST /api/sms/send autenticado con Bearer token (secret_key auto-generado en WebSmsConfig). Recibe numero y mensaje, llama a LabsMobile y registra el resultado en websms_log. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
df1eb75bdd
commit
704664afe7
@@ -1,6 +1,8 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
|
||||
@@ -146,6 +148,57 @@ func WebSmsClickWebhook(c *fiber.Ctx) error {
|
||||
return c.SendStatus(200)
|
||||
}
|
||||
|
||||
// ─── API pública ────────────────────────────────────────────────────────────
|
||||
|
||||
// ApiSendSms envía un SMS. Requiere Authorization: Bearer <secret_key>.
|
||||
// POST /api/sms/send { "numero": "573001234567", "mensaje": "Hola" }
|
||||
func ApiSendSms(c *fiber.Ctx) error {
|
||||
bearer := strings.TrimPrefix(c.Get("Authorization"), "Bearer ")
|
||||
if bearer == "" {
|
||||
return c.Status(401).JSON(fiber.Map{"error": "token requerido"})
|
||||
}
|
||||
|
||||
cfg, err := models.GetWebSmsConfig()
|
||||
if err != nil {
|
||||
return c.Status(503).JSON(fiber.Map{"error": "WebSMS no configurado"})
|
||||
}
|
||||
if cfg.SecretKey == "" || cfg.SecretKey != bearer {
|
||||
return c.Status(401).JSON(fiber.Map{"error": "token inválido"})
|
||||
}
|
||||
|
||||
type body struct {
|
||||
Numero string `json:"numero"`
|
||||
Mensaje string `json:"mensaje"`
|
||||
}
|
||||
var b body
|
||||
if err := c.BodyParser(&b); err != nil || b.Numero == "" || b.Mensaje == "" {
|
||||
return c.Status(400).JSON(fiber.Map{"error": "numero y mensaje son requeridos"})
|
||||
}
|
||||
|
||||
resp, err := services.SendWebSms(cfg, b.Numero, b.Mensaje)
|
||||
errStr := ""
|
||||
status := "ok"
|
||||
if err != nil {
|
||||
errStr = err.Error()
|
||||
status = "error"
|
||||
} else if resp != nil {
|
||||
status = resp.Code
|
||||
}
|
||||
|
||||
models.CreateWebSmsLog(&models.WebSmsLog{
|
||||
Para: b.Numero,
|
||||
Mensaje: b.Mensaje,
|
||||
Status: status,
|
||||
MsgID: func() string { if resp != nil { return resp.ID }; return "" }(),
|
||||
Error: errStr,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return c.Status(500).JSON(fiber.Map{"error": errStr})
|
||||
}
|
||||
return c.JSON(fiber.Map{"ok": true, "id": resp.ID})
|
||||
}
|
||||
|
||||
func WebSmsIncomingWebhook(c *fiber.Ctx) error {
|
||||
var payload services.WebSmsIncomingPayload
|
||||
if err := c.BodyParser(&payload); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user