( ctx context.Context, storeInstance *store.Store, licenseService *enterprise.LicenseService, database *store.DatabaseMessage, dataSourceID string, )
| 2266 | } |
| 2267 | |
| 2268 | func 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 | } |
no test coverage detected