Skip to content

Commit 4772ac2

Browse files
authored
Merge pull request #657 from actiontech/dms/feat-948
feat: DMS↔ODC 用户同步自愈(策略 A+B)
2 parents 6fc1ac8 + 9053c53 commit 4772ac2

5 files changed

Lines changed: 533 additions & 18 deletions

File tree

‎internal/apiserver/service/router.go‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,9 @@ func (s *APIServer) installController() error {
532532
}
533533
s.SqlWorkbenchController.SqlWorkbenchService.SetSqlResultMasker(masker)
534534

535+
// 策略 B:DMS 删用户时清理 SqlWorkbench 缓存/会话并禁用 ODC 对应用户
536+
s.DMSController.DMS.UserUsecase.SetSqlWorkbenchLifecycle(s.SqlWorkbenchController.SqlWorkbenchService)
537+
535538
// s.AuthController.RegisterPlugin(s.DMSController.GetRegisterPluginFn())
536539
return nil
537540
}

‎internal/dms/biz/user.go‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ type SqlWorkbenchUser struct {
217217
type SqlWorkbenchUserRepo interface {
218218
GetSqlWorkbenchUserByDMSUserID(ctx context.Context, dmsUserID string) (*SqlWorkbenchUser, bool, error)
219219
SaveSqlWorkbenchUserCache(ctx context.Context, user *SqlWorkbenchUser) error
220+
DeleteSqlWorkbenchUserCache(ctx context.Context, dmsUserID string) error
220221
}
221222

222223
// SqlWorkbenchDatasource SqlWorkbench数据源缓存
@@ -233,9 +234,15 @@ type SqlWorkbenchDatasourceRepo interface {
233234
GetSqlWorkbenchDatasourceByDMSDBServiceID(ctx context.Context, dmsDBServiceID, dmsUserID, purpose string) (*SqlWorkbenchDatasource, bool, error)
234235
SaveSqlWorkbenchDatasourceCache(ctx context.Context, datasource *SqlWorkbenchDatasource) error
235236
DeleteSqlWorkbenchDatasourceCache(ctx context.Context, dmsDBServiceID, dmsUserID, purpose string) error
237+
DeleteSqlWorkbenchDatasourceCachesByUserID(ctx context.Context, dmsUserID string) error
236238
GetSqlWorkbenchDatasourcesByUserID(ctx context.Context, dmsUserID string) ([]*SqlWorkbenchDatasource, error)
237239
}
238240

241+
// SqlWorkbenchLifecycle 删除 DMS 用户时的 SqlWorkbench/ODC 生命周期清理(策略 B)
242+
type SqlWorkbenchLifecycle interface {
243+
CleanupOnDMSUserDelete(ctx context.Context, dmsUserID, dmsUserName string) error
244+
}
245+
239246
type UserUsecase struct {
240247
tx TransactionGenerator
241248
repo UserRepo
@@ -247,9 +254,15 @@ type UserUsecase struct {
247254
ldapConfigurationUsecase *LDAPConfigurationUsecase
248255
cloudBeaverRepo CloudbeaverRepo
249256
gatewayUsecase *GatewayUsecase
257+
sqlWorkbenchLifecycle SqlWorkbenchLifecycle
250258
log *utilLog.Helper
251259
}
252260

261+
// SetSqlWorkbenchLifecycle 注入策略 B 清理能力(由 apiserver 在 SqlWorkbenchService 就绪后接线)
262+
func (d *UserUsecase) SetSqlWorkbenchLifecycle(lifecycle SqlWorkbenchLifecycle) {
263+
d.sqlWorkbenchLifecycle = lifecycle
264+
}
265+
253266
func NewUserUsecase(log utilLog.Logger, tx TransactionGenerator, repo UserRepo, userGroupRepo UserGroupRepo, pluginUsecase *PluginUsecase, opPermissionUsecase *OpPermissionUsecase,
254267
OpPermissionVerifyUsecase *OpPermissionVerifyUsecase, loginConfigurationUsecase *LoginConfigurationUsecase, ldapConfigurationUsecase *LDAPConfigurationUsecase, cloudBeaverRepo CloudbeaverRepo, gatewayUsecase *GatewayUsecase,
255268
) *UserUsecase {
@@ -719,6 +732,13 @@ func (d *UserUsecase) DelUser(ctx context.Context, currentUserUid, UserUid strin
719732
return fmt.Errorf("delete cloudbeaver cache failed: %v", err)
720733
}
721734

735+
// 策略 B:清 SqlWorkbench 缓存 + 会话,并对 ODC 对应用户禁用(ODC 失败不阻断)
736+
if d.sqlWorkbenchLifecycle != nil {
737+
if err := d.sqlWorkbenchLifecycle.CleanupOnDMSUserDelete(tx, UserUid, ds.Name); err != nil {
738+
return fmt.Errorf("delete sql workbench cache failed: %v", err)
739+
}
740+
}
741+
722742
if err := d.repo.DelUser(tx, UserUid); nil != err {
723743
return fmt.Errorf("delete user error: %v", err)
724744
}

‎internal/dms/storage/sql_workbench.go‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ func (sr *SqlWorkbenchRepo) SaveSqlWorkbenchUserCache(ctx context.Context, user
4545
})
4646
}
4747

48+
func (sr *SqlWorkbenchRepo) DeleteSqlWorkbenchUserCache(ctx context.Context, dmsUserID string) error {
49+
return transaction(sr.log, ctx, sr.db, func(tx *gorm.DB) error {
50+
if err := tx.WithContext(ctx).Where("dms_user_id = ?", dmsUserID).Delete(&model.SqlWorkbenchUserCache{}).Error; err != nil {
51+
return fmt.Errorf("failed to delete sql workbench user cache: %v", err)
52+
}
53+
return nil
54+
})
55+
}
56+
4857
func convertModelSqlWorkbenchUser(user *model.SqlWorkbenchUserCache) *biz.SqlWorkbenchUser {
4958
return &biz.SqlWorkbenchUser{
5059
DMSUserID: user.DMSUserID,
@@ -110,6 +119,15 @@ func (sr *SqlWorkbenchDatasourceRepo) DeleteSqlWorkbenchDatasourceCache(ctx cont
110119
})
111120
}
112121

122+
func (sr *SqlWorkbenchDatasourceRepo) DeleteSqlWorkbenchDatasourceCachesByUserID(ctx context.Context, dmsUserID string) error {
123+
return transaction(sr.log, ctx, sr.db, func(tx *gorm.DB) error {
124+
if err := tx.WithContext(ctx).Where("dms_user_id = ?", dmsUserID).Delete(&model.SqlWorkbenchDatasourceCache{}).Error; err != nil {
125+
return fmt.Errorf("failed to delete sql workbench datasource caches by user id: %v", err)
126+
}
127+
return nil
128+
})
129+
}
130+
113131
func (sr *SqlWorkbenchDatasourceRepo) GetSqlWorkbenchDatasourcesByUserID(ctx context.Context, dmsUserID string) ([]*biz.SqlWorkbenchDatasource, error) {
114132
var datasources []model.SqlWorkbenchDatasourceCache
115133
err := transaction(sr.log, ctx, sr.db, func(tx *gorm.DB) error {

0 commit comments

Comments
 (0)