From 7484243dff08bee22dbe87fda19f39fdc6ea8427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sat, 3 Jul 2021 15:45:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=9F=BA=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/metric_chart_dao.go | 143 +++++++++++++++++ internal/db/models/metric_chart_dao_test.go | 6 + internal/db/models/metric_chart_model.go | 32 ++++ internal/db/models/metric_chart_model_ext.go | 1 + internal/nodes/api_node_services.go | 5 + internal/rpc/services/service_metric_chart.go | 147 ++++++++++++++++++ 6 files changed, 334 insertions(+) create mode 100644 internal/db/models/metric_chart_dao.go create mode 100644 internal/db/models/metric_chart_dao_test.go create mode 100644 internal/db/models/metric_chart_model.go create mode 100644 internal/db/models/metric_chart_model_ext.go create mode 100644 internal/rpc/services/service_metric_chart.go diff --git a/internal/db/models/metric_chart_dao.go b/internal/db/models/metric_chart_dao.go new file mode 100644 index 00000000..9acd0d52 --- /dev/null +++ b/internal/db/models/metric_chart_dao.go @@ -0,0 +1,143 @@ +package models + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/errors" + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" +) + +const ( + MetricChartStateEnabled = 1 // 已启用 + MetricChartStateDisabled = 0 // 已禁用 +) + +type MetricChartDAO dbs.DAO + +func NewMetricChartDAO() *MetricChartDAO { + return dbs.NewDAO(&MetricChartDAO{ + DAOObject: dbs.DAOObject{ + DB: Tea.Env, + Table: "edgeMetricCharts", + Model: new(MetricChart), + PkName: "id", + }, + }).(*MetricChartDAO) +} + +var SharedMetricChartDAO *MetricChartDAO + +func init() { + dbs.OnReady(func() { + SharedMetricChartDAO = NewMetricChartDAO() + }) +} + +// EnableMetricChart 启用条目 +func (this *MetricChartDAO) EnableMetricChart(tx *dbs.Tx, chartId int64) error { + _, err := this.Query(tx). + Pk(chartId). + Set("state", MetricChartStateEnabled). + Update() + return err +} + +// DisableMetricChart 禁用条目 +func (this *MetricChartDAO) DisableMetricChart(tx *dbs.Tx, chartId int64) error { + _, err := this.Query(tx). + Pk(chartId). + Set("state", MetricChartStateDisabled). + Update() + return err +} + +// FindEnabledMetricChart 查找启用中的条目 +func (this *MetricChartDAO) FindEnabledMetricChart(tx *dbs.Tx, chartId int64) (*MetricChart, error) { + result, err := this.Query(tx). + Pk(chartId). + Attr("state", MetricChartStateEnabled). + Find() + if result == nil { + return nil, err + } + return result.(*MetricChart), err +} + +// FindMetricChartName 根据主键查找名称 +func (this *MetricChartDAO) FindMetricChartName(tx *dbs.Tx, chartId int64) (string, error) { + return this.Query(tx). + Pk(chartId). + Result("name"). + FindStringCol("") +} + +// CreateChart 创建图表 +func (this *MetricChartDAO) CreateChart(tx *dbs.Tx, itemId int64, name string, chartType string, widthDiv int32, maxItems int32, params maps.Map) (int64, error) { + op := NewMetricChartOperator() + op.ItemId = itemId + op.Name = name + op.Type = chartType + op.WidthDiv = widthDiv + op.MaxItems = maxItems + + if params == nil { + params = maps.Map{} + } + paramsJSON, err := json.Marshal(params) + if err != nil { + return 0, err + } + op.Params = paramsJSON + op.IsOn = true + op.State = MetricChartStateEnabled + return this.SaveInt64(tx, op) +} + +// UpdateChart 修改图表 +func (this *MetricChartDAO) UpdateChart(tx *dbs.Tx, chartId int64, name string, chartType string, widthDiv int32, maxItems int32, params maps.Map, isOn bool) error { + if chartId <= 0 { + return errors.New("invalid chartId") + } + op := NewMetricChartOperator() + op.Id = chartId + op.Name = name + op.Type = chartType + op.WidthDiv = widthDiv + op.MaxItems = maxItems + + if params == nil { + params = maps.Map{} + } + paramsJSON, err := json.Marshal(params) + if err != nil { + return err + } + op.Params = paramsJSON + + op.IsOn = isOn + + return this.Save(tx, op) +} + +// CountEnabledCharts 计算图表数量 +func (this *MetricChartDAO) CountEnabledCharts(tx *dbs.Tx, itemId int64) (int64, error) { + return this.Query(tx). + Attr("itemId", itemId). + State(MetricChartStateEnabled). + Count() +} + +// ListEnabledCharts 列出单页图表 +func (this *MetricChartDAO) ListEnabledCharts(tx *dbs.Tx, itemId int64, offset int64, size int64) (result []*MetricChart, err error) { + _, err = this.Query(tx). + Attr("itemId", itemId). + State(MetricChartStateEnabled). + Offset(offset). + Limit(size). + DescPk(). + Slice(&result). + FindAll() + return +} diff --git a/internal/db/models/metric_chart_dao_test.go b/internal/db/models/metric_chart_dao_test.go new file mode 100644 index 00000000..224e9db7 --- /dev/null +++ b/internal/db/models/metric_chart_dao_test.go @@ -0,0 +1,6 @@ +package models + +import ( + _ "github.com/go-sql-driver/mysql" + _ "github.com/iwind/TeaGo/bootstrap" +) diff --git a/internal/db/models/metric_chart_model.go b/internal/db/models/metric_chart_model.go new file mode 100644 index 00000000..3107b638 --- /dev/null +++ b/internal/db/models/metric_chart_model.go @@ -0,0 +1,32 @@ +package models + +// MetricChart 指标图表 +type MetricChart struct { + Id uint32 `field:"id"` // ID + ItemId uint32 `field:"itemId"` // 指标ID + Name string `field:"name"` // 名称 + Type string `field:"type"` // 图形类型 + WidthDiv int32 `field:"widthDiv"` // 宽度划分 + Params string `field:"params"` // 图形参数 + Order uint32 `field:"order"` // 排序 + IsOn uint8 `field:"isOn"` // 是否启用 + State uint8 `field:"state"` // 状态 + MaxItems uint32 `field:"maxItems"` // 最多条目 +} + +type MetricChartOperator struct { + Id interface{} // ID + ItemId interface{} // 指标ID + Name interface{} // 名称 + Type interface{} // 图形类型 + WidthDiv interface{} // 宽度划分 + Params interface{} // 图形参数 + Order interface{} // 排序 + IsOn interface{} // 是否启用 + State interface{} // 状态 + MaxItems interface{} // 最多条目 +} + +func NewMetricChartOperator() *MetricChartOperator { + return &MetricChartOperator{} +} diff --git a/internal/db/models/metric_chart_model_ext.go b/internal/db/models/metric_chart_model_ext.go new file mode 100644 index 00000000..2640e7f9 --- /dev/null +++ b/internal/db/models/metric_chart_model_ext.go @@ -0,0 +1 @@ +package models diff --git a/internal/nodes/api_node_services.go b/internal/nodes/api_node_services.go index 295a7259..cfa92261 100644 --- a/internal/nodes/api_node_services.go +++ b/internal/nodes/api_node_services.go @@ -458,6 +458,11 @@ func (this *APINode) registerServices(server *grpc.Server) { pb.RegisterMetricStatServiceServer(server, instance) this.rest(instance) } + { + instance := this.serviceInstance(&services.MetricChartService{}).(*services.MetricChartService) + pb.RegisterMetricChartServiceServer(server, instance) + this.rest(instance) + } // TODO check service names for serviceName := range server.GetServiceInfo() { diff --git a/internal/rpc/services/service_metric_chart.go b/internal/rpc/services/service_metric_chart.go new file mode 100644 index 00000000..1aaa6f4c --- /dev/null +++ b/internal/rpc/services/service_metric_chart.go @@ -0,0 +1,147 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package services + +import ( + "context" + "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" +) + +// MetricChartService 指标图表相关服务 +type MetricChartService struct { + BaseService +} + +// CreateMetricChart 创建图表 +func (this *MetricChartService) CreateMetricChart(ctx context.Context, req *pb.CreateMetricChartRequest) (*pb.CreateMetricChartResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + var params = maps.Map{} + if len(req.ParamsJSON) > 0 { + err = json.Unmarshal(req.ParamsJSON, ¶ms) + if err != nil { + return nil, err + } + } + chartId, err := models.SharedMetricChartDAO.CreateChart(tx, req.MetricItemId, req.Name, req.Type, req.WidthDiv, req.MaxItems, params) + if err != nil { + return nil, err + } + return &pb.CreateMetricChartResponse{MetricChartId: chartId}, nil +} + +// UpdateMetricChart 修改图表 +func (this *MetricChartService) UpdateMetricChart(ctx context.Context, req *pb.UpdateMetricChartRequest) (*pb.RPCSuccess, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + var params = maps.Map{} + if len(req.ParamsJSON) > 0 { + err = json.Unmarshal(req.ParamsJSON, ¶ms) + if err != nil { + return nil, err + } + } + err = models.SharedMetricChartDAO.UpdateChart(tx, req.MetricChartId, req.Name, req.Type, req.WidthDiv, req.MaxItems, params, req.IsOn) + if err != nil { + return nil, err + } + return this.Success() +} + +// FindEnabledMetricChart 查找单个图表 +func (this *MetricChartService) FindEnabledMetricChart(ctx context.Context, req *pb.FindEnabledMetricChartRequest) (*pb.FindEnabledMetricChartResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + chart, err := models.SharedMetricChartDAO.FindEnabledMetricChart(tx, req.MetricChartId) + if err != nil { + return nil, err + } + if chart == nil { + return &pb.FindEnabledMetricChartResponse{MetricChart: nil}, nil + } + return &pb.FindEnabledMetricChartResponse{ + MetricChart: &pb.MetricChart{ + Id: int64(chart.Id), + Name: chart.Name, + Type: chart.Type, + WidthDiv: types.Int32(chart.WidthDiv), + MaxItems: types.Int32(chart.MaxItems), + ParamsJSON: []byte(chart.Params), + IsOn: chart.IsOn == 1, + MetricItem: &pb.MetricItem{Id: int64(chart.ItemId)}, + }, + }, nil +} + +// CountEnabledMetricCharts 计算图表数量 +func (this *MetricChartService) CountEnabledMetricCharts(ctx context.Context, req *pb.CountEnabledMetricChartsRequest) (*pb.RPCCountResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + count, err := models.SharedMetricChartDAO.CountEnabledCharts(tx, req.MetricItemId) + if err != nil { + return nil, err + } + return this.SuccessCount(count) +} + +// ListEnabledMetricCharts 列出单页图表 +func (this *MetricChartService) ListEnabledMetricCharts(ctx context.Context, req *pb.ListEnabledMetricChartsRequest) (*pb.ListEnabledMetricChartsResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + charts, err := models.SharedMetricChartDAO.ListEnabledCharts(tx, req.MetricItemId, req.Offset, req.Size) + if err != nil { + return nil, err + } + var pbCharts []*pb.MetricChart + for _, chart := range charts { + pbCharts = append(pbCharts, &pb.MetricChart{ + Id: int64(chart.Id), + Name: chart.Name, + Type: chart.Type, + WidthDiv: types.Int32(chart.WidthDiv), + MaxItems: types.Int32(chart.MaxItems), + ParamsJSON: []byte(chart.Params), + IsOn: chart.IsOn == 1, + }) + } + return &pb.ListEnabledMetricChartsResponse{MetricCharts: pbCharts}, nil +} + +// DeleteMetricChart 删除图表 +func (this *MetricChartService) DeleteMetricChart(ctx context.Context, req *pb.DeleteMetricChartRequest) (*pb.RPCSuccess, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + err = models.SharedMetricChartDAO.DisableMetricChart(tx, req.MetricChartId) + if err != nil { + return nil, err + } + return this.Success() +}