Skip to content

Commit 8c62f6f

Browse files
committed
refactor(api): migrate GetInstanceTips to v2 endpoint
- Move GetInstanceTips endpoint from v1 to v2 router - Implement new GetInstanceTips function in v2 with updated request and response models - Add support for filtering by environment tag and workflow template ID - Improve error handling and code organization
1 parent 4ef3718 commit 8c62f6f

File tree

3 files changed

+141
-80
lines changed

3 files changed

+141
-80
lines changed

sqle/api/app.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ func StartApi(net *gracenet.Net, exitChan chan struct{}, config *config.SqleOpti
251251
v1ProjectOpRouter.POST("/:project_name/audit_plans/:audit_plan_name/sqls/full", v1.FullSyncAuditPlanSQLs, sqleMiddleware.ScannerVerifier())
252252
v1ProjectOpRouter.POST("/:project_name/audit_plans/:audit_plan_name/sqls/partial", v1.PartialSyncAuditPlanSQLs, sqleMiddleware.ScannerVerifier())
253253

254-
// instance audti plan 实例智能扫描任务
254+
// instance audit plan 实例智能扫描任务
255255
v1ProjectOpRouter.POST("/:project_name/instance_audit_plans", v1.CreateInstanceAuditPlan)
256256
v1ProjectOpRouter.DELETE("/:project_name/instance_audit_plans/:instance_audit_plan_id/", v1.DeleteInstanceAuditPlan)
257257
v1ProjectOpRouter.PUT("/:project_name/instance_audit_plans/:instance_audit_plan_id/", v1.UpdateInstanceAuditPlan)
@@ -310,7 +310,7 @@ func StartApi(net *gracenet.Net, exitChan chan struct{}, config *config.SqleOpti
310310

311311
v1ProjectViewRouter.GET("/:project_name/instances/:instance_name/connection", v1.CheckInstanceIsConnectableByName)
312312
v1ProjectViewRouter.GET("/:project_name/instances/:instance_name/schemas", v1.GetInstanceSchemas)
313-
v1ProjectViewRouter.GET("/:project_name/instance_tips", v1.GetInstanceTips)
313+
v1ProjectViewRouter.GET("/:project_name/instance_tips", DeprecatedBy(dmsV1.GroupV2))
314314
v1ProjectViewRouter.GET("/:project_name/instances/:instance_name/rules", v1.GetInstanceRules)
315315
v1ProjectViewRouter.GET("/:project_name/instances/:instance_name/schemas/:schema_name/tables", v1.ListTableBySchema)
316316
v1ProjectViewRouter.GET("/:project_name/instances/:instance_name/schemas/:schema_name/tables/:table_name/metadata", v1.GetTableMetadata)
@@ -425,6 +425,7 @@ func StartApi(net *gracenet.Net, exitChan chan struct{}, config *config.SqleOpti
425425
v2ProjectViewRouter.GET("/:project_name/audit_plans", v2.GetAuditPlans)
426426
v2ProjectViewRouter.GET("/:project_name/audit_plans/:audit_plan_name/reports/:audit_plan_report_id/sqls/:number/analysis", v2.GetAuditPlanAnalysisData)
427427
v2ProjectViewRouter.GET("/:project_name/audit_plans/:audit_plan_name/reports/:audit_plan_report_id/sqls", v2.GetAuditPlanReportSQLs)
428+
v2ProjectViewRouter.GET("/:project_name/instance_tips", v2.GetInstanceTips)
428429

429430
// sql managers
430431
v2ProjectViewRouter.GET("/:project_name/sql_manages", v2.GetSqlManageList)

sqle/api/controller/v1/instance.go

Lines changed: 7 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"net/http"
77

88
baseV1 "github.com/actiontech/dms/pkg/dms-common/api/base/v1"
9-
dmsV1 "github.com/actiontech/dms/pkg/dms-common/api/dms/v1"
109
v1 "github.com/actiontech/dms/pkg/dms-common/api/dms/v1"
1110
"github.com/actiontech/sqle/sqle/api/controller"
1211
"github.com/actiontech/sqle/sqle/common"
@@ -17,8 +16,6 @@ import (
1716
"github.com/actiontech/sqle/sqle/log"
1817
"github.com/actiontech/sqle/sqle/model"
1918
"github.com/actiontech/sqle/sqle/pkg/params"
20-
"github.com/actiontech/sqle/sqle/server"
21-
opt "github.com/actiontech/sqle/sqle/server/optimization/rule"
2219
"github.com/actiontech/sqle/sqle/utils"
2320

2421
"github.com/labstack/echo/v4"
@@ -330,10 +327,10 @@ func GetInstanceSchemas(c echo.Context) error {
330327
}
331328

332329
const ( // InstanceTipReqV1.FunctionalModule Enums
333-
create_audit_plan = "create_audit_plan"
334-
create_workflow = "create_workflow"
335-
create_optimization = "create_optimization"
336-
create_pipeline = "create_pipeline"
330+
FunctionalModuleCreateAuditPlan = "create_audit_plan"
331+
FunctionalModuleCreateWorkflow = "create_workflow"
332+
FunctionalModuleCreateOptimization = "create_optimization"
333+
FunctionalModuleCreatePipeline = "create_pipeline"
337334
)
338335

339336
type InstanceTipReqV1 struct {
@@ -377,73 +374,7 @@ type GetInstanceTipsResV1 struct {
377374
// @Success 200 {object} v1.GetInstanceTipsResV1
378375
// @router /v1/projects/{project_name}/instance_tips [get]
379376
func GetInstanceTips(c echo.Context) error {
380-
req := new(InstanceTipReqV1)
381-
if err := controller.BindAndValidateReq(c, req); err != nil {
382-
return err
383-
}
384-
projectUid, err := dms.GetProjectUIDByName(context.TODO(), c.Param("project_name"))
385-
if err != nil {
386-
return controller.JSONBaseErrorReq(c, err)
387-
}
388-
389-
user, err := controller.GetCurrentUser(c, dms.GetUser)
390-
if err != nil {
391-
return controller.JSONBaseErrorReq(c, err)
392-
}
393-
394-
var operationType v1.OpPermissionType
395-
switch req.FunctionalModule {
396-
case create_audit_plan:
397-
operationType = v1.OpPermissionTypeSaveAuditPlan
398-
case create_workflow:
399-
operationType = v1.OpPermissionTypeCreateWorkflow
400-
case create_optimization:
401-
operationType = v1.OpPermissionTypeCreateOptimization
402-
case create_pipeline:
403-
operationType = v1.OpPermissionTypeCreatePipeline
404-
default:
405-
}
406-
dbServiceReq := &dmsV1.ListDBServiceReq{
407-
FilterByBusiness: req.FilterByBusiness,
408-
ProjectUid: projectUid,
409-
FilterByDBType: req.FilterDBType,
410-
}
411-
instances, err := GetCanOperationInstances(c.Request().Context(), user, dbServiceReq, operationType)
412-
if err != nil {
413-
return controller.JSONBaseErrorReq(c, err)
414-
}
415-
s := model.GetStorage()
416-
template, exist, err := s.GetWorkflowTemplateByProjectId(model.ProjectUID(projectUid))
417-
if err != nil {
418-
return controller.JSONBaseErrorReq(c, err)
419-
}
420-
if !exist {
421-
return controller.JSONBaseErrorReq(c, fmt.Errorf("current project doesn't has workflow template"))
422-
}
423-
instanceTipsResV1 := make([]InstanceTipResV1, 0, len(instances))
424-
svc := server.BackupService{}
425-
for _, inst := range instances {
426-
if operationType == v1.OpPermissionTypeCreateOptimization && !opt.CanOptimizeDbType(inst.DbType) {
427-
continue
428-
}
429-
instanceTipRes := InstanceTipResV1{
430-
ID: inst.GetIDStr(),
431-
Name: inst.Name,
432-
Type: inst.DbType,
433-
Host: inst.Host,
434-
Port: inst.Port,
435-
WorkflowTemplateId: uint32(template.ID),
436-
EnableBackup: inst.EnableBackup,
437-
BackupMaxRows: inst.BackupMaxRows,
438-
SupportedBackupStrategy: svc.SupportedBackupStrategy(inst.DbType),
439-
}
440-
instanceTipsResV1 = append(instanceTipsResV1, instanceTipRes)
441-
}
442-
443-
return c.JSON(http.StatusOK, &GetInstanceTipsResV1{
444-
BaseRes: controller.NewBaseReq(nil),
445-
Data: instanceTipsResV1,
446-
})
377+
return nil
447378
}
448379

449380
// GetInstanceRules get instance all rule
@@ -500,12 +431,12 @@ func CheckInstanceAndRuleTemplateDbType(ruleTemplates []*model.RuleTemplate, ins
500431
dbType := ruleTemplates[0].DBType
501432
for _, rt := range ruleTemplates {
502433
if rt.DBType != dbType {
503-
return errors.New(errors.DataInvalid, fmt.Errorf("instance's and ruleTemplate's dbtype should be the same"))
434+
return errors.New(errors.DataInvalid, fmt.Errorf("instance's and ruleTemplate's db type should be the same"))
504435
}
505436
}
506437
for _, inst := range instances {
507438
if inst.DbType != dbType {
508-
return errors.New(errors.DataInvalid, fmt.Errorf("instance's and ruleTemplate's dbtype should be the same"))
439+
return errors.New(errors.DataInvalid, fmt.Errorf("instance's and ruleTemplate's db type should be the same"))
509440
}
510441
}
511442
return nil

sqle/api/controller/v2/instance_audit_plan.go

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
11
package v2
22

33
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
8+
dmsCommonV1 "github.com/actiontech/dms/pkg/dms-common/api/dms/v1"
9+
dmsCommonV2 "github.com/actiontech/dms/pkg/dms-common/api/dms/v2"
10+
"github.com/actiontech/dms/pkg/dms-common/dmsobject"
11+
"github.com/actiontech/sqle/sqle/api/controller"
412
v1 "github.com/actiontech/sqle/sqle/api/controller/v1"
13+
"github.com/actiontech/sqle/sqle/dms"
14+
"github.com/actiontech/sqle/sqle/model"
15+
"github.com/actiontech/sqle/sqle/server"
16+
opt "github.com/actiontech/sqle/sqle/server/optimization/rule"
517
"github.com/labstack/echo/v4"
618
)
719

20+
type InstanceTipReqV2 struct {
21+
FilterDBType string `json:"filter_db_type" query:"filter_db_type"`
22+
FilterByEnvironmentTag string `json:"filter_by_environment_tag" query:"filter_by_environment_tag"`
23+
FilterWorkflowTemplateId uint32 `json:"filter_workflow_template_id" query:"filter_workflow_template_id"`
24+
FunctionalModule string `json:"functional_module" query:"functional_module" enums:"create_audit_plan,create_workflow,sql_manage,create_optimization,create_pipeline" valid:"omitempty,oneof=create_audit_plan create_workflow sql_manage create_optimization create_pipeline"`
25+
}
26+
27+
28+
type GetInstanceTipsResV2 struct {
29+
controller.BaseRes
30+
Data []InstanceTipResV2 `json:"data"`
31+
}
32+
33+
type InstanceTipResV2 struct {
34+
ID string `json:"instance_id"`
35+
Name string `json:"instance_name"`
36+
Type string `json:"instance_type"`
37+
WorkflowTemplateId uint32 `json:"workflow_template_id"`
38+
Host string `json:"host"`
39+
Port string `json:"port"`
40+
EnableBackup bool `json:"enable_backup"`
41+
SupportedBackupStrategy []string `json:"supported_backup_strategy" enums:"none,manual,reverse_sql,original_row"`
42+
BackupMaxRows uint64 `json:"backup_max_rows"`
43+
}
44+
845
// GetInstanceTips get instance tip list
946
// @Summary 获取实例提示列表
1047
// @Description get instance tip list
@@ -16,8 +53,100 @@ import (
1653
// @Param filter_by_environment_tag query string false "filter by environment tag"
1754
// @Param filter_workflow_template_id query string false "filter workflow template id"
1855
// @Param functional_module query string false "functional module" Enums(create_audit_plan,create_workflow,sql_manage,create_optimization,create_pipeline)
19-
// @Success 200 {object} v1.GetInstanceTipsResV1
56+
// @Success 200 {object} v2.GetInstanceTipsResV2
2057
// @router /v2/projects/{project_name}/instance_tips [get]
2158
func GetInstanceTips(c echo.Context) error {
22-
return v1.GetInstanceTips(c)
59+
req := new(InstanceTipReqV2)
60+
if err := controller.BindAndValidateReq(c, req); err != nil {
61+
return err
62+
}
63+
projectUid, err := dms.GetProjectUIDByName(context.TODO(), c.Param("project_name"))
64+
if err != nil {
65+
return controller.JSONBaseErrorReq(c, err)
66+
}
67+
68+
user, err := controller.GetCurrentUser(c, dms.GetUser)
69+
if err != nil {
70+
return controller.JSONBaseErrorReq(c, err)
71+
}
72+
73+
var operationType dmsCommonV1.OpPermissionType
74+
switch req.FunctionalModule {
75+
case v1.FunctionalModuleCreateAuditPlan:
76+
operationType = dmsCommonV1.OpPermissionTypeSaveAuditPlan
77+
case v1.FunctionalModuleCreateWorkflow:
78+
operationType = dmsCommonV1.OpPermissionTypeCreateWorkflow
79+
case v1.FunctionalModuleCreateOptimization:
80+
operationType = dmsCommonV1.OpPermissionTypeCreateOptimization
81+
case v1.FunctionalModuleCreatePipeline:
82+
operationType = dmsCommonV1.OpPermissionTypeCreatePipeline
83+
default:
84+
}
85+
dbServiceReq := &dmsCommonV2.ListDBServiceReq{
86+
FilterByEnvironmentTag: req.FilterByEnvironmentTag,
87+
ProjectUid: projectUid,
88+
FilterByDBType: req.FilterDBType,
89+
}
90+
91+
instances, err := GetCanOperationInstances(c.Request().Context(), user, dbServiceReq, operationType)
92+
if err != nil {
93+
return controller.JSONBaseErrorReq(c, err)
94+
}
95+
s := model.GetStorage()
96+
template, exist, err := s.GetWorkflowTemplateByProjectId(model.ProjectUID(projectUid))
97+
if err != nil {
98+
return controller.JSONBaseErrorReq(c, err)
99+
}
100+
if !exist {
101+
return controller.JSONBaseErrorReq(c, fmt.Errorf("current project doesn't has workflow template"))
102+
}
103+
104+
instanceTipsResV1 := make([]InstanceTipResV2, 0, len(instances))
105+
svc := server.BackupService{}
106+
for _, inst := range instances {
107+
if operationType == dmsCommonV1.OpPermissionTypeCreateOptimization && !opt.CanOptimizeDbType(inst.DbType) {
108+
continue
109+
}
110+
instanceTipRes := InstanceTipResV2{
111+
ID: inst.GetIDStr(),
112+
Name: inst.Name,
113+
Type: inst.DbType,
114+
Host: inst.Host,
115+
Port: inst.Port,
116+
WorkflowTemplateId: uint32(template.ID),
117+
EnableBackup: inst.EnableBackup,
118+
BackupMaxRows: inst.BackupMaxRows,
119+
SupportedBackupStrategy: svc.SupportedBackupStrategy(inst.DbType),
120+
}
121+
instanceTipsResV1 = append(instanceTipsResV1, instanceTipRes)
122+
}
123+
return c.JSON(http.StatusOK, &GetInstanceTipsResV2{
124+
BaseRes: controller.NewBaseReq(nil),
125+
Data: instanceTipsResV1,
126+
})
127+
}
128+
129+
// 根据用户权限获取能访问/操作的实例列表
130+
func GetCanOperationInstances(ctx context.Context, user *model.User, req *dmsCommonV2.ListDBServiceReq, operationType dmsCommonV1.OpPermissionType) ([]*model.Instance, error) {
131+
// 获取当前项目下指定数据库类型的全部实例
132+
instances, err := dms.GetInstancesInProjectByTypeAndBusiness(ctx, req.ProjectUid, req.FilterByDBType, req.FilterByEnvironmentTag)
133+
if err != nil {
134+
return nil, err
135+
}
136+
137+
userOpPermissions, isAdmin, err := dmsobject.GetUserOpPermission(ctx, req.ProjectUid, user.GetIDStr(), controller.GetDMSServerAddress())
138+
if err != nil {
139+
return nil, err
140+
}
141+
142+
if isAdmin || operationType == "" {
143+
return instances, nil
144+
}
145+
canOperationInstance := make([]*model.Instance, 0)
146+
for _, instance := range instances {
147+
if v1.CanOperationInstance(userOpPermissions, []dmsCommonV1.OpPermissionType{operationType}, instance) {
148+
canOperationInstance = append(canOperationInstance, instance)
149+
}
150+
}
151+
return canOperationInstance, nil
23152
}

0 commit comments

Comments
 (0)