dataRT/route/api/alarm.go

96 lines
1.6 KiB
Go

package api
import (
"datart/data"
"datart/data/mongo"
"datart/log"
"errors"
"fmt"
"regexp"
"github.com/gin-gonic/gin"
)
func (a *Api) PostInsertAlarm(ctx *gin.Context) {
alarm, ip, err := a.checkAndGenInsertAlarmRequest(ctx)
if err != nil {
log.Error(err)
ctx.JSON(200, gin.H{
"code": 1,
"msg": "invalid param",
})
return
}
event, err := alarm.ConvertToEvent(ip)
if err != nil {
log.Error(err, fmt.Sprintf(" params: %v", alarm))
ctx.JSON(200, gin.H{
"code": 2,
"msg": "convert error",
})
return
}
err = mongo.InsertOneEvent(ctx.Request.Context(), event)
if err != nil {
log.Error(err, fmt.Sprintf(" params: %v", event))
ctx.JSON(200, gin.H{
"code": 3,
"msg": "insert error",
})
return
}
err = data.PublishEvent(ctx.Request.Context(), event)
if err != nil {
log.Error(err, fmt.Sprintf(" params: %v", event))
ctx.JSON(200, gin.H{
"code": 4,
"msg": "publish error",
})
return
}
ctx.JSON(200, gin.H{
"code": 0,
"msg": "success",
})
}
func (a *Api) checkAndGenInsertAlarmRequest(ctx *gin.Context) (*mongo.Alarm, string, error) {
alarm := new(mongo.Alarm)
err := ctx.ShouldBindJSON(alarm)
if err != nil {
return nil, "", err
}
ok, err := regexp.MatchString(`ssu\d{3}`, alarm.DeviceNo)
if err != nil {
return nil, "", err
}
if !ok {
return nil, "", errors.New("invalid device_no")
}
if alarm.AlarmCode < 1 || alarm.AlarmCode > 10 {
return nil, "", errors.New("invalid alarm_code")
}
if alarm.AlarmStatus < 0 || alarm.AlarmStatus > 1 {
return nil, "", errors.New("invalid alarm_status")
}
return alarm, ctx.RemoteIP(), nil
}