UpdateDatabase updates a database.
(ctx context.Context, req *connect.Request[v1pb.UpdateDatabaseRequest])
| 276 | |
| 277 | // UpdateDatabase updates a database. |
| 278 | func (s *DatabaseService) UpdateDatabase(ctx context.Context, req *connect.Request[v1pb.UpdateDatabaseRequest]) (*connect.Response[v1pb.Database], error) { |
| 279 | if req.Msg.Database == nil { |
| 280 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("database must be set")) |
| 281 | } |
| 282 | if len(req.Msg.GetUpdateMask().GetPaths()) == 0 { |
| 283 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("update_mask must be set")) |
| 284 | } |
| 285 | |
| 286 | // Use the helper function to get the database |
| 287 | instanceID, databaseName, err := common.GetInstanceDatabaseID(req.Msg.Database.Name) |
| 288 | if err != nil { |
| 289 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "failed to parse %q", req.Msg.Database.Name)) |
| 290 | } |
| 291 | databaseMessage, err := s.store.GetDatabase(ctx, &store.FindDatabaseMessage{ |
| 292 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 293 | InstanceID: &instanceID, |
| 294 | DatabaseName: &databaseName, |
| 295 | }) |
| 296 | if err != nil { |
| 297 | return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get database")) |
| 298 | } |
| 299 | if databaseMessage == nil { |
| 300 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("database %q not found", req.Msg.Database.Name)) |
| 301 | } |
| 302 | if databaseMessage.Deleted { |
| 303 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("database %q was deleted", req.Msg.Database.Name)) |
| 304 | } |
| 305 | |
| 306 | var project *store.ProjectMessage |
| 307 | patch := &store.UpdateDatabaseMessage{ |
| 308 | InstanceID: databaseMessage.InstanceID, |
| 309 | DatabaseName: databaseMessage.DatabaseName, |
| 310 | } |
| 311 | for _, path := range req.Msg.UpdateMask.Paths { |
| 312 | switch path { |
| 313 | case "project": |
| 314 | projectID, err := common.GetProjectID(req.Msg.Database.Project) |
| 315 | if err != nil { |
| 316 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("%v", err.Error())) |
| 317 | } |
| 318 | project, err = s.store.GetProject(ctx, &store.FindProjectMessage{ |
| 319 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 320 | ResourceID: &projectID, |
| 321 | ShowDeleted: true, |
| 322 | }) |
| 323 | if err != nil { |
| 324 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("%v", err.Error())) |
| 325 | } |
| 326 | if project == nil { |
| 327 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("project %q not found", projectID)) |
| 328 | } |
| 329 | if project.Deleted { |
| 330 | return nil, connect.NewError(connect.CodeFailedPrecondition, errors.Errorf("project %q is deleted", projectID)) |
| 331 | } |
| 332 | patch.ProjectID = &project.ResourceID |
| 333 | case "labels": |
| 334 | patch.MetadataUpdates = append(patch.MetadataUpdates, func(dm *storepb.DatabaseMetadata) { |
| 335 | dm.Labels = req.Msg.Database.Labels |
no test coverage detected