package controller import ( "dypid/db" "dypid/global" "net/http" "strconv" "strings" "github.com/gin-gonic/gin" ) func ListTokenHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"result": db.ListToken()}) } func CreateTokenHandler(c *gin.Context) { //解析输入数据 input := struct { Token string `form:"token" binding:"required"` DedupObject string `form:"dedup_object" binding:"required"` DataFormat string `form:"data_format" binding:"required"` Notes string `form:"notes"` }{} if err := c.ShouldBindQuery(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "参数不能为空 " + err.Error()}) return } //创建Token err := db.CreateToken(input.Token, input.DedupObject, input.DataFormat, input.Notes) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } //返回 c.JSON(http.StatusOK, gin.H{"result": "ok"}) } func UpdateTokenHandler(c *gin.Context) { input := struct { Token string `form:"token" binding:"required"` DedupObject string `form:"dedup_object" binding:"required"` DataFormat string `form:"data_format" binding:"required"` Notes string `form:"notes"` }{} if err := c.ShouldBindQuery(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "参数不能为空 " + err.Error()}) return } err := db.UpdateToken(input.Token, input.DedupObject, input.DataFormat, input.Notes) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"result": "ok"}) } func DeleteTokenHandler(c *gin.Context) { input := struct { Token string `form:"token" binding:"required"` }{} if err := c.ShouldBindQuery(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "参数不能为空 " + err.Error()}) return } err := db.DeleteToken(input.Token) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"result": "ok"}) } func GetTokenInfoHandler(c *gin.Context) { input := struct { Token string `form:"token" binding:"required"` }{} if err := c.ShouldBindQuery(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Token不能为空"}) return } dedupObject, err := db.GetDedupObject(input.Token) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取去重对象失败 " + err.Error()}) return } dataFormat, err := db.GetDataFormat(input.Token) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取数据格式失败 " + err.Error()}) return } output := struct { Token string `json:"token"` DedupObject string `json:"dedup_object"` DataFormat string `json:"data_format"` DedupItemsNumber int64 `json:"dedup_items_number"` CacheListNumber int64 `json:"cache_list_number"` }{} output.Token = input.Token output.DedupObject = dedupObject output.DataFormat = dataFormat output.DedupItemsNumber = global.RDB.BFCard(global.RCtx, "dedup:"+input.Token+":"+dedupObject).Val() output.CacheListNumber = global.RDB.LLen(global.RCtx, "list:"+input.Token).Val() c.JSON(http.StatusOK, gin.H{"result": output}) } func DeleteTokenInfoHandler(c *gin.Context) { //解析输入数据 input := struct { Token string `form:"token" binding:"required"` DedupBF string `form:"dedup_bf"` CacheList string `form:"cache_list"` BothNumber string `form:"both_number"` }{} if err := c.ShouldBindQuery(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Token不能为空"}) return } //检查token是否存在 _, err := db.GetDedupObject(input.Token) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Token不存在" + err.Error()}) return } dedupObject, err := db.GetDedupObject(input.Token) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } //删除去重对象 switch input.DedupBF { case "": case "all": keys := global.RDB.Keys(global.RCtx, "dedup:"+input.Token+":*").Val() global.RDB.Del(global.RCtx, keys...) default: //TODO 不考虑单独删除指定数量去重参考值 _, err := strconv.Atoi(input.DedupBF) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "dedup_bf设置错误 " + err.Error()}) return } } switch input.CacheList { case "": case "all": global.RDB.Del(global.RCtx, "list:"+input.Token) default: i, err := strconv.Atoi(input.CacheList) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "cache_list设置错误 " + err.Error()}) return } global.RDB.LTrim(global.RCtx, "list:"+input.Token, 1, int64(-i)) } //TODO switch input.BothNumber { case "": default: i, err := strconv.Atoi(input.BothNumber) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "both_number设置错误 " + err.Error()}) return } result := global.RDB.LRange(global.RCtx, "list:"+input.Token, 1, int64(i)).Val() global.RDB.LTrim(global.RCtx, "list:"+input.Token, 1, int64(-i)) dataIndex, err := getDataIndex(input.Token) for _, s := range result { s2 := strings.Split(s, "----")[dataIndex[dedupObject]] global.RDB.CFDel(global.RCtx, "dedup:"+input.Token+":"+dedupObject, s2) } } //输出信息 c.JSON(http.StatusOK, gin.H{"result": "ok"}) }