Files
2026-03-30 15:26:16 +08:00

298 lines
7.4 KiB
Go

package controllers
import (
"errors"
"strconv"
"git.apinb.com/bsm-sdk/core/infra"
"git.apinb.com/ops/logs/internal/impl"
"git.apinb.com/ops/logs/internal/ingest"
"git.apinb.com/ops/logs/internal/models"
"github.com/gin-gonic/gin"
)
func parseID(ctx *gin.Context) (uint, error) {
id64, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
if err != nil {
return 0, err
}
return uint(id64), nil
}
func ListSyslogRules(ctx *gin.Context) {
var rows []models.SyslogRule
if err := impl.DBService.Order("priority desc, id asc").Find(&rows).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"items": rows})
}
func CreateSyslogRule(ctx *gin.Context) {
var row models.SyslogRule
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = 0
if err := impl.DBService.Create(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func UpdateSyslogRule(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
var row models.SyslogRule
if err := impl.DBService.First(&row, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = id
if err := impl.DBService.Save(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func DeleteSyslogRule(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
if err := impl.DBService.Delete(&models.SyslogRule{}, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"deleted": id})
}
func ListTrapRules(ctx *gin.Context) {
var rows []models.TrapRule
if err := impl.DBService.Order("priority desc, id asc").Find(&rows).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"items": rows})
}
func CreateTrapRule(ctx *gin.Context) {
var row models.TrapRule
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = 0
if err := impl.DBService.Create(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func UpdateTrapRule(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
var row models.TrapRule
if err := impl.DBService.First(&row, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = id
if err := impl.DBService.Save(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func DeleteTrapRule(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
if err := impl.DBService.Delete(&models.TrapRule{}, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"deleted": id})
}
func ListTrapDictionary(ctx *gin.Context) {
var rows []models.TrapDictionaryEntry
if err := impl.DBService.Order("id asc").Find(&rows).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"items": rows})
}
func CreateTrapDictionary(ctx *gin.Context) {
var row models.TrapDictionaryEntry
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = 0
if err := impl.DBService.Create(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func UpdateTrapDictionary(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
var row models.TrapDictionaryEntry
if err := impl.DBService.First(&row, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = id
if err := impl.DBService.Save(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func DeleteTrapDictionary(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
if err := impl.DBService.Delete(&models.TrapDictionaryEntry{}, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"deleted": id})
}
func ListTrapShields(ctx *gin.Context) {
var rows []models.TrapShield
if err := impl.DBService.Order("id asc").Find(&rows).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"items": rows})
}
func CreateTrapShield(ctx *gin.Context) {
var row models.TrapShield
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = 0
if err := impl.DBService.Create(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func UpdateTrapShield(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
var row models.TrapShield
if err := impl.DBService.First(&row, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
if err := ctx.ShouldBindJSON(&row); err != nil {
infra.Response.Error(ctx, err)
return
}
row.ID = id
if err := impl.DBService.Save(&row).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, row)
}
func DeleteTrapShield(ctx *gin.Context) {
id, err := parseID(ctx)
if err != nil {
infra.Response.Error(ctx, errors.New("invalid id"))
return
}
if err := impl.DBService.Delete(&models.TrapShield{}, id).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
_ = ingest.Global.Refresh()
infra.Response.Success(ctx, gin.H{"deleted": id})
}
func ListLogEvents(ctx *gin.Context) {
kind := ctx.Query("source_kind")
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(ctx.DefaultQuery("page_size", "50"))
if page < 1 {
page = 1
}
if size < 1 || size > 500 {
size = 50
}
offset := (page - 1) * size
q := impl.DBService.Model(&models.LogEvent{})
if kind != "" {
q = q.Where("source_kind = ?", kind)
}
var total int64
_ = q.Count(&total).Error
var rows []models.LogEvent
if err := q.Order("id desc").Offset(offset).Limit(size).Find(&rows).Error; err != nil {
infra.Response.Error(ctx, err)
return
}
infra.Response.Success(ctx, gin.H{"total": total, "page": page, "page_size": size, "items": rows})
}