@@ -89,9 +89,10 @@ type CloudbeaverUsecase struct {
8989 projectUsecase * ProjectUsecase
9090 repo CloudbeaverRepo
9191 proxyTargetRepo ProxyTargetRepo
92+ maintenanceTimeUsecase * MaintenanceTimeUsecase
9293}
9394
94- func NewCloudbeaverUsecase (log utilLog.Logger , cfg * CloudbeaverCfg , userUsecase * UserUsecase , dbServiceUsecase * DBServiceUsecase , opPermissionVerifyUsecase * OpPermissionVerifyUsecase , dmsConfigUseCase * DMSConfigUseCase , dataMaskingUseCase * DataMaskingUsecase , cloudbeaverRepo CloudbeaverRepo , proxyTargetRepo ProxyTargetRepo , cbOperationUseDase * CbOperationLogUsecase , projectUsecase * ProjectUsecase ) (cu * CloudbeaverUsecase ) {
95+ func NewCloudbeaverUsecase (log utilLog.Logger , cfg * CloudbeaverCfg , userUsecase * UserUsecase , dbServiceUsecase * DBServiceUsecase , opPermissionVerifyUsecase * OpPermissionVerifyUsecase , dmsConfigUseCase * DMSConfigUseCase , dataMaskingUseCase * DataMaskingUsecase , cloudbeaverRepo CloudbeaverRepo , proxyTargetRepo ProxyTargetRepo , cbOperationUseDase * CbOperationLogUsecase , projectUsecase * ProjectUsecase , maintenanceTimeUsecase * MaintenanceTimeUsecase ) (cu * CloudbeaverUsecase ) {
9596 cu = & CloudbeaverUsecase {
9697 repo : cloudbeaverRepo ,
9798 proxyTargetRepo : proxyTargetRepo ,
@@ -104,6 +105,7 @@ func NewCloudbeaverUsecase(log utilLog.Logger, cfg *CloudbeaverCfg, userUsecase
104105 projectUsecase : projectUsecase ,
105106 cloudbeaverCfg : cfg ,
106107 log : utilLog .NewHelper (log , utilLog .WithMessageKey ("biz.cloudbeaver" )),
108+ maintenanceTimeUsecase : maintenanceTimeUsecase ,
107109 }
108110
109111 // 启动缓存清理协程
@@ -629,6 +631,11 @@ func (cu *CloudbeaverUsecase) GraphQLDistributor() echo.MiddlewareFunc {
629631 return nil , c .JSON (http .StatusOK , convertToResp (ctx , resp ))
630632 }
631633
634+ // [运维时间管控检查] 在审核通过后、工单判断前检查运维时间管控
635+ if blocked , err := cu .checkMaintenanceTime (c , resp .Results , dbService ); blocked || err != nil {
636+ return nil , err
637+ }
638+
632639 // 判断是否需要通过工单执行(非 DQL 语句)
633640 if cu .shouldExecuteByWorkflow (dbService , resp .Results ) {
634641 return cu .executeNonDQLByWorkflow (ctx , c , dbService , params , resp )
@@ -2067,6 +2074,46 @@ func (cu *CloudbeaverUsecase) shouldExecuteByWorkflow(dbService *DBService, audi
20672074 return false
20682075}
20692076
2077+ // checkMaintenanceTime 检查运维时间管控(CloudBeaver工作台)
2078+ // 返回 blocked=true 表示已构造拦截响应,调用方应立即返回
2079+ func (cu * CloudbeaverUsecase ) checkMaintenanceTime (c echo.Context , auditResults []cloudbeaver.AuditSQLResV2 , dbService * DBService ) (blocked bool , err error ) {
2080+ if cu .maintenanceTimeUsecase == nil {
2081+ return false , fmt .Errorf ("maintenance time usecase is nil" )
2082+ }
2083+
2084+ currentUserUid , _ := c .Get (dmsUserIdKey ).(string )
2085+ if currentUserUid == "" {
2086+ return false , fmt .Errorf ("current user uid is empty" )
2087+ }
2088+
2089+ sqlTypes := make ([]string , 0 , len (auditResults ))
2090+ for _ , r := range auditResults {
2091+ sqlTypes = append (sqlTypes , r .SQLType )
2092+ }
2093+
2094+ var sqlQueryConfig * SQLQueryConfig
2095+ if dbService != nil && dbService .SQLEConfig != nil {
2096+ sqlQueryConfig = dbService .SQLEConfig .SQLQueryConfig
2097+ }
2098+
2099+ allowed , message , checkErr := cu .maintenanceTimeUsecase .CheckSQLExecutionAllowed (
2100+ c .Request ().Context (),
2101+ currentUserUid ,
2102+ sqlTypes ,
2103+ time .Now (),
2104+ sqlQueryConfig ,
2105+ )
2106+ if checkErr != nil {
2107+ cu .log .Errorf ("check maintenance time failed: %v" , checkErr )
2108+ return false , checkErr
2109+ }
2110+ if ! allowed {
2111+ return true , c .JSON (http .StatusOK ,
2112+ newResp (c .Request ().Context (), "Maintenance Time Blocked" , CBErrorCode , message ))
2113+ }
2114+ return false , nil
2115+ }
2116+
20702117// workflowExecParams 工单执行所需的参数
20712118type workflowExecParams struct {
20722119 contextIdStr string
0 commit comments