UndeleteProject undeletes a project.
(ctx context.Context, req *connect.Request[v1pb.UndeleteProjectRequest])
| 440 | |
| 441 | // UndeleteProject undeletes a project. |
| 442 | func (s *ProjectService) UndeleteProject(ctx context.Context, req *connect.Request[v1pb.UndeleteProjectRequest]) (*connect.Response[v1pb.Project], error) { |
| 443 | project, err := s.getProjectMessage(ctx, req.Msg.Name) |
| 444 | if err != nil { |
| 445 | return nil, err |
| 446 | } |
| 447 | // Idempotent: if already active, return the project |
| 448 | if !project.Deleted { |
| 449 | return connect.NewResponse(convertToProject(project)), nil |
| 450 | } |
| 451 | |
| 452 | if err := s.store.UpdateProjects(ctx, &store.UpdateProjectMessage{ |
| 453 | ResourceID: project.ResourceID, |
| 454 | Workspace: project.Workspace, |
| 455 | Delete: &undeletePatch, |
| 456 | }); err != nil { |
| 457 | return nil, connect.NewError(connect.CodeInternal, err) |
| 458 | } |
| 459 | project, err = s.store.GetProject(ctx, &store.FindProjectMessage{Workspace: common.GetWorkspaceIDFromContext(ctx), ResourceID: &project.ResourceID}) |
| 460 | if err != nil { |
| 461 | return nil, connect.NewError(connect.CodeInternal, err) |
| 462 | } |
| 463 | return connect.NewResponse(convertToProject(project)), nil |
| 464 | } |
| 465 | |
| 466 | // BatchDeleteProjects deletes multiple projects in batch. |
| 467 | func (s *ProjectService) BatchDeleteProjects(ctx context.Context, request *connect.Request[v1pb.BatchDeleteProjectsRequest]) (*connect.Response[emptypb.Empty], error) { |
nothing calls this directly
no test coverage detected