diff --git a/internal/dms/biz/db_service.go b/internal/dms/biz/db_service.go index 11aa5568..d9ce9d3a 100644 --- a/internal/dms/biz/db_service.go +++ b/internal/dms/biz/db_service.go @@ -218,21 +218,28 @@ func (d *DBServiceUsecase) CreateDBService(ctx context.Context, args *BizDBServi return "", fmt.Errorf("new db service failed: %w", err) } + err = d.createDBService(ctx, ds) + if err != nil { + return "", err + } + return ds.UID, nil +} + +func (d *DBServiceUsecase) createDBService(ctx context.Context, dbService *DBService) error { // 调用其他服务对数据源进行预检查 - if err = d.pluginUsecase.AddDBServicePreCheck(ctx, ds); err != nil { - return "", fmt.Errorf("precheck db service failed: %w", err) + if err := d.pluginUsecase.AddDBServicePreCheck(ctx, dbService); err != nil { + return fmt.Errorf("precheck db service failed: %w", err) } - if err = d.repo.SaveDBServices(ctx, []*DBService{ds}); err != nil { - return "", err + if err := d.repo.SaveDBServices(ctx, []*DBService{dbService}); err != nil { + return err } - err = d.pluginUsecase.OperateDataResourceHandle(ctx, ds.UID, dmsCommonV1.DataResourceTypeDBService, dmsCommonV1.OperationTypeCreate, dmsCommonV1.OperationTimingAfter) + err := d.pluginUsecase.AddDBServiceAfterHandle(ctx, dbService.UID) if err != nil { - return "", fmt.Errorf("plugin handle after craete db_service err: %v", err) + return fmt.Errorf("plugin handle after craete db_service err: %v", err) } - - return ds.UID, nil + return nil } type ListDBServicesOption struct { @@ -300,7 +307,7 @@ func (d *DBServiceUsecase) TestDbServiceConnections(ctx context.Context, DBServi dbService.LastConnectionTime = &connectionResult.TestConnectionTime dbService.LastConnectionErrorMsg = &connectionResult.ConnectErrorMessage - err = d.UpdateDBServiceByBiz(ctx, dbService, currentUserUid) + err = d.UpdateDBService(ctx, dbService, currentUserUid) if err != nil { d.log.Errorf("dbService name: %v,UpdateDBServiceByBiz err: %v", dbService.Name, err) } @@ -495,7 +502,7 @@ func (d *DBServiceUsecase) DelDBService(ctx context.Context, dbServiceUid, curre return fmt.Errorf("user is not project admin or golobal op permission user") } - err = d.pluginUsecase.OperateDataResourceHandle(ctx, ds.UID, dmsCommonV1.DataResourceTypeDBService, dmsCommonV1.OperationTypeDelete, dmsCommonV1.OperationTimingTypeBefore) + err = d.pluginUsecase.DelDBServicePreCheck(ctx, ds.UID) if err != nil { return fmt.Errorf("plugin handle before delete db_service err: %v", err) } @@ -504,7 +511,7 @@ func (d *DBServiceUsecase) DelDBService(ctx context.Context, dbServiceUid, curre return fmt.Errorf("delete data service error: %v", err) } - err = d.pluginUsecase.OperateDataResourceHandle(ctx, ds.UID, dmsCommonV1.DataResourceTypeDBService, dmsCommonV1.OperationTypeDelete, dmsCommonV1.OperationTimingAfter) + err = d.pluginUsecase.DelDBServiceAfterHandle(ctx, ds.UID) if err != nil { return fmt.Errorf("plugin handle after delete db_service err: %v", err) } @@ -574,7 +581,7 @@ func (d *DBServiceUsecase) TestDbServiceConnection(ctx context.Context, dbServic return connectionResult, nil } -func (d *DBServiceUsecase) UpdateDBServiceByBiz(ctx context.Context, ds *DBService, currentUserUid string) (err error) { +func (d *DBServiceUsecase) UpdateDBService(ctx context.Context, ds *DBService, currentUserUid string) (err error) { // 检查项目是否归档/删除 if err := d.projectUsecase.isProjectActive(ctx, ds.ProjectUID); err != nil { return fmt.Errorf("update db service error: %v", err) @@ -591,7 +598,7 @@ func (d *DBServiceUsecase) UpdateDBServiceByBiz(ctx context.Context, ds *DBServi return fmt.Errorf("update db service error: %v", err) } - err = d.pluginUsecase.OperateDataResourceHandle(ctx, ds.UID, dmsCommonV1.DataResourceTypeDBService, dmsCommonV1.OperationTypeUpdate, dmsCommonV1.OperationTimingAfter) + err = d.pluginUsecase.UpdateDBServiceAfterHandle(ctx, ds.UID) if err != nil { return fmt.Errorf("plugin handle after update db_service err: %v", err) } @@ -599,7 +606,7 @@ func (d *DBServiceUsecase) UpdateDBServiceByBiz(ctx context.Context, ds *DBServi return nil } -func (d *DBServiceUsecase) UpdateDBService(ctx context.Context, dbServiceUid string, updateDBService *BizDBServiceArgs, currentUserUid string) (err error) { +func (d *DBServiceUsecase) UpdateDBServiceByArgs(ctx context.Context, dbServiceUid string, updateDBService *BizDBServiceArgs, currentUserUid string) (err error) { ds, err := d.repo.GetDBService(ctx, dbServiceUid) if err != nil { return fmt.Errorf("get db service failed: %v", err) @@ -662,7 +669,7 @@ func (d *DBServiceUsecase) UpdateDBService(ctx context.Context, dbServiceUid str return fmt.Errorf("update db service error: %v", err) } - err = d.pluginUsecase.OperateDataResourceHandle(ctx, ds.UID, dmsCommonV1.DataResourceTypeDBService, dmsCommonV1.OperationTypeUpdate, dmsCommonV1.OperationTimingAfter) + err = d.pluginUsecase.UpdateDBServiceAfterHandle(ctx, ds.UID) if err != nil { return fmt.Errorf("plugin handle after update db_service err: %v", err) } diff --git a/internal/dms/biz/plugin.go b/internal/dms/biz/plugin.go index 0dd88214..a2f14a82 100644 --- a/internal/dms/biz/plugin.go +++ b/internal/dms/biz/plugin.go @@ -2,7 +2,9 @@ package biz import ( "context" + "encoding/json" "fmt" + "sync" pkgConst "github.com/actiontech/dms/internal/dms/pkg/constant" @@ -25,11 +27,10 @@ type PluginUsecase struct { } type Plugin struct { - Name string - AddDBServicePreCheckUrl string - DelDBServicePreCheckUrl string - DelUserPreCheckUrl string - DelUserGroupPreCheckUrl string + Name string + // 该地址目的是统一调用其他服务 数据资源变更前后校验/更新数据的 接口 + // eg: 删除数据源前: + // 需要sqle服务中实现接口逻辑,判断该数据源上已经没有进行中的工单 OperateDataResourceHandleUrl string } @@ -80,174 +81,154 @@ func (p *PluginUsecase) RegisterPlugin(ctx context.Context, plugin *Plugin, curr return nil } -func (p *PluginUsecase) AddDBServicePreCheck(ctx context.Context, ds *DBService) error { - dbService := &dmsV1.IPluginDBService{ - Name: ds.Name, - DBType: ds.DBType, - Host: ds.Host, - Port: ds.Port, - User: ds.User, - Business: ds.Business, - } - if ds.SQLEConfig != nil { - dbService.SQLERuleTemplateName = ds.SQLEConfig.RuleTemplateName - dbService.SQLERuleTemplateId = ds.SQLEConfig.RuleTemplateID - } - for _, plugin := range p.registeredPlugins { - if plugin.AddDBServicePreCheckUrl != "" { - if err := p.CallAddDBServicePreCheck(ctx, plugin.AddDBServicePreCheckUrl, dbService); err != nil { - return fmt.Errorf("plugin %s add db service pre check failed: %v", plugin.Name, err) - } - } +func (p *PluginUsecase) AddProjectAfterHandle(ctx context.Context, ProjectUid string) error { + if err := p.OperateDataResourceHandle(ctx, ProjectUid, nil, dmsV1.DataResourceTypeProject, dmsV1.OperationTypeCreate, dmsV1.OperationTimingTypeAfter); err != nil { + return fmt.Errorf("add project handle failed: %v", err) } return nil } -func (p *PluginUsecase) DelDBServicePreCheck(ctx context.Context, dbServiceUid string) error { - for _, plugin := range p.registeredPlugins { - if plugin.DelDBServicePreCheckUrl != "" { - if err := p.CallDelDBServicePreCheck(ctx, plugin.DelDBServicePreCheckUrl, dbServiceUid); err != nil { - return fmt.Errorf("plugin %s del db service pre check failed: %v", plugin.Name, err) - } - } +func (p *PluginUsecase) UpdateProjectPreCheck(ctx context.Context, project *Project) error { + // 项目归档 + if err := p.OperateDataResourceHandle(ctx, project.UID, dmsV1.IPluginProject{ + Name: project.Name, + Archived: project.Status == ProjectStatusArchived, + Desc: project.Desc, + }, dmsV1.DataResourceTypeProject, dmsV1.OperationTypeUpdate, dmsV1.OperationTimingTypeBefore); err != nil { + return fmt.Errorf("update project handle failed: %v", err) } return nil } -func (p *PluginUsecase) DelUserPreCheck(ctx context.Context, userUid string) error { - for _, plugin := range p.registeredPlugins { - if plugin.DelUserPreCheckUrl != "" { - if err := p.CallDelUserPreCheck(ctx, plugin.DelUserPreCheckUrl, userUid); err != nil { - return fmt.Errorf("plugin %s del user pre check failed: %v", plugin.Name, err) - } - } - } +func (p *PluginUsecase) UpdateProjectAfterHandle(ctx context.Context, projectUid string) error { return nil } -func (p *PluginUsecase) DelUserGroupPreCheck(ctx context.Context, groupUid string) error { - for _, plugin := range p.registeredPlugins { - if plugin.DelUserGroupPreCheckUrl != "" { - if err := p.CallDelUserGroupPreCheck(ctx, plugin.DelUserGroupPreCheckUrl, groupUid); err != nil { - return fmt.Errorf("plugin %s del user group pre check failed: %v", plugin.Name, err) - } - } +func (p *PluginUsecase) DelProjectPreCheck(ctx context.Context, projectUid string) error { + if err := p.OperateDataResourceHandle(ctx, projectUid, nil, dmsV1.DataResourceTypeProject, dmsV1.OperationTypeDelete, dmsV1.OperationTimingTypeBefore); err != nil { + return fmt.Errorf("del project pre check failed: %v", err) } return nil } -func (p *PluginUsecase) OperateDataResourceHandle(ctx context.Context, uid string, dateResourceType dmsV1.DataResourceType, - operationType dmsV1.OperationType, operationTiming dmsV1.OperationTimingType) error { - for _, plugin := range p.registeredPlugins { - if plugin.OperateDataResourceHandleUrl != "" { - if err := p.CallOperateDataResourceHandle(ctx, plugin.OperateDataResourceHandleUrl, uid, dateResourceType, operationType, operationTiming); err != nil { - return fmt.Errorf("call plugin %s operate data resource handle failed: %v", plugin.Name, err) - } - } +func (p *PluginUsecase) DelProjectAfterHandle(ctx context.Context, projectUid string) error { + if err := p.OperateDataResourceHandle(ctx, projectUid, nil, dmsV1.DataResourceTypeProject, dmsV1.OperationTypeDelete, dmsV1.OperationTimingTypeAfter); err != nil { + return fmt.Errorf("del project handle failed: %v", err) } return nil } -func (p *PluginUsecase) CallAddDBServicePreCheck(ctx context.Context, url string, ds *dmsV1.IPluginDBService) error { - header := map[string]string{ - "Authorization": pkgHttp.DefaultDMSToken, +func (p *PluginUsecase) AddDBServicePreCheck(ctx context.Context, ds *DBService) error { + dbService := &dmsV1.IPluginDBService{ + Name: ds.Name, + DBType: ds.DBType, + Host: ds.Host, + Port: ds.Port, + User: ds.User, + Business: ds.Business, + AdditionalParams: ds.AdditionalParams, } - - reqBody := struct { - DBService *dmsV1.IPluginDBService `json:"db_service"` - }{ - DBService: ds, + if ds.SQLEConfig != nil { + dbService.SQLERuleTemplateName = ds.SQLEConfig.RuleTemplateName + dbService.SQLERuleTemplateId = ds.SQLEConfig.RuleTemplateID } - reply := &dmsV1.AddDBServicePreCheckReply{} - - if err := pkgHttp.Get(ctx, url, header, reqBody, reply); err != nil { - return err - } - if reply.Code != 0 { - return fmt.Errorf("reply code(%v) error: %v", reply.Code, reply.Message) + if err := p.OperateDataResourceHandle(ctx, "", dbService, dmsV1.DataResourceTypeDBService, dmsV1.OperationTypeCreate, dmsV1.OperationTimingTypeBefore); err != nil { + return fmt.Errorf("add db service pre check failed: %v", err) } return nil } -func (p *PluginUsecase) CallDelDBServicePreCheck(ctx context.Context, url string, dbServiceUid string) error { - header := map[string]string{ - "Authorization": pkgHttp.DefaultDMSToken, +func (p *PluginUsecase) AddDBServiceAfterHandle(ctx context.Context, dbServiceUid string) error { + if err := p.OperateDataResourceHandle(ctx, dbServiceUid, nil, dmsV1.DataResourceTypeDBService, dmsV1.OperationTypeCreate, dmsV1.OperationTimingTypeAfter); err != nil { + return fmt.Errorf("add db service handle failed: %v", err) } - reqBody := struct { - DBServiceUid string `json:"db_service_uid"` - }{ - DBServiceUid: dbServiceUid, - } + return nil +} - reply := &dmsV1.DelDBServicePreCheckReply{} +func (p *PluginUsecase) UpdateDBServicePreCheck(ctx context.Context, ds *DBService) error { + return nil +} - if err := pkgHttp.Get(ctx, url, header, reqBody, reply); err != nil { - return err +func (p *PluginUsecase) UpdateDBServiceAfterHandle(ctx context.Context, dbServiceUid string) error { + if err := p.OperateDataResourceHandle(ctx, dbServiceUid, nil, dmsV1.DataResourceTypeDBService, dmsV1.OperationTypeUpdate, dmsV1.OperationTimingTypeAfter); err != nil { + return fmt.Errorf("update db service handle failed: %v", err) } - if reply.Code != 0 { - return fmt.Errorf("reply code(%v) error: %v", reply.Code, reply.Message) - } - return nil } -func (p *PluginUsecase) CallDelUserPreCheck(ctx context.Context, url string, userUid string) error { - header := map[string]string{ - "Authorization": pkgHttp.DefaultDMSToken, +func (p *PluginUsecase) DelDBServicePreCheck(ctx context.Context, dbServiceUid string) error { + if err := p.OperateDataResourceHandle(ctx, dbServiceUid, nil, dmsV1.DataResourceTypeDBService, dmsV1.OperationTypeDelete, dmsV1.OperationTimingTypeBefore); err != nil { + return fmt.Errorf("del db service pre check failed: %v", err) } + return nil +} - reqBody := struct { - UserUid string `json:"user_uid"` - }{ - UserUid: userUid, +func (p *PluginUsecase) DelDBServiceAfterHandle(ctx context.Context, dbServiceUid string) error { + if err := p.OperateDataResourceHandle(ctx, dbServiceUid, nil, dmsV1.DataResourceTypeDBService, dmsV1.OperationTypeDelete, dmsV1.OperationTimingTypeAfter); err != nil { + return fmt.Errorf("del db service handle failed: %v", err) } + return nil +} - reply := &dmsV1.DelUserPreCheckReply{} - - if err := pkgHttp.Get(ctx, url, header, reqBody, reply); err != nil { - return err - } - if reply.Code != 0 { - return fmt.Errorf("reply code(%v) error: %v", reply.Code, reply.Message) +func (p *PluginUsecase) DelUserPreCheck(ctx context.Context, userUid string) error { + if err := p.OperateDataResourceHandle(ctx, userUid, nil, dmsV1.DataResourceTypeUser, dmsV1.OperationTypeDelete, dmsV1.OperationTimingTypeBefore); err != nil { + return fmt.Errorf("del user pre check failed: %v", err) } + return nil +} +func (p *PluginUsecase) DelUserGroupPreCheck(ctx context.Context, groupUid string) error { return nil } -func (p *PluginUsecase) CallDelUserGroupPreCheck(ctx context.Context, url string, userGroupUid string) error { - header := map[string]string{ - "Authorization": pkgHttp.DefaultDMSToken, - } +func (p *PluginUsecase) OperateDataResourceHandle(ctx context.Context, uid string, resource interface{}, dateResourceType dmsV1.DataResourceType, + operationType dmsV1.OperationType, operationTiming dmsV1.OperationTimingType) error { + var ( + mu sync.Mutex + errs []error + wg sync.WaitGroup + ) - reqBody := struct { - UserGroupUid string `json:"user_group_uid"` - }{ - UserGroupUid: userGroupUid, + for _, plugin := range p.registeredPlugins { + if plugin.OperateDataResourceHandleUrl != "" { + wg.Add(1) + go func(plugin *Plugin) { + defer wg.Done() + if err := p.CallOperateDataResourceHandle(ctx, plugin.OperateDataResourceHandleUrl, uid, resource, dateResourceType, operationType, operationTiming); err != nil { + mu.Lock() + errs = append(errs, fmt.Errorf("call plugin %s operate data resource handle failed: %v", plugin.Name, err)) + mu.Unlock() + } + }(plugin) + } } - reply := &dmsV1.DelUserGroupPreCheckReply{} - if err := pkgHttp.Get(ctx, url, header, reqBody, reply); err != nil { - return err - } - if reply.Code != 0 { - return fmt.Errorf("reply code(%v) error: %v", reply.Code, reply.Message) + wg.Wait() + + if len(errs) > 0 { + return fmt.Errorf("encountered errors: %v", errs) } return nil } -func (p *PluginUsecase) CallOperateDataResourceHandle(ctx context.Context, url string, dataResourceUid string, dataResourceType dmsV1.DataResourceType, operationType dmsV1.OperationType, operationTiming dmsV1.OperationTimingType) error { +func (p *PluginUsecase) CallOperateDataResourceHandle(ctx context.Context, url string, dataResourceUid string, resource interface{}, dataResourceType dmsV1.DataResourceType, operationType dmsV1.OperationType, operationTiming dmsV1.OperationTimingType) error { header := map[string]string{ "Authorization": pkgHttp.DefaultDMSToken, } + extraParams, err := json.Marshal(resource) + if err != nil { + return fmt.Errorf("marshal resource failed: %v", err) + } operateDataResourceHandleReq := dmsV1.OperateDataResourceHandleReq{ DataResourceUid: dataResourceUid, DataResourceType: dataResourceType, OperationType: operationType, OperationTiming: operationTiming, + ExtraParams: string(extraParams), } reply := &dmsV1.OperateDataResourceHandleReply{} diff --git a/internal/dms/service/db_service.go b/internal/dms/service/db_service.go index 23fd15c5..e8165957 100644 --- a/internal/dms/service/db_service.go +++ b/internal/dms/service/db_service.go @@ -74,7 +74,7 @@ func (d *DMSService) UpdateDBService(ctx context.Context, req *dmsV1.UpdateDBSer } } } - if err := d.DBServiceUsecase.UpdateDBService(ctx, req.DBServiceUid, args, currentUserUid); err != nil { + if err := d.DBServiceUsecase.UpdateDBServiceByArgs(ctx, req.DBServiceUid, args, currentUserUid); err != nil { return fmt.Errorf("update db service failed: %v", err) } @@ -384,6 +384,7 @@ func (d *DMSService) ListDBServices(ctx context.Context, req *dmsCommonV1.ListDB } filterBy := make([]pkgConst.FilterCondition, 0) + if req.FilterByBusiness != "" { filterBy = append(filterBy, pkgConst.FilterCondition{ Field: string(biz.DBServiceFieldBusiness), diff --git a/internal/dms/service/plugin.go b/internal/dms/service/plugin.go index 04362ff0..d4440c4f 100644 --- a/internal/dms/service/plugin.go +++ b/internal/dms/service/plugin.go @@ -17,10 +17,6 @@ func (d *DMSService) RegisterDMSPlugin(ctx context.Context, currentUserUid strin if err := d.PluginUsecase.RegisterPlugin(ctx, &biz.Plugin{ Name: req.Plugin.Name, - AddDBServicePreCheckUrl: req.Plugin.AddDBServicePreCheckUrl, - DelDBServicePreCheckUrl: req.Plugin.DelDBServicePreCheckUrl, - DelUserPreCheckUrl: req.Plugin.DelUserPreCheckUrl, - DelUserGroupPreCheckUrl: req.Plugin.DelUserGroupPreCheckUrl, OperateDataResourceHandleUrl: req.Plugin.OperateDataResourceHandleUrl, }, currentUserUid); err != nil { return fmt.Errorf("register dms plugin failed: %v", err) diff --git a/internal/dms/storage/convert.go b/internal/dms/storage/convert.go index 3e460da3..921e4921 100644 --- a/internal/dms/storage/convert.go +++ b/internal/dms/storage/convert.go @@ -577,10 +577,6 @@ func convertModelProxyTarget(t *model.ProxyTarget) (*biz.ProxyTarget, error) { func convertBizPlugin(t *biz.Plugin) (*model.Plugin, error) { return &model.Plugin{ Name: t.Name, - AddDBServicePreCheckUrl: t.AddDBServicePreCheckUrl, - DelDBServicePreCheckUrl: t.DelDBServicePreCheckUrl, - DelUserPreCheckUrl: t.DelUserPreCheckUrl, - DelUserGroupPreCheckUrl: t.DelUserGroupPreCheckUrl, OperateDataResourceHandleUrl: t.OperateDataResourceHandleUrl, }, nil } @@ -588,10 +584,6 @@ func convertBizPlugin(t *biz.Plugin) (*model.Plugin, error) { func convertModelPlugin(t *model.Plugin) (*biz.Plugin, error) { p := &biz.Plugin{ Name: t.Name, - AddDBServicePreCheckUrl: t.AddDBServicePreCheckUrl, - DelDBServicePreCheckUrl: t.DelDBServicePreCheckUrl, - DelUserPreCheckUrl: t.DelUserPreCheckUrl, - DelUserGroupPreCheckUrl: t.DelUserGroupPreCheckUrl, OperateDataResourceHandleUrl: t.OperateDataResourceHandleUrl, } return p, nil diff --git a/pkg/dms-common/api/dms/v1/plugin.go b/pkg/dms-common/api/dms/v1/plugin.go index e2d6f590..25e30e67 100644 --- a/pkg/dms-common/api/dms/v1/plugin.go +++ b/pkg/dms-common/api/dms/v1/plugin.go @@ -4,27 +4,9 @@ import ( "fmt" base "github.com/actiontech/dms/pkg/dms-common/api/base/v1" + "github.com/actiontech/dms/pkg/params" ) -// swagger:enum IPluginDBType -type IPluginDBType string - -const ( - IPluginDBTypeDBTypeMySQL IPluginDBType = "MySQL" - IPluginDBTypeDBTypeOceanBaseMySQL IPluginDBType = "OceanBaseMySQL" -) - -func ParseIPluginDBType(s string) (IPluginDBType, error) { - switch s { - case string(IPluginDBTypeDBTypeMySQL): - return IPluginDBTypeDBTypeMySQL, nil - case string(IPluginDBTypeDBTypeOceanBaseMySQL): - return IPluginDBTypeDBTypeOceanBaseMySQL, nil - default: - return "", fmt.Errorf("invalid db type: %s", s) - } -} - type IPluginDBService struct { Name string DBType string @@ -34,21 +16,25 @@ type IPluginDBService struct { Business string SQLERuleTemplateName string SQLERuleTemplateId string - // TODO: more + AdditionalParams params.Params `json:"additional_params" from:"additional_params"` +} + +type IPluginProject struct { + // Project name + Name string `json:"name"` + // Project is archived + Archived bool `json:"archived"` + // Project desc + Desc string `json:"desc"` } type Plugin struct { // 插件名称 Name string `json:"name" validate:"required"` - // 添加数据源预检查接口地址, 如果为空表示没有检查, eg: http://127.0.0.1:7602/v1/auth/services/precheck/add - AddDBServicePreCheckUrl string `json:"add_db_service_pre_check_url"` - // 删除数据源预检查接口地址, 如果为空表示没有检查, eg: http://127.0.0.1:7602/v1/auth/services/precheck/del - DelDBServicePreCheckUrl string `json:"del_db_service_pre_check_url"` - // 删除用户预检查接口地址,如果为空表示没有检查, eg: http://127.0.0.1:7602/v1/auth/users/precheck/del - DelUserPreCheckUrl string `json:"del_user_pre_check_url"` - // 删除用户组预检查接口地址,如果为空表示没有检查, eg: http://127.0.0.1:7602/v1/auth/usergroups/precheck/del - DelUserGroupPreCheckUrl string `json:"del_user_group_pre_check_url"` // 操作资源处理接口地址,如果为空表示没有检查, eg: http://127.0.0.1:7602/v1/auth/data_resource_operate/handle + // 该地址目的是统一调用其他服务 数据资源变更前后校验/更新数据的 接口 + // eg: 删除数据源前: + // 需要sqle服务中实现接口逻辑,判断该数据源上已经没有进行中的工单 OperateDataResourceHandleUrl string `json:"operate_data_resource_handle_url"` } @@ -70,86 +56,6 @@ type RegisterDMSPluginReply struct { base.GenericResp } -// swagger:parameters AddDBServicePreCheck -type AddDBServicePreCheckReq struct { - // Check if dms can add db service - // in:body - DBService *IPluginDBService `json:"db_service" validate:"required"` -} - -func (u *AddDBServicePreCheckReq) String() string { - if u == nil { - return "AddDBServicePreCheckReq{nil}" - } - return fmt.Sprintf("AddDBServicePreCheckReq{Name:%s,DBType:%s Host:%s}", u.DBService.Name, u.DBService.DBType, u.DBService.Host) -} - -// swagger:model AddDBServicePreCheckReply -type AddDBServicePreCheckReply struct { - // Generic reply - base.GenericResp -} - -// swagger:parameters DelDBServicePreCheck -type DelDBServicePreCheckReq struct { - // Check if dms can del db service - // in:body - DBServiceUid string `json:"db_service_uid" validate:"required"` -} - -func (u *DelDBServicePreCheckReq) String() string { - if u == nil { - return "DelDBServicePreCheckReq{nil}" - } - return fmt.Sprintf("DelDBServicePreCheckReq{Uid:%s}", u.DBServiceUid) -} - -// swagger:model DelDBServicePreCheckReply -type DelDBServicePreCheckReply struct { - // Generic reply - base.GenericResp -} - -// swagger:parameters DelUserPreCheck -type DelUserPreCheckReq struct { - // Check if dms can del db service - // in:body - UserUid string `json:"user_uid" validate:"required"` -} - -func (u *DelUserPreCheckReq) String() string { - if u == nil { - return "DelUserPreCheckReq{nil}" - } - return fmt.Sprintf("DelUserPreCheckReq{Uid:%s}", u.UserUid) -} - -// swagger:model DelUserPreCheckReply -type DelUserPreCheckReply struct { - // Generic reply - base.GenericResp -} - -// swagger:parameters DelUserGroupPreCheck -type DelUserGroupPreCheckReq struct { - // Check if dms can del db service - // in:body - UserGroupUid string `json:"user_group_uid" validate:"required"` -} - -func (u *DelUserGroupPreCheckReq) String() string { - if u == nil { - return "DelUserGroupPreCheckReq{nil}" - } - return fmt.Sprintf("DelUserGroupPreCheckReq{Uid:%s}", u.UserGroupUid) -} - -// swagger:model DelUserGroupPreCheckReply -type DelUserGroupPreCheckReply struct { - // Generic reply - base.GenericResp -} - // swagger:enum DataResourceType type DataResourceType string @@ -174,7 +80,7 @@ type OperationTimingType string const ( OperationTimingTypeBefore OperationTimingType = "before" - OperationTimingAfter OperationTimingType = "after" + OperationTimingTypeAfter OperationTimingType = "after" ) // swagger:parameters OperateDataResourceHandle @@ -183,7 +89,7 @@ type OperateDataResourceHandleReq struct { DataResourceType DataResourceType `json:"data_resource_type"` OperationType OperationType `json:"operation_type"` OperationTiming OperationTimingType `json:"operation_timing"` - // TODO ExtraParams need extra params for pre check? + ExtraParams string `json:"extra_params"` } // swagger:model OperateDataResourceHandleReply diff --git a/pkg/dms-common/dmsobject/plugin.go b/pkg/dms-common/dmsobject/plugin.go index e1a179ee..446a854c 100644 --- a/pkg/dms-common/dmsobject/plugin.go +++ b/pkg/dms-common/dmsobject/plugin.go @@ -12,13 +12,13 @@ var operateHandlers map[string]OperationHandler = make(map[string]OperationHandl // OperationHandler NOTE: // The implemented structure must be named[CamelCase] by the combination of DataResourceType, OperationType, and OperationTimingType type OperationHandler interface { - Handle(ctx context.Context, currentUserId string, objId string) error + Handle(ctx context.Context, currentUserId string, objId string, extraParams string) error } type DefaultOperateHandle struct { } -func (f DefaultOperateHandle) Handle(ctx context.Context, currentUserId string, objId string) error { +func (f DefaultOperateHandle) Handle(ctx context.Context, currentUserId string, objId string, extraParams string) error { return nil } diff --git a/pkg/params/params.go b/pkg/params/params.go index 57f47ad8..c2c94847 100644 --- a/pkg/params/params.go +++ b/pkg/params/params.go @@ -136,3 +136,13 @@ func (r *Params) Copy() Params { } return ps } + +type Enum struct { + Value string `json:"value"` + Desc string `json:"desc"` +} + +type ParamsWithEnums struct { + Param + Enums []Enum +}