diff --git a/alert/init.go b/alert/init.go index e70e4a0..f56de9a 100644 --- a/alert/init.go +++ b/alert/init.go @@ -1,6 +1,8 @@ +// Package alert define alert event struct of modelRT project package alert import ( + "sort" "sync" "modelRT/constant" @@ -23,19 +25,57 @@ type Event struct { // EventManager define store and manager alert event struct type EventManager struct { + mu sync.RWMutex events map[constant.AlertLevel][]Event } -// AddEvent 添加一个新的报警事件 +// EventSet define alert event set implement sort.Interface +type EventSet []Event + +func (es EventSet) Len() int { + return len(es) +} + +func (es EventSet) Less(i, j int) bool { + return es[i].StartTime < es[j].StartTime +} + +func (es EventSet) Swap(i, j int) { + es[i], es[j] = es[j], es[i] +} + +// AddEvent define add a alert event to event manager func (am *EventManager) AddEvent(event Event) { + am.mu.Lock() + defer am.mu.Unlock() + am.events[event.Level] = append(am.events[event.Level], event) } -// GetEventsByLevel 根据报警等级查找报警事件 +// GetEventsByLevel define get alert event by alert level func (am *EventManager) GetEventsByLevel(level constant.AlertLevel) []Event { + am.mu.Lock() + defer am.mu.Unlock() + return am.events[level] } +// GetRangeEventsByLevel define get range alert event by alert level +func (am *EventManager) GetRangeEventsByLevel(targetLevel constant.AlertLevel) []Event { + var targetEvents []Event + + am.mu.Lock() + defer am.mu.Unlock() + + for level, events := range am.events { + if targetLevel <= level { + targetEvents = append(targetEvents, events...) + } + } + sort.Sort(EventSet(targetEvents)) + return targetEvents +} + // InitAlertEventManager define new alert event manager func InitAlertEventManager() *EventManager { return &EventManager{ diff --git a/config/config.go b/config/config.go index 0915713..57e917b 100644 --- a/config/config.go +++ b/config/config.go @@ -68,7 +68,7 @@ type ModelRTConfig struct { PostgresDBURI string `mapstructure:"-"` } -// ReadAndInitConfig return wave record project config struct +// ReadAndInitConfig return modelRT project config struct func ReadAndInitConfig(configDir, configName, configType string) (modelRTConfig ModelRTConfig) { config := viper.New() config.AddConfigPath(configDir) diff --git a/constant/alert.go b/constant/alert.go index 35739d5..5b6ed6f 100644 --- a/constant/alert.go +++ b/constant/alert.go @@ -33,3 +33,25 @@ func (a AlertLevel) String() string { return "Unknown" } } + +func (a AlertLevel) LevelCompare(b AlertLevel) bool { + return a <= b +} + +// // AlertLevelFromString convert string to alert level +// func AlertLevelFromString(level int64) AlertLevel { +// switch level { +// case : +// return AllAlertLevel +// case "INFO": +// return InfoAlertLevel +// case "WARNING": +// return WarningAlertLevel +// case "ERROR": +// return ErrorAlertLevel +// case "FATAL": +// return FatalAlertLevel +// default: +// return AllAlertLevel +// } +// } diff --git a/constant/log_mode.go b/constant/log_mode.go index a63a52a..bb5ace7 100644 --- a/constant/log_mode.go +++ b/constant/log_mode.go @@ -2,8 +2,8 @@ package constant const ( - // DevelopmentLogMode define development operator environment for wave record project + // DevelopmentLogMode define development operator environment for modelRT project DevelopmentLogMode = "development" - // ProductionLogMode define production operator environment for wave record project + // ProductionLogMode define production operator environment for modelRT project ProductionLogMode = "production" ) diff --git a/handler/alert_event_query.go b/handler/alert_event_query.go new file mode 100644 index 0000000..a652758 --- /dev/null +++ b/handler/alert_event_query.go @@ -0,0 +1,46 @@ +// Package handler provides HTTP handlers for various endpoints. +package handler + +import ( + "net/http" + "strconv" + + "modelRT/alert" + "modelRT/constant" + "modelRT/logger" + "modelRT/network" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +// QueryAlertEventHandler define query alert event process API +func QueryAlertEventHandler(c *gin.Context) { + var targetLevel constant.AlertLevel + + logger := logger.GetLoggerInstance() + alertManger := alert.GetAlertMangerInstance() + + levelStr := c.Query("level") + level, err := strconv.Atoi(levelStr) + if err != nil { + logger.Error("convert alert level string to int failed", zap.Error(err)) + + resp := network.FailureResponse{ + Code: -1, + Msg: err.Error(), + } + c.JSON(http.StatusOK, resp) + } + targetLevel = constant.AlertLevel(level) + events := alertManger.GetRangeEventsByLevel(targetLevel) + + resp := network.SuccessResponse{ + Code: 0, + Msg: "success", + PayLoad: map[string]interface{}{ + "events": events, + }, + } + c.JSON(http.StatusOK, resp) +} diff --git a/handler/anchor_point_replace.go b/handler/anchor_point_replace.go index eeef2d5..ba110e2 100644 --- a/handler/anchor_point_replace.go +++ b/handler/anchor_point_replace.go @@ -31,9 +31,10 @@ func ComponentAnchorReplaceHandler(c *gin.Context) { var request network.ComponetAnchorReplaceRequest if err := c.ShouldBindJSON(&request); err != nil { logger.Error("unmarshal component anchor point replace info failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), } c.JSON(http.StatusOK, resp) return @@ -45,9 +46,10 @@ func ComponentAnchorReplaceHandler(c *gin.Context) { result := pgClient.WithContext(cancelCtx).Model(&orm.Component{}).Where("global_uuid = ?", uuid).Find(&componentInfo) if result.Error != nil { logger.Error("query component detail info failed", zap.Error(result.Error)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: result.Error.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: result.Error.Error(), } c.JSON(http.StatusOK, resp) return @@ -56,9 +58,10 @@ func ComponentAnchorReplaceHandler(c *gin.Context) { if result.RowsAffected == 0 { err := fmt.Errorf("query component detail info by uuid failed:%w", constant.ErrQueryRowZero) logger.Error("query component detail info from table is empty", zap.String("table_name", "component")) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), } c.JSON(http.StatusOK, resp) return @@ -71,9 +74,10 @@ func ComponentAnchorReplaceHandler(c *gin.Context) { result = pgClient.WithContext(cancelCtx).Table(tableName).Where("global_uuid = ?", uuid).Find(&unmarshalMap) if result.Error != nil { logger.Error("query model detail info failed", zap.Error(result.Error)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: result.Error.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: result.Error.Error(), } c.JSON(http.StatusOK, resp) return @@ -82,9 +86,10 @@ func ComponentAnchorReplaceHandler(c *gin.Context) { if unmarshalMap == nil { err := fmt.Errorf("query model detail info by uuid failed:%w", constant.ErrQueryRowZero) logger.Error("query model detail info from table is empty", zap.String("table_name", tableName)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), } c.JSON(http.StatusOK, resp) return @@ -97,7 +102,8 @@ func ComponentAnchorReplaceHandler(c *gin.Context) { diagram.UpdateAnchorValue(componentInfo.ID, anchorName) resp := network.SuccessResponse{ - SuccessResponseHeader: network.SuccessResponseHeader{Status: http.StatusOK}, + Code: http.StatusOK, + Msg: "success", PayLoad: map[string]interface{}{ "uuid": request.UUID, }, diff --git a/handler/circuit_diagram_create.go b/handler/circuit_diagram_create.go index 9a06ac3..633cb8c 100644 --- a/handler/circuit_diagram_create.go +++ b/handler/circuit_diagram_create.go @@ -24,9 +24,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { var request network.CircuitDiagramCreateRequest if err := c.ShouldBindJSON(&request); err != nil { logger.Error("unmarshal circuit diagram create info failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), } c.JSON(http.StatusOK, resp) return @@ -35,9 +36,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": request.PageID, }, @@ -62,9 +64,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { } logger.Error("format uuid from string failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicLink, }, @@ -85,9 +88,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { tx.Rollback() logger.Error("create topologic info into DB failed", zap.Any("topologic_info", topologicCreateInfos), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_infos": topologicCreateInfos, }, @@ -106,9 +110,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { tx.Rollback() logger.Error("insert component info into DB failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "component_infos": request.ComponentInfos, }, @@ -123,9 +128,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { tx.Rollback() logger.Error("create component model into DB failed", zap.Any("component_infos", request.ComponentInfos), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": request.PageID, "component_infos": request.ComponentInfos, @@ -142,9 +148,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { tx.Rollback() logger.Error("unmarshal component params info failed", zap.String("component_params", componentInfo.Params), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, "component_params": componentInfo.Params, @@ -159,9 +166,10 @@ func CircuitDiagramCreateHandler(c *gin.Context) { tx.Rollback() 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, "component_params": componentInfo.Params, @@ -182,7 +190,8 @@ func CircuitDiagramCreateHandler(c *gin.Context) { // commit transaction tx.Commit() resp := network.SuccessResponse{ - SuccessResponseHeader: network.SuccessResponseHeader{Status: http.StatusOK}, + Code: http.StatusOK, + Msg: "success", PayLoad: map[string]interface{}{ "page_id": request.PageID, }, diff --git a/handler/circuit_diagram_delete.go b/handler/circuit_diagram_delete.go index 504adfc..4f8797c 100644 --- a/handler/circuit_diagram_delete.go +++ b/handler/circuit_diagram_delete.go @@ -29,9 +29,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { var request network.CircuitDiagramDeleteRequest if err := c.ShouldBindJSON(&request); err != nil { logger.Error("unmarshal circuit diagram del info failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), } c.JSON(http.StatusOK, resp) return @@ -40,9 +41,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": request.PageID, }, @@ -67,9 +69,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { } logger.Error("format uuid from string failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicLink, }, @@ -91,9 +94,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { tx.Rollback() logger.Error("delete topologic info into DB failed", zap.Any("topologic_info", topologicDelInfo), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicDelInfo, }, @@ -107,9 +111,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { tx.Rollback() logger.Error("delete topologic info failed", zap.Any("topologic_info", topologicDelInfo), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicDelInfo, }, @@ -132,9 +137,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { tx.Rollback() logger.Error("format uuid from string failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, }, @@ -155,9 +161,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { } logger.Error("query component info into postgresDB failed", zap.String("component_global_uuid", componentInfo.UUID), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, }, @@ -176,9 +183,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { } logger.Error("delete component info into postgresDB failed", zap.String("component_global_uuid", componentInfo.UUID), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, }, @@ -200,9 +208,10 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { msg := fmt.Sprintf("delete component info from table %s failed", modelStruct.ReturnTableName()) logger.Error(msg, zap.String("component_global_uuid", componentInfo.UUID), zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, }, @@ -222,7 +231,8 @@ func CircuitDiagramDeleteHandler(c *gin.Context) { // commit transaction tx.Commit() resp := network.SuccessResponse{ - SuccessResponseHeader: network.SuccessResponseHeader{Status: http.StatusOK}, + Code: http.StatusOK, + Msg: "success", PayLoad: map[string]interface{}{ "page_id": request.PageID, }, diff --git a/handler/circuit_diagram_load.go b/handler/circuit_diagram_load.go index e29d432..9174b6e 100644 --- a/handler/circuit_diagram_load.go +++ b/handler/circuit_diagram_load.go @@ -31,9 +31,10 @@ func CircuitDiagramLoadHandler(c *gin.Context) { pageID, err := strconv.ParseInt(c.Query("page_id"), 10, 64) if err != nil { logger.Error("get pageID from url param failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": pageID, }, @@ -45,9 +46,10 @@ func CircuitDiagramLoadHandler(c *gin.Context) { topologicInfo, err := diagram.GetGraphMap(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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": pageID, }, @@ -66,9 +68,9 @@ func CircuitDiagramLoadHandler(c *gin.Context) { if err != nil { logger.Error("get component id info from DB by uuid failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentUUID, }, @@ -80,9 +82,10 @@ func CircuitDiagramLoadHandler(c *gin.Context) { componentParams, err := diagram.GetComponentMap(component.ID) if err != nil { logger.Error("get component data from set by uuid failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentUUID, }, @@ -99,9 +102,9 @@ func CircuitDiagramLoadHandler(c *gin.Context) { if err != nil { logger.Error("get component id info from DB by uuid failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": topologicInfo.RootVertex, }, @@ -113,9 +116,10 @@ func CircuitDiagramLoadHandler(c *gin.Context) { rootComponentParam, err := diagram.GetComponentMap(rootComponent.ID) if err != nil { logger.Error("get component data from set by uuid failed", zap.Error(err)) - header := network.FailResponseHeader{Status: http.StatusBadRequest, ErrMsg: err.Error()} + resp := network.FailureResponse{ - FailResponseHeader: header, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": rootVertexUUID, }, @@ -128,10 +132,8 @@ func CircuitDiagramLoadHandler(c *gin.Context) { payLoad["component_params"] = componentParamMap resp := network.SuccessResponse{ - SuccessResponseHeader: network.SuccessResponseHeader{ - Status: http.StatusOK, - ErrMsg: "", - }, + Code: http.StatusOK, + Msg: "success", PayLoad: payLoad, } c.JSON(http.StatusOK, resp) diff --git a/handler/circuit_diagram_update.go b/handler/circuit_diagram_update.go index 60e0804..cd08bdb 100644 --- a/handler/circuit_diagram_update.go +++ b/handler/circuit_diagram_update.go @@ -22,9 +22,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), } c.JSON(http.StatusOK, resp) return @@ -33,9 +34,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": request.PageID, }, @@ -49,9 +51,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicLink, }, @@ -71,9 +74,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicChangeInfo, }, @@ -87,9 +91,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "topologic_info": topologicChangeInfo, }, @@ -103,9 +108,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": request.PageID, "component_info": request.ComponentInfos, @@ -120,9 +126,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "page_id": request.PageID, "component_info": request.ComponentInfos, @@ -137,9 +144,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, "component_params": componentInfo.Params, @@ -152,9 +160,10 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { 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, + Code: http.StatusBadRequest, + Msg: err.Error(), PayLoad: map[string]interface{}{ "uuid": componentInfo.UUID, "component_params": componentInfo.Params, @@ -176,7 +185,8 @@ func CircuitDiagramUpdateHandler(c *gin.Context) { tx.Commit() resp := network.SuccessResponse{ - SuccessResponseHeader: network.SuccessResponseHeader{Status: http.StatusOK}, + Code: http.StatusOK, + Msg: "success", PayLoad: map[string]interface{}{ "page_id": request.PageID, }, diff --git a/handler/real_time_data_query.go b/handler/real_time_data_query.go new file mode 100644 index 0000000..a8fc12f --- /dev/null +++ b/handler/real_time_data_query.go @@ -0,0 +1,46 @@ +// Package handler provides HTTP handlers for various endpoints. +package handler + +import ( + "net/http" + "strconv" + + "modelRT/alert" + "modelRT/constant" + "modelRT/logger" + "modelRT/network" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +// QueryRealTimeDataHandler define query real time data process API +func QueryRealTimeDataHandler(c *gin.Context) { + var targetLevel constant.AlertLevel + + logger := logger.GetLoggerInstance() + alertManger := alert.GetAlertMangerInstance() + + levelStr := c.Query("level") + level, err := strconv.Atoi(levelStr) + if err != nil { + logger.Error("convert alert level string to int failed", zap.Error(err)) + + resp := network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + } + c.JSON(http.StatusOK, resp) + } + targetLevel = constant.AlertLevel(level) + events := alertManger.GetRangeEventsByLevel(targetLevel) + + resp := network.SuccessResponse{ + Code: http.StatusOK, + Msg: "success", + PayLoad: map[string]interface{}{ + "events": events, + }, + } + c.JSON(http.StatusOK, resp) +} diff --git a/handler/real_time_data.go b/handler/real_time_data_receive.go similarity index 96% rename from handler/real_time_data.go rename to handler/real_time_data_receive.go index b5468b3..d84f534 100644 --- a/handler/real_time_data.go +++ b/handler/real_time_data_receive.go @@ -87,10 +87,10 @@ func RealTimeDataReceivehandler(c *gin.Context) { } func processResponse(code int64, msg string, payload map[string]interface{}) []byte { - resp := network.RealTimeDataReceiveResponse{ - Code: code, - Msg: msg, - PayLoad: payload, + resp := map[string]interface{}{ + "code": code, + "msg": msg, + "payload": payload, } respByte, err := jsoniter.Marshal(resp) diff --git a/logger/init.go b/logger/init.go index 5d5fb4f..63818f9 100644 --- a/logger/init.go +++ b/logger/init.go @@ -1,4 +1,4 @@ -// Package logger define log struct of wave record project +// Package logger define log struct of modelRT project package logger import ( diff --git a/main.go b/main.go index b3b17db..1bb84e0 100644 --- a/main.go +++ b/main.go @@ -127,6 +127,12 @@ func main() { // anchor api engine.POST("/model/anchor_replace", handler.ComponentAnchorReplaceHandler) + // alert api + engine.GET("/alert/events/query", handler.QueryAlertEventHandler) + + // real time data api + engine.GET("/rt/datas/query", handler.QueryRealTimeDataHandler) + // dashborad api dashboard := engine.Group("/dashboard", limiter.Middleware) { diff --git a/network/real_time_data_response.go b/network/real_time_data_response.go deleted file mode 100644 index 7a3c179..0000000 --- a/network/real_time_data_response.go +++ /dev/null @@ -1,9 +0,0 @@ -// Package network define struct of network operation -package network - -// RealTimeDataReceiveResponse defines response params of real time data receive api -type RealTimeDataReceiveResponse struct { - Code int64 `json:"code"` - Msg string `json:"msg"` - PayLoad map[string]interface{} `json:"payload"` -} diff --git a/network/response.go b/network/response.go index 26f4c93..7792bf5 100644 --- a/network/response.go +++ b/network/response.go @@ -1,22 +1,14 @@ // Package network define struct of network operation package network -type SuccessResponseHeader struct { - Status int `json:"status" example:"200"` - ErrMsg string `json:"err_msg"` -} - -type FailResponseHeader struct { - Status int `json:"status" example:"400"` - ErrMsg string `json:"err_msg"` -} - type FailureResponse struct { - FailResponseHeader `json:"header"` - PayLoad map[string]interface{} `json:"payload" swaggertype:"object,string" example:"key:value"` + Code int `json:"code" example:"200"` + Msg string `json:"msg"` + PayLoad map[string]interface{} `json:"payload" swaggertype:"object,string" example:"key:value"` } type SuccessResponse struct { - SuccessResponseHeader `json:"header"` - PayLoad map[string]interface{} `json:"payload" swaggertype:"object,string" example:"key:value"` + Code int `json:"code" example:"200"` + Msg string `json:"msg"` + PayLoad map[string]interface{} `json:"payload" swaggertype:"object,string" example:"key:value"` }