diff --git a/plugin/api/data/api.go b/plugin/api/data/api.go new file mode 100644 index 00000000..c8f6d444 --- /dev/null +++ b/plugin/api/data/api.go @@ -0,0 +1,21 @@ +/* Copyright © INFINI Ltd. All rights reserved. + * Web: https://infinilabs.com + * Email: hello#infini.ltd */ + +package data + +import ( + "infini.sh/framework/core/api" + "infini.sh/framework/core/api/rbac/enum" +) + +type DataAPI struct { + api.Handler +} + +func InitAPI() { + dataApi := DataAPI{} + api.HandleAPIMethod(api.POST, "/data/export", dataApi.RequirePermission(dataApi.exportData, enum.PermissionAlertChannelRead, enum.PermissionAlertRuleRead)) + api.HandleAPIMethod(api.POST, "/data/import", dataApi.RequirePermission(dataApi.importData, enum.PermissionAlertChannelWrite, enum.PermissionAlertRuleWrite)) + +} \ No newline at end of file diff --git a/plugin/api/data/export.go b/plugin/api/data/export.go new file mode 100644 index 00000000..1b41c878 --- /dev/null +++ b/plugin/api/data/export.go @@ -0,0 +1,108 @@ +/* Copyright © INFINI Ltd. All rights reserved. + * Web: https://infinilabs.com + * Email: hello#infini.ltd */ + +package data + +import ( + "fmt" + log "github.com/cihub/seelog" + "infini.sh/console/model" + "infini.sh/console/model/alerting" + httprouter "infini.sh/framework/core/api/router" + "infini.sh/framework/core/orm" + "infini.sh/framework/core/util" + "net/http" +) + +func (h *DataAPI) exportData(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { + reqBody := &ExportDataRequest{} + err := h.DecodeJSON(req, &reqBody) + if err != nil { + log.Error(err) + h.WriteError(w, err.Error(), http.StatusInternalServerError) + return + } + var resBody []ExportData + for _, meta := range reqBody.Metadatas { + result, err := getExportData(meta.Type) + if err != nil { + log.Error(err) + h.WriteError(w, err.Error(), http.StatusInternalServerError) + return + } + resBody = append(resBody, ExportData{ + Type: meta.Type, + Data: result.Result, + }) + } + h.WriteJSON(w, resBody, http.StatusOK) + +} + +func (h *DataAPI) importData(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { + reqBody := []ExportData{} + err := h.DecodeJSON(req, &reqBody) + if err != nil { + log.Error(err) + h.WriteError(w, err.Error(), http.StatusInternalServerError) + return + } + err = indexExportData(reqBody) + if err != nil { + log.Error(err) + h.WriteError(w, err.Error(), http.StatusInternalServerError) + return + } + h.WriteAckOKJSON(w) +} + +func indexExportData(eds []ExportData) error { + for _, ed := range eds { + var obj interface{} + switch ed.Type { + case DataTypeAlertChannel: + obj = &alerting.Channel{} + case DataTypeAlertRule: + obj = &alerting.Rule{} + case DataTypeAlertEmailServer: + obj = &model.EmailServer{} + default: + return fmt.Errorf("unkonw data type: %s", ed.Type) + } + for _, row := range ed.Data { + buf := util.MustToJSONBytes(row) + err := util.FromJSONBytes(buf, obj) + if err != nil { + return err + } + err = orm.Save(nil, obj) + if err != nil { + return err + } + } + + } + return nil +} + +func getExportData(typ string) (*orm.Result, error) { + var obj interface{} + switch typ { + case DataTypeAlertChannel: + obj = alerting.Channel{} + case DataTypeAlertRule: + obj = alerting.Rule{} + case DataTypeAlertEmailServer: + obj = model.EmailServer{} + default: + return nil, fmt.Errorf("unkonw data type: %s", typ) + } + err, result := orm.Search(obj, &orm.Query{ + Size: 1000, + }) + if err != nil { + return nil, err + } + return &result, err +} \ No newline at end of file diff --git a/plugin/api/data/model.go b/plugin/api/data/model.go new file mode 100644 index 00000000..c87eae0f --- /dev/null +++ b/plugin/api/data/model.go @@ -0,0 +1,24 @@ +/* Copyright © INFINI Ltd. All rights reserved. + * Web: https://infinilabs.com + * Email: hello#infini.ltd */ + +package data + +type ExportDataRequest struct { + Metadatas []ExportMetadata `json:"metadatas"` +} + +type ExportMetadata struct { + Type string `json:"type"` +} + +type ExportData struct { + Type string `json:"type"` + Data []interface{} `json:"data"` +} + +const ( + DataTypeAlertRule = "AlertRule" + DataTypeAlertChannel = "AlertChannel" + DataTypeAlertEmailServer = "EmailServer" +) \ No newline at end of file diff --git a/plugin/api/init.go b/plugin/api/init.go index cbafd8b3..3dff42d6 100644 --- a/plugin/api/init.go +++ b/plugin/api/init.go @@ -1,6 +1,7 @@ package api import ( + "infini.sh/console/plugin/api/data" "infini.sh/console/plugin/api/email" "infini.sh/console/plugin/api/license" "path" @@ -77,4 +78,5 @@ func Init(cfg *config.AppConfig) { license.InitAPI() email.InitAPI() + data.InitAPI() }