From a9532debe95e33cbe4db0f9de7783c095662d0cc Mon Sep 17 00:00:00 2001 From: douxu Date: Tue, 16 Sep 2025 15:50:22 +0800 Subject: [PATCH] add client token of redis operation --- constants/error.go | 3 +++ database/filling_attr_model_info.go | 4 ++-- handler/attr_delete.go | 15 ++++++++++++++- handler/attr_load.go | 16 +++++++++++++++- handler/attr_update.go | 16 +++++++++++++++- handler/measurement_load.go | 28 ++++++++++++---------------- 6 files changed, 61 insertions(+), 21 deletions(-) diff --git a/constants/error.go b/constants/error.go index be09d80..5cd4291 100644 --- a/constants/error.go +++ b/constants/error.go @@ -31,3 +31,6 @@ var ( // ErrUnsupportedChannelPrefixType define error of unsupported channel prefix ErrUnsupportedChannelPrefixType = errors.New("unsupported channel prefix") ) + +// ErrGetClientToken define error of can not get client_token from context +var ErrGetClientToken = errors.New("can not get client_token from context") diff --git a/database/filling_attr_model_info.go b/database/filling_attr_model_info.go index e9d5c5a..6cf2a33 100644 --- a/database/filling_attr_model_info.go +++ b/database/filling_attr_model_info.go @@ -14,8 +14,8 @@ import ( ) // ParseAttrToken define return the attribute model interface based on the input attribute token. doc addr http://server.baseware.net:6875/books/product-design-docs/page/d6baf -func ParseAttrToken(ctx context.Context, tx *gorm.DB, attrToken string) (model.AttrModelInterface, error) { - rs := diagram.NewRedisString(ctx, attrToken, "", 10, true) +func ParseAttrToken(ctx context.Context, tx *gorm.DB, attrToken, clientToken string) (model.AttrModelInterface, error) { + rs := diagram.NewRedisString(ctx, attrToken, clientToken, 10, true) attrSlice := strings.Split(attrToken, ".") attrLen := len(attrSlice) diff --git a/handler/attr_delete.go b/handler/attr_delete.go index 4154c31..62f45fc 100644 --- a/handler/attr_delete.go +++ b/handler/attr_delete.go @@ -3,6 +3,7 @@ package handler import ( "net/http" + "modelRT/constants" "modelRT/diagram" "modelRT/logger" "modelRT/network" @@ -13,6 +14,18 @@ import ( // AttrDeleteHandler deletes a data attribute func AttrDeleteHandler(c *gin.Context) { var request network.AttrDeleteRequest + clientToken := c.GetString("client_token") + if clientToken == "" { + err := constants.ErrGetClientToken + + logger.Error(c, "failed to get client token from context", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + if err := c.ShouldBindJSON(&request); err != nil { logger.Error(c, "Failed to unmarshal attribute delete request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ @@ -22,7 +35,7 @@ func AttrDeleteHandler(c *gin.Context) { return } - rs := diagram.NewRedisString(c, request.AttrToken, "", 10, true) + rs := diagram.NewRedisString(c, request.AttrToken, clientToken, 10, true) if err := rs.GETDEL(request.AttrToken); err != nil { logger.Error(c, "Failed to delete attribute from Redis", "attr_token", request.AttrToken, "error", err) c.JSON(http.StatusOK, network.FailureResponse{ diff --git a/handler/attr_load.go b/handler/attr_load.go index b043588..7843551 100644 --- a/handler/attr_load.go +++ b/handler/attr_load.go @@ -3,6 +3,7 @@ package handler import ( "net/http" + "modelRT/constants" "modelRT/database" "modelRT/logger" "modelRT/network" @@ -13,6 +14,19 @@ import ( // AttrGetHandler retrieves the value of a data attribute func AttrGetHandler(c *gin.Context) { var request network.AttrGetRequest + + clientToken := c.GetString("client_token") + if clientToken == "" { + err := constants.ErrGetClientToken + + logger.Error(c, "failed to get client token from context", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + if err := c.ShouldBindJSON(&request); err != nil { logger.Error(c, "Failed to unmarshal attribute get request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ @@ -25,7 +39,7 @@ func AttrGetHandler(c *gin.Context) { pgClient := database.GetPostgresDBClient() tx := pgClient.Begin() - attrModel, err := database.ParseAttrToken(c, tx, request.AttrToken) + attrModel, err := database.ParseAttrToken(c, tx, request.AttrToken, clientToken) if err != nil { tx.Rollback() logger.Error(c, "Failed to parse attribute token", "attr_token", request.AttrToken, "error", err) diff --git a/handler/attr_update.go b/handler/attr_update.go index 8e158a6..92607f1 100644 --- a/handler/attr_update.go +++ b/handler/attr_update.go @@ -3,6 +3,7 @@ package handler import ( "net/http" + "modelRT/constants" "modelRT/diagram" "modelRT/logger" "modelRT/network" @@ -13,6 +14,19 @@ import ( // AttrSetHandler sets the value of a data attribute func AttrSetHandler(c *gin.Context) { var request network.AttrSetRequest + + clientToken := c.GetString("client_token") + if clientToken == "" { + err := constants.ErrGetClientToken + + logger.Error(c, "failed to get client token from context", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + if err := c.ShouldBindJSON(&request); err != nil { logger.Error(c, "Failed to unmarshal attribute set request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ @@ -23,7 +37,7 @@ func AttrSetHandler(c *gin.Context) { } // The logic for handling Redis operations directly from the handler - rs := diagram.NewRedisString(c, request.AttrToken, "", 10, true) + rs := diagram.NewRedisString(c, request.AttrToken, clientToken, 10, true) if err := rs.Set(request.AttrToken, request.AttrValue); err != nil { logger.Error(c, "Failed to set attribute value in Redis", "attr_token", request.AttrToken, "error", err) c.JSON(http.StatusOK, network.FailureResponse{ diff --git a/handler/measurement_load.go b/handler/measurement_load.go index 3e4b358..67e4bb1 100644 --- a/handler/measurement_load.go +++ b/handler/measurement_load.go @@ -4,6 +4,7 @@ package handler import ( "net/http" + "modelRT/constants" "modelRT/database" "modelRT/diagram" "modelRT/logger" @@ -15,22 +16,17 @@ import ( // MeasurementGetHandler retrieves the value of measurement data func MeasurementGetHandler(c *gin.Context) { var request network.MeasurementGetRequest - var clientToken string - // TODO 优化client_token获取 - token, ok := c.Get("client_token") - if ok { - // 将 token 断言为 ClientToken 类型 - clientToken, isClientToken := token.(string) - if !isClientToken { - // TODO 优化相关报错输出 - c.JSON(http.StatusOK, gin.H{ - "message": "Request processed successfully", - "token": clientToken, - }) - return - } - clientToken = token.(string) + clientToken := c.GetString("client_token") + if clientToken == "" { + err := constants.ErrGetClientToken + + logger.Error(c, "failed to get client token from context", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return } if err := c.ShouldBindJSON(&request); err != nil { @@ -41,7 +37,7 @@ func MeasurementGetHandler(c *gin.Context) { }) return } - // token 当前客户端的唯一标识(token),用于区分不同的客户端。 + zset := diagram.NewRedisZSet(c, request.MeasurementToken, clientToken, 0, false) points, err := zset.ZRANGE(request.MeasurementToken, 0, -1) if err != nil {