From 858d02f955432d83df47534342871ae263eb71c4 Mon Sep 17 00:00:00 2001 From: douxu Date: Wed, 27 Aug 2025 17:33:10 +0800 Subject: [PATCH] add attr handlers --- handler/attr_delete.go | 43 ++++++++++++++++++++++++++++++++ handler/attr_load.go | 53 ++++++++++++++++++++++++++++++++++++++++ handler/attr_update.go | 44 +++++++++++++++++++++++++++++++++ model/attribute_model.go | 11 +++++++++ network/attr_request.go | 18 ++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 handler/attr_delete.go create mode 100644 handler/attr_load.go create mode 100644 handler/attr_update.go create mode 100644 network/attr_request.go diff --git a/handler/attr_delete.go b/handler/attr_delete.go new file mode 100644 index 0000000..4154c31 --- /dev/null +++ b/handler/attr_delete.go @@ -0,0 +1,43 @@ +package handler + +import ( + "net/http" + + "modelRT/diagram" + "modelRT/logger" + "modelRT/network" + + "github.com/gin-gonic/gin" +) + +// AttrDeleteHandler deletes a data attribute +func AttrDeleteHandler(c *gin.Context) { + var request network.AttrDeleteRequest + if err := c.ShouldBindJSON(&request); err != nil { + logger.Error(c, "Failed to unmarshal attribute delete request", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + + rs := diagram.NewRedisString(c, request.AttrToken, "", 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{ + Code: http.StatusBadRequest, + Msg: err.Error(), + PayLoad: map[string]interface{}{"attr_token": request.AttrToken}, + }) + return + } + + c.JSON(http.StatusOK, network.SuccessResponse{ + Code: http.StatusOK, + Msg: "success", + PayLoad: map[string]interface{}{ + "attr_token": request.AttrToken, + }, + }) +} diff --git a/handler/attr_load.go b/handler/attr_load.go new file mode 100644 index 0000000..b043588 --- /dev/null +++ b/handler/attr_load.go @@ -0,0 +1,53 @@ +package handler + +import ( + "net/http" + + "modelRT/database" + "modelRT/logger" + "modelRT/network" + + "github.com/gin-gonic/gin" +) + +// AttrGetHandler retrieves the value of a data attribute +func AttrGetHandler(c *gin.Context) { + var request network.AttrGetRequest + if err := c.ShouldBindJSON(&request); err != nil { + logger.Error(c, "Failed to unmarshal attribute get request", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + + pgClient := database.GetPostgresDBClient() + tx := pgClient.Begin() + + attrModel, err := database.ParseAttrToken(c, tx, request.AttrToken) + if err != nil { + tx.Rollback() + logger.Error(c, "Failed to parse attribute token", "attr_token", request.AttrToken, "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + PayLoad: map[string]interface{}{"attr_token": request.AttrToken}, + }) + return + } + tx.Commit() + + // The GetAttrValue method is assumed to exist on the AttrModelInterface. + // You need to add this method to your attribute_model.go interface definition. + attrValue := attrModel.GetAttrValue() + + c.JSON(http.StatusOK, network.SuccessResponse{ + Code: http.StatusOK, + Msg: "success", + PayLoad: map[string]interface{}{ + "attr_token": request.AttrToken, + "attr_value": attrValue, + }, + }) +} diff --git a/handler/attr_update.go b/handler/attr_update.go new file mode 100644 index 0000000..8e158a6 --- /dev/null +++ b/handler/attr_update.go @@ -0,0 +1,44 @@ +package handler + +import ( + "net/http" + + "modelRT/diagram" + "modelRT/logger" + "modelRT/network" + + "github.com/gin-gonic/gin" +) + +// AttrSetHandler sets the value of a data attribute +func AttrSetHandler(c *gin.Context) { + var request network.AttrSetRequest + if err := c.ShouldBindJSON(&request); err != nil { + logger.Error(c, "Failed to unmarshal attribute set request", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + + // The logic for handling Redis operations directly from the handler + rs := diagram.NewRedisString(c, request.AttrToken, "", 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{ + Code: http.StatusBadRequest, + Msg: err.Error(), + PayLoad: map[string]interface{}{"attr_token": request.AttrToken}, + }) + return + } + + c.JSON(http.StatusOK, network.SuccessResponse{ + Code: http.StatusOK, + Msg: "success", + PayLoad: map[string]interface{}{ + "attr_token": request.AttrToken, + }, + }) +} diff --git a/model/attribute_model.go b/model/attribute_model.go index 8a08df0..4dc9400 100644 --- a/model/attribute_model.go +++ b/model/attribute_model.go @@ -11,6 +11,7 @@ type AttrModelInterface interface { GetZoneInfo() *orm.Zone GetStationInfo() *orm.Station GetComponentInfo() *orm.Component + GetAttrValue() interface{} // New method to get the attribute value IsLocal() bool } @@ -50,6 +51,11 @@ func (l *LongAttrInfo) IsLocal() bool { return true } +// GetAttrValue define return the attribute value +func (l *LongAttrInfo) GetAttrValue() interface{} { + return l.AttrValue +} + // ShortAttrInfo structure define short attribute key info of component type ShortAttrInfo struct { AttrGroupName string @@ -82,3 +88,8 @@ func (s *ShortAttrInfo) GetComponentInfo() *orm.Component { func (s *ShortAttrInfo) IsLocal() bool { return false } + +// GetAttrValue define return the attribute value +func (l *ShortAttrInfo) GetAttrValue() interface{} { + return l.AttrValue +} diff --git a/network/attr_request.go b/network/attr_request.go new file mode 100644 index 0000000..fad5edd --- /dev/null +++ b/network/attr_request.go @@ -0,0 +1,18 @@ +// Package network define struct of network operation +package network + +// AttrGetRequest defines the request payload for getting an attribute +type AttrGetRequest struct { + AttrToken string `json:"attr_token"` +} + +// AttrSetRequest defines the request payload for setting an attribute +type AttrSetRequest struct { + AttrToken string `json:"attr_token"` + AttrValue interface{} `json:"attr_value"` +} + +// AttrDeleteRequest defines the request payload for deleting an attribute +type AttrDeleteRequest struct { + AttrToken string `json:"attr_token"` +}