MCPcopy Create free account
hub / github.com/bytebase/bytebase / checkAndGetDataSourceQueriable

Function checkAndGetDataSourceQueriable

backend/api/v1/sql_service.go:2268–2325  ·  view source on GitHub ↗
(
	ctx context.Context,
	storeInstance *store.Store,
	licenseService *enterprise.LicenseService,
	database *store.DatabaseMessage,
	dataSourceID string,
)

Source from the content-addressed store, hash-verified

2266}
2267
2268func checkAndGetDataSourceQueriable(
2269 ctx context.Context,
2270 storeInstance *store.Store,
2271 licenseService *enterprise.LicenseService,
2272 database *store.DatabaseMessage,
2273 dataSourceID string,
2274) (*storepb.DataSource, error) {
2275 if dataSourceID == "" {
2276 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("data source id is required"))
2277 }
2278
2279 instance, err := storeInstance.GetInstance(ctx, &store.FindInstanceMessage{Workspace: common.GetWorkspaceIDFromContext(ctx), ResourceID: &database.InstanceID})
2280 if err != nil {
2281 return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to get instance %v with error: %v", database.InstanceID, err.Error()))
2282 }
2283 if instance == nil {
2284 return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("instance %q not found", database.InstanceID))
2285 }
2286 dataSource := func() *storepb.DataSource {
2287 for _, ds := range instance.Metadata.GetDataSources() {
2288 if ds.GetId() == dataSourceID {
2289 return ds
2290 }
2291 }
2292 return nil
2293 }()
2294 if dataSource == nil {
2295 return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("data source %q not found", dataSourceID))
2296 }
2297
2298 // Always allow non-admin data source.
2299 if dataSource.GetType() != storepb.DataSourceType_ADMIN {
2300 if err := licenseService.IsFeatureEnabledForInstance(ctx, common.GetWorkspaceIDFromContext(ctx), v1pb.PlanFeature_FEATURE_INSTANCE_READ_ONLY_CONNECTION, instance); err != nil {
2301 return nil, connect.NewError(connect.CodePermissionDenied, errors.New(err.Error()))
2302 }
2303 return dataSource, nil
2304 }
2305
2306 //nolint:nilerr
2307 if err := licenseService.IsFeatureEnabled(ctx, common.GetWorkspaceIDFromContext(ctx), v1pb.PlanFeature_FEATURE_QUERY_POLICY); err != nil {
2308 return dataSource, nil
2309 }
2310
2311 queryDataPolicy, err := storeInstance.GetEffectiveQueryDataPolicy(ctx, common.GetWorkspaceIDFromContext(ctx), common.FormatProject(database.ProjectID))
2312 if err != nil {
2313 return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to get query data policy with error: %v", err.Error()))
2314 }
2315
2316 if queryDataPolicy.AllowAdminDataSource {
2317 return dataSource, nil
2318 }
2319
2320 ds := utils.DataSourceFromInstanceWithType(instance, storepb.DataSourceType_READ_ONLY)
2321 if ds != nil {
2322 return nil, connect.NewError(connect.CodePermissionDenied, errors.Errorf("data source %q is not queryable", dataSourceID))
2323 }
2324 return dataSource, nil
2325}

Callers 2

QueryMethod · 0.85
ExportMethod · 0.85

Calls 12

FormatProjectFunction · 0.92
ErrorfMethod · 0.80
IsFeatureEnabledMethod · 0.80
GetInstanceMethod · 0.65
ErrorMethod · 0.45
GetDataSourcesMethod · 0.45
GetIdMethod · 0.45
GetTypeMethod · 0.45

Tested by

no test coverage detected