2024-11-29 16:34:03 +08:00
package handler
import (
"fmt"
"net/http"
2024-12-04 15:57:11 +08:00
"modelRT/constant"
2024-12-02 16:13:16 +08:00
"modelRT/database"
2024-11-29 16:34:03 +08:00
"modelRT/diagram"
"modelRT/log"
2024-12-02 16:13:16 +08:00
"modelRT/model"
2024-11-29 16:34:03 +08:00
"modelRT/network"
"github.com/gin-gonic/gin"
2024-12-02 16:13:16 +08:00
jsoniter "github.com/json-iterator/go"
cmap "github.com/orcaman/concurrent-map/v2"
2024-11-29 16:34:03 +08:00
"go.uber.org/zap"
)
// CircuitDiagramUpdateHandler define circuit diagram update process API
func CircuitDiagramUpdateHandler ( c * gin . Context ) {
logger := log . GetLoggerInstance ( )
2024-12-02 16:13:16 +08:00
pgClient := database . GetPostgresDBClient ( )
2024-11-29 16:34:03 +08:00
var request network . CircuitDiagramUpdateRequest
if err := c . ShouldBindJSON ( & request ) ; err != nil {
logger . Error ( "unmarshal circuit diagram update info failed" , zap . Error ( err ) )
header := network . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : 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 . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
"page_id" : request . PageID ,
} ,
}
c . JSON ( http . StatusOK , resp )
return
}
2024-12-04 15:57:11 +08:00
var topologicChangeInfos [ ] network . TopologicUUIDChangeInfos
2024-12-03 16:38:17 +08:00
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 . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
"topologic_info" : topologicLink ,
} ,
2024-11-29 16:34:03 +08:00
}
2024-12-03 16:38:17 +08:00
c . JSON ( http . StatusOK , resp )
return
}
2024-12-04 15:57:11 +08:00
topologicChangeInfos = append ( topologicChangeInfos , changeInfo )
}
// open transaction
tx := pgClient . Begin ( )
for _ , topologicChangeInfo := range topologicChangeInfos {
err = database . UpdateTopologicIntoDB ( c , tx , request . PageID , topologicChangeInfo )
2024-12-03 16:38:17 +08:00
if err != nil {
2024-12-04 15:57:11 +08:00
tx . Rollback ( )
logger . Error ( "update topologic info into DB failed" , zap . Any ( "topologic_info" , topologicChangeInfo ) , zap . Error ( err ) )
2024-12-03 16:38:17 +08:00
header := network . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
2024-12-04 15:57:11 +08:00
"topologic_info" : topologicChangeInfo ,
2024-12-03 16:38:17 +08:00
} ,
2024-11-29 16:34:03 +08:00
}
2024-12-03 16:38:17 +08:00
c . JSON ( http . StatusOK , resp )
return
}
2024-11-29 16:34:03 +08:00
2024-12-04 15:57:11 +08:00
err = graph . UpdateEdge ( topologicChangeInfo )
2024-12-03 16:38:17 +08:00
if err != nil {
2024-12-04 15:57:11 +08:00
tx . Rollback ( )
logger . Error ( "update topologic info failed" , zap . Any ( "topologic_info" , topologicChangeInfo ) , zap . Error ( err ) )
2024-11-29 16:34:03 +08:00
header := network . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
2024-12-04 15:57:11 +08:00
"topologic_info" : topologicChangeInfo ,
2024-11-29 16:34:03 +08:00
} ,
}
c . JSON ( http . StatusOK , resp )
return
}
}
2024-12-02 16:13:16 +08:00
for _ , componentInfo := range request . ComponentInfos {
parseStruct := model . SelectModelByType ( componentInfo . ComponentType )
if parseStruct == nil {
2024-12-04 15:57:11 +08:00
tx . Rollback ( )
2024-12-02 16:13:16 +08:00
err := fmt . Errorf ( "can not get component model by model type %d" , componentInfo . ComponentType )
logger . Error ( "get component model by model type failed" , zap . String ( "uuid" , componentInfo . UUID ) , zap . Int ( "component_type" , componentInfo . ComponentType ) , zap . Error ( err ) )
header := network . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
"uuid" : componentInfo . UUID ,
"component_type" : componentInfo . ComponentType ,
} ,
}
c . JSON ( http . StatusOK , resp )
return
}
err := jsoniter . Unmarshal ( [ ] byte ( componentInfo . Params ) , parseStruct )
if err != nil {
2024-12-04 15:57:11 +08:00
tx . Rollback ( )
2024-12-02 16:13:16 +08:00
componentStructName := model . SelectModelNameByType ( componentInfo . ComponentType )
logger . Error ( "unmarshal component info by component struct failed" , zap . String ( "component_struct_name" , componentStructName ) , zap . Error ( err ) )
header := network . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
"uuid" : componentInfo . UUID ,
"component_type" : componentInfo . ComponentType ,
"component_struct_name" : componentStructName ,
} ,
}
c . JSON ( http . StatusOK , resp )
return
}
2024-12-04 15:57:11 +08:00
result := tx . Where ( "uuid = ?" , componentInfo . UUID ) . Save ( parseStruct )
2024-12-02 16:13:16 +08:00
if result . Error != nil || result . RowsAffected == 0 {
2024-12-04 15:57:11 +08:00
tx . Rollback ( )
2024-12-02 16:13:16 +08:00
err := result . Error
if result . RowsAffected == 0 {
2024-12-04 15:57:11 +08:00
err = fmt . Errorf ( "%w:please check where conditions" , constant . ErrUpdateRowZero )
2024-12-02 16:13:16 +08:00
}
logger . Error ( "store component info into postgresDB failed" , zap . Any ( "component_params" , parseStruct ) , zap . Error ( err ) )
header := network . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
"uuid" : componentInfo . UUID ,
"component_params" : parseStruct ,
} ,
}
c . JSON ( http . StatusOK , resp )
return
}
parseMap := cmap . New [ any ] ( )
err = parseMap . UnmarshalJSON ( [ ] 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 . ResponseHeader { Status : http . StatusBadRequest , ErrMsg : err . Error ( ) }
resp := network . BasicResponse {
ResponseHeader : header ,
PayLoad : map [ string ] interface { } {
"uuid" : componentInfo . UUID ,
"component_params" : componentInfo . Params ,
} ,
}
c . JSON ( http . StatusOK , resp )
return
}
diagram . UpdateComponentMap ( componentInfo . UUID , & parseMap )
}
2024-12-04 15:57:11 +08:00
// commit transsction
tx . Commit ( )
2024-12-02 16:13:16 +08:00
resp := network . BasicResponse {
ResponseHeader : network . ResponseHeader { Status : http . StatusOK } ,
PayLoad : map [ string ] interface { } {
"page_id" : request . PageID ,
} ,
}
c . JSON ( http . StatusOK , resp )
2024-11-29 16:34:03 +08:00
}