up
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"github.com/sujit-baniya/fiber-boilerplate/app"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// SaasApiConfig almacena la configuración del endpoint externo al que se notifica
|
||||
// cuando un pago es confirmado para un producto SaaS.
|
||||
// La vinculación es: Contrato → Servicios (m2m) → servicio_id ↔ SaasProducto.ServicioID → SaasApiConfig.SaasID
|
||||
type SaasApiConfig struct {
|
||||
gorm.Model
|
||||
SaasID uint `json:"saas_id" gorm:"column:saas_id;not null;index"`
|
||||
SaasProducto SaasProducto `json:"saas_producto" gorm:"foreignKey:SaasID"`
|
||||
Nombre string `json:"nombre" gorm:"column:nombre;not null"` // etiqueta amigable
|
||||
// Pasarela que dispara este callback: dlocal | bold | ambas (default)
|
||||
Pasarela string `json:"pasarela" gorm:"column:pasarela;default:'ambas'"`
|
||||
EndpointURL string `json:"endpoint_url" gorm:"column:endpoint_url;type:text;not null"`
|
||||
Metodo string `json:"metodo" gorm:"column:metodo;default:'POST'"` // POST|PUT|GET
|
||||
ApiKeyHeader string `json:"api_key_header" gorm:"column:api_key_header"` // ej: "X-API-Key"
|
||||
ApiKeyValue string `json:"api_key_value" gorm:"column:api_key_value;type:text"` // valor secreto
|
||||
// PayloadTemplate es un JSON con marcadores que se reemplazarán antes de enviar.
|
||||
// Variables disponibles: {{.ContratoID}} {{.Referencia}} {{.Email}} {{.Monto}} {{.Moneda}} {{.SaasID}} {{.SaasSlug}} {{.Fuente}}
|
||||
PayloadTemplate string `json:"payload_template" gorm:"column:payload_template;type:text"`
|
||||
TimeoutSeg int `json:"timeout_seg" gorm:"column:timeout_seg;default:10"`
|
||||
Activo bool `json:"activo" gorm:"column:activo;default:true"`
|
||||
}
|
||||
|
||||
func (SaasApiConfig) TableName() string { return "saas_api_configs" }
|
||||
|
||||
// ─── SaasDispatchLog ──────────────────────────────────────────────────────────
|
||||
|
||||
// SaasDispatchLog registra cada intento de notificación a un SaaS externo.
|
||||
type SaasDispatchLog struct {
|
||||
gorm.Model
|
||||
SaasApiConfigID uint `json:"saas_api_config_id" gorm:"column:saas_api_config_id;index"`
|
||||
SaasApiConfig SaasApiConfig `json:"saas_api_config" gorm:"foreignKey:SaasApiConfigID"`
|
||||
ContratoID uint `json:"contrato_id" gorm:"column:contrato_id;index"`
|
||||
Referencia string `json:"referencia" gorm:"column:referencia"`
|
||||
PayerEmail string `json:"payer_email" gorm:"column:payer_email"`
|
||||
Fuente string `json:"fuente" gorm:"column:fuente"` // dlocal | bold | manual
|
||||
HttpStatus int `json:"http_status" gorm:"column:http_status"`
|
||||
Respuesta string `json:"respuesta" gorm:"column:respuesta;type:text"`
|
||||
ErrorMsg string `json:"error_msg" gorm:"column:error_msg;type:text"`
|
||||
Estado string `json:"estado" gorm:"column:estado"` // success | failed
|
||||
Intentos int `json:"intentos" gorm:"column:intentos;default:1"`
|
||||
}
|
||||
|
||||
func (SaasDispatchLog) TableName() string { return "saas_dispatch_logs" }
|
||||
|
||||
// ─── Queries SaasApiConfig ────────────────────────────────────────────────────
|
||||
|
||||
func GetAllSaasApiConfigs(limit, offset int) ([]SaasApiConfig, int64, error) {
|
||||
var items []SaasApiConfig
|
||||
var total int64
|
||||
db := app.Http.Database.DB.Model(&SaasApiConfig{}).Preload("SaasProducto")
|
||||
if err := db.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
if err := db.Order("created_at DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return items, total, nil
|
||||
}
|
||||
|
||||
func GetSaasApiConfigByID(id uint) (*SaasApiConfig, error) {
|
||||
var item SaasApiConfig
|
||||
if err := app.Http.Database.DB.Preload("SaasProducto").First(&item, id).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &item, nil
|
||||
}
|
||||
|
||||
// GetSaasApiConfigsBySaasIDs devuelve configuraciones activas para los saas_ids dados,
|
||||
// opcionalmente filtradas por pasarela ("dlocal", "bold" o "" para todas).
|
||||
func GetSaasApiConfigsBySaasIDs(saasIDs []uint, pasarela string) ([]SaasApiConfig, error) {
|
||||
if len(saasIDs) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
db := app.Http.Database.DB.
|
||||
Preload("SaasProducto").
|
||||
Where("saas_id IN ? AND activo = ?", saasIDs, true)
|
||||
if pasarela != "" {
|
||||
db = db.Where("pasarela = ? OR pasarela = 'ambas'", pasarela)
|
||||
}
|
||||
var items []SaasApiConfig
|
||||
if err := db.Find(&items).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
func CreateSaasApiConfig(item *SaasApiConfig) error {
|
||||
return app.Http.Database.DB.Create(item).Error
|
||||
}
|
||||
|
||||
func UpdateSaasApiConfig(item *SaasApiConfig) error {
|
||||
return app.Http.Database.DB.Save(item).Error
|
||||
}
|
||||
|
||||
func DeleteSaasApiConfig(id uint) error {
|
||||
return app.Http.Database.DB.Delete(&SaasApiConfig{}, id).Error
|
||||
}
|
||||
|
||||
// ─── Queries SaasDispatchLog ──────────────────────────────────────────────────
|
||||
|
||||
func SaveSaasDispatchLog(entry *SaasDispatchLog) error {
|
||||
return app.Http.Database.DB.Create(entry).Error
|
||||
}
|
||||
|
||||
func GetSaasDispatchLogs(limit, offset int) ([]SaasDispatchLog, int64, error) {
|
||||
var items []SaasDispatchLog
|
||||
var total int64
|
||||
db := app.Http.Database.DB.Model(&SaasDispatchLog{}).Preload("SaasApiConfig")
|
||||
if err := db.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
if err := db.Order("created_at DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return items, total, nil
|
||||
}
|
||||
Reference in New Issue
Block a user