1
1
package v2
2
2
3
3
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"
4
12
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"
5
17
"github.com/labstack/echo/v4"
6
18
)
7
19
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
+
8
45
// GetInstanceTips get instance tip list
9
46
// @Summary 获取实例提示列表
10
47
// @Description get instance tip list
@@ -16,8 +53,100 @@ import (
16
53
// @Param filter_by_environment_tag query string false "filter by environment tag"
17
54
// @Param filter_workflow_template_id query string false "filter workflow template id"
18
55
// @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
20
57
// @router /v2/projects/{project_name}/instance_tips [get]
21
58
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
23
152
}
0 commit comments