package api import ( "context" "datart/data" "datart/data/mongo" "datart/log" "errors" "fmt" "regexp" "github.com/gin-gonic/gin" ) func (a *Api) PostUploadAlarm(ctx *gin.Context) { alarm, ip, err := a.checkAndGenUploadAlarmRequest(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 } go func(e *mongo.Event) { if err := data.PublishEvent(context.Background(), e); err != nil { log.Error(err, fmt.Sprintf(" params: %v", e)) } }(event) ctx.JSON(200, gin.H{ "code": 0, "msg": "success", }) } func (a *Api) checkAndGenUploadAlarmRequest(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 }