dataRT/route/api/event.go

218 lines
4.4 KiB
Go
Raw Normal View History

2025-10-23 18:02:29 +08:00
package api
2025-11-06 21:09:50 +08:00
import (
"datart/data/mongo"
"datart/log"
"errors"
"fmt"
"strconv"
2025-11-20 20:58:51 +08:00
"strings"
2025-11-06 21:09:50 +08:00
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"go.mongodb.org/mongo-driver/v2/bson"
)
const (
2025-11-20 20:58:51 +08:00
pageSizeLimit = 500
2025-11-06 21:09:50 +08:00
)
func (a *Api) GetEvents(ctx *gin.Context) {
filter, sort, pageNo, pageSize, err := a.checkAndGenGetEventsRequest(ctx)
if err != nil {
log.Error(err)
ctx.JSON(200, gin.H{
"code": 1,
"msg": err.Error(),
})
return
}
events, err := mongo.FindEventsWithPageLimit(ctx.Request.Context(), filter, sort, pageNo, pageSize)
if err != nil {
log.Error(err, fmt.Sprintf(" params: %v, %d, %d, %d", filter, sort, pageNo, pageSize))
ctx.JSON(200, gin.H{
"code": 2,
"msg": err.Error(),
})
return
}
ctx.JSON(200, gin.H{
"code": 0,
"msg": "success",
"data": events,
})
}
func (a *Api) PostUpsertEvents(ctx *gin.Context) {
2025-11-20 20:58:51 +08:00
noUUID, eventUUID, upsert, err := a.checkAndGenUpsertEventsRequest(ctx)
2025-11-06 21:09:50 +08:00
if err != nil {
log.Error(err)
ctx.JSON(200, gin.H{
"code": 1,
"msg": err.Error(),
})
return
}
2025-11-20 20:58:51 +08:00
if noUUID {
if err = mongo.InsertOneEvent(ctx.Request.Context(), upsert); err != nil {
log.Error(err, fmt.Sprintf(" params: %v", upsert))
ctx.JSON(200, gin.H{
"code": 2,
"msg": err.Error(),
})
return
}
} else if err = mongo.UpsertOneEvent(ctx.Request.Context(), bson.M{"event_uuid": eventUUID},
bson.M{"$set": bson.M(upsert)}); err != nil {
log.Error(err, fmt.Sprintf(" params: %v", upsert))
2025-11-06 21:09:50 +08:00
ctx.JSON(200, gin.H{
2025-11-20 20:58:51 +08:00
"code": 3,
2025-11-06 21:09:50 +08:00
"msg": err.Error(),
})
return
}
ctx.JSON(200, gin.H{
"code": 0,
"msg": "success",
})
}
func (a *Api) checkAndGenGetEventsRequest(ctx *gin.Context) (bson.M, int, int64, int64, error) {
uuidStr := ctx.Query("uuid")
if len(uuidStr) > 0 {
if uuid.Validate(uuidStr) != nil {
return nil, 0, -1, -1, errors.New("invalid uuid")
}
return bson.M{"event_uuid": uuidStr}, 0, -1, -1, nil
}
filter := bson.M{}
var err error
begin, end := int64(-1), int64(-1)
beginStr := ctx.Query("begin")
if len(beginStr) > 0 {
if begin, err = strconv.ParseInt(beginStr, 10, 64); err != nil {
return nil, 0, -1, -1, err
}
}
endStr := ctx.Query("end")
if len(endStr) > 0 {
if end, err = strconv.ParseInt(endStr, 10, 64); err != nil {
return nil, 0, -1, -1, err
}
}
if begin > 0 && end > 0 && begin > end {
return nil, 0, -1, -1, errors.New("invalid time")
}
switch {
case begin > 0 && end < 0:
filter["timestamp"] = bson.M{"$gte": begin}
case begin < 0 && end > 0:
filter["timestamp"] = bson.M{"$lte": end}
case begin > 0 && end > 0:
filter["timestamp"] = bson.M{"$gte": begin, "$lte": end}
}
2025-11-20 20:58:51 +08:00
statusStr := ctx.Query("status")
if len(statusStr) > 0 {
statusStrs := strings.Split(statusStr, ",")
statuss := make([]int, len(statusStrs))
for i := range statusStrs {
s, err := strconv.Atoi(statusStrs[i])
if err != nil {
return nil, 0, -1, -1, errors.New("invalid status")
}
statuss[i] = s
}
filter["status"] = bson.M{"$in": statuss}
}
2025-11-06 21:09:50 +08:00
var sort int
sortStr := ctx.Query("sort")
if len(sortStr) > 0 {
s, err := strconv.Atoi(sortStr)
if err != nil {
return nil, 0, -1, -1, err
}
if s != 1 && s != -1 {
return nil, 0, -1, -1, errors.New("invalid sort")
}
sort = s
}
pageNo, pageSize := -1, -1
pageNoStr := ctx.Query("page_no")
pageSizeStr := ctx.Query("page_size")
if len(pageNoStr) > 0 && len(pageSizeStr) > 0 {
pageNo, err = strconv.Atoi(pageNoStr)
if err != nil {
return nil, 0, -1, -1, err
}
pageSize, err = strconv.Atoi(pageSizeStr)
if err != nil {
return nil, 0, -1, -1, err
}
if pageNo <= 0 || pageSize <= 0 {
return nil, 0, -1, -1, errors.New("invalid page param")
}
if pageSize > pageSizeLimit {
pageSize = pageSizeLimit
}
}
return filter, sort, int64(pageNo), int64(pageSize), nil
}
2025-11-20 20:58:51 +08:00
func (a *Api) checkAndGenUpsertEventsRequest(ctx *gin.Context) (bool, string, map[string]any, error) {
2025-11-06 21:09:50 +08:00
e := map[string]any{}
err := ctx.ShouldBindJSON(&e)
if err != nil {
2025-11-20 20:58:51 +08:00
return false, "", nil, errors.New("invalid body param")
2025-11-06 21:09:50 +08:00
}
eventUUID := ""
2025-11-20 20:58:51 +08:00
noUUID := true
2025-11-06 21:09:50 +08:00
if eu, ok := e["event_uuid"]; ok {
if eUUID, ok := eu.(string); ok {
2025-11-20 20:58:51 +08:00
if uuid.Validate(eUUID) == nil {
2025-11-06 21:09:50 +08:00
eventUUID = eUUID
2025-11-20 20:58:51 +08:00
noUUID = false
2025-11-06 21:09:50 +08:00
}
}
}
2025-11-20 20:58:51 +08:00
if noUUID {
noUUID = true
if uid, err := uuid.NewV7(); err != nil {
return false, "", nil, err
} else {
eventUUID = uid.String()
e["event_uuid"] = eventUUID
}
}
return noUUID, eventUUID, e, nil
2025-11-06 21:09:50 +08:00
}