// Package handler provides HTTP handlers for various endpoints. package handler import ( "net/http" "modelRT/database" "modelRT/diagram" "modelRT/logger" "modelRT/network" "github.com/bitly/go-simplejson" "github.com/gin-gonic/gin" "go.uber.org/zap" ) // CircuitDiagramUpdateHandler define circuit diagram update process API func CircuitDiagramUpdateHandler(c *gin.Context) { logger := logger.GetLoggerInstance() pgClient := database.GetPostgresDBClient() var request network.CircuitDiagramUpdateRequest if err := c.ShouldBindJSON(&request); err != nil { logger.Error("unmarshal circuit diagram update info failed", zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, } c.JSON(http.StatusOK, resp) return } graph, err := diagram.GetGraphMap(request.PageID) if err != nil { logger.Error("get topologic data from set by pageID failed", zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "page_id": request.PageID, }, } c.JSON(http.StatusOK, resp) return } var topologicChangeInfos []network.TopologicUUIDChangeInfos for _, topologicLink := range request.TopologicLinks { changeInfo, err := network.ParseUUID(topologicLink) if err != nil { logger.Error("format uuid from string failed", zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "topologic_info": topologicLink, }, } c.JSON(http.StatusOK, resp) return } topologicChangeInfos = append(topologicChangeInfos, changeInfo) } // open transaction tx := pgClient.Begin() for _, topologicChangeInfo := range topologicChangeInfos { err = database.UpdateTopologicIntoDB(c, tx, request.PageID, topologicChangeInfo) if err != nil { tx.Rollback() logger.Error("update topologic info into DB failed", zap.Any("topologic_info", topologicChangeInfo), zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "topologic_info": topologicChangeInfo, }, } c.JSON(http.StatusOK, resp) return } err = graph.UpdateEdge(topologicChangeInfo) if err != nil { tx.Rollback() logger.Error("update topologic info failed", zap.Any("topologic_info", topologicChangeInfo), zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "topologic_info": topologicChangeInfo, }, } c.JSON(http.StatusOK, resp) return } } for _, componentInfo := range request.ComponentInfos { componentID, err := database.UpdateComponentIntoDB(c, tx, componentInfo) if err != nil { logger.Error("udpate component info into DB failed", zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "page_id": request.PageID, "component_info": request.ComponentInfos, }, } c.JSON(http.StatusOK, resp) return } err = database.UpdateModelIntoDB(c, tx, componentID, componentInfo.ComponentType, componentInfo.Params) if err != nil { logger.Error("udpate component model info into DB failed", zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "page_id": request.PageID, "component_info": request.ComponentInfos, }, } c.JSON(http.StatusOK, resp) return } } for _, componentInfo := range request.ComponentInfos { paramsJSON, err := simplejson.NewJson([]byte(componentInfo.Params)) if err != nil { logger.Error("unmarshal component info by concurrent map failed", zap.String("component_params", componentInfo.Params), zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, "component_params": componentInfo.Params, }, } c.JSON(http.StatusOK, resp) return } componentMap, err := paramsJSON.Map() if err != nil { logger.Error("format params json info to map failed", zap.Error(err)) header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ FailResponseHeader: header, PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, "component_params": componentInfo.Params, }, } c.JSON(http.StatusOK, resp) return } diagram.UpdateComponentMap(componentInfo.UUID, componentMap) } if len(request.FreeVertexs) > 0 { for _, freeVertex := range request.FreeVertexs { graph.FreeVertexs[freeVertex] = struct{}{} } } // commit transaction tx.Commit() resp := network.SuccessResponse{ SuccessResponseHeader: network.SuccessResponseHeader{Status: http.StatusOK}, PayLoad: map[string]interface{}{ "page_id": request.PageID, }, } c.JSON(http.StatusOK, resp) }