Files
soft_usite/pkg/models/websms_config.go
T
Lizandro GuarnizoandClaude Sonnet 4.6 704664afe7 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>
2026-06-23 23:13:57 -05:00

111 lines
3.6 KiB
Go

package models
import (
"crypto/rand"
"encoding/hex"
"github.com/sujit-baniya/fiber-boilerplate/app"
"gorm.io/gorm"
)
type WebSmsConfig struct {
gorm.Model
Username string `json:"username" gorm:"column:username;size:255;not null"`
ApiToken string `json:"api_token" gorm:"column:api_token;type:text;not null"`
Sender string `json:"sender" gorm:"column:sender;size:30"`
Notas string `json:"notas" gorm:"column:notas;type:text"`
Activo bool `json:"activo" gorm:"column:activo;default:true"`
SecretKey string `json:"secret_key" gorm:"column:secret_key;size:64;uniqueIndex"`
}
func generateWebSmsSecret() string {
b := make([]byte, 24)
rand.Read(b)
return "sms_" + hex.EncodeToString(b)
}
func (WebSmsConfig) TableName() string { return "websms_config" }
func GetWebSmsConfig() (*WebSmsConfig, error) {
var item WebSmsConfig
if err := app.Http.Database.DB.Where("activo = ?", true).Order("id DESC").First(&item).Error; err != nil {
return nil, err
}
return &item, nil
}
func SaveWebSmsConfig(s WebSmsConfig) error {
app.Http.Database.DB.Model(&WebSmsConfig{}).
Where("activo = ?", true).
Update("activo", false)
s.Activo = true
if s.ID > 0 {
// preserve existing secret_key
var existing WebSmsConfig
app.Http.Database.DB.First(&existing, s.ID)
if existing.SecretKey == "" {
existing.SecretKey = generateWebSmsSecret()
}
return app.Http.Database.DB.Model(&s).Updates(map[string]interface{}{
"username": s.Username,
"api_token": s.ApiToken,
"sender": s.Sender,
"notas": s.Notas,
"activo": true,
"secret_key": existing.SecretKey,
}).Error
}
s.SecretKey = generateWebSmsSecret()
return app.Http.Database.DB.Create(&s).Error
}
// ─── Log de SMS enviados ────────────────────────────────────────────────────
type WebSmsLog struct {
gorm.Model
Para string `json:"para" gorm:"column:para;size:30;index"`
Mensaje string `json:"mensaje" gorm:"column:mensaje;type:text"`
Status string `json:"status" gorm:"column:status;size:20"`
MsgID string `json:"msg_id" gorm:"column:msg_id;size:100"`
Error string `json:"error" gorm:"column:error;type:text"`
}
func (WebSmsLog) TableName() string { return "websms_log" }
func CreateWebSmsLog(entry *WebSmsLog) error {
return app.Http.Database.DB.Create(entry).Error
}
func GetWebSmsLogs(limit int) ([]WebSmsLog, error) {
var logs []WebSmsLog
if err := app.Http.Database.DB.Order("id DESC").Limit(limit).Find(&logs).Error; err != nil {
return nil, err
}
return logs, nil
}
// ─── Webhook ACK log ────────────────────────────────────────────────────────
type WebSmsWebhookLog struct {
gorm.Model
Tipo string `json:"tipo" gorm:"column:tipo;size:20;index"` // delivery | click | incoming
MsgID string `json:"msg_id" gorm:"column:msg_id;size:100;index"`
Para string `json:"para" gorm:"column:para;size:30"`
Status string `json:"status" gorm:"column:status;size:30"`
Raw string `json:"raw" gorm:"column:raw;type:text"`
}
func (WebSmsWebhookLog) TableName() string { return "websms_webhook_log" }
func CreateWebSmsWebhookLog(entry *WebSmsWebhookLog) error {
return app.Http.Database.DB.Create(entry).Error
}
func GetWebSmsWebhookLogs(limit int) ([]WebSmsWebhookLog, error) {
var logs []WebSmsWebhookLog
if err := app.Http.Database.DB.Order("id DESC").Limit(limit).Find(&logs).Error; err != nil {
return nil, err
}
return logs, nil
}