Skip to content

Commit 96e3f7e

Browse files
committed
[public-api] Implement ProjectsService.DeleteProject
1 parent 98bec46 commit 96e3f7e

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

components/public-api-server/pkg/apiv1/project.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,25 @@ func (s *ProjectsService) ListProjects(ctx context.Context, req *connect.Request
144144
}), nil
145145
}
146146

147+
func (s *ProjectsService) DeleteProject(ctx context.Context, req *connect.Request[v1.DeleteProjectRequest]) (*connect.Response[v1.DeleteProjectResponse], error) {
148+
projectID, err := validateProjectID(req.Msg.GetProjectId())
149+
if err != nil {
150+
return nil, err
151+
}
152+
153+
conn, err := s.getConnection(ctx)
154+
if err != nil {
155+
return nil, err
156+
}
157+
158+
err = conn.DeleteProject(ctx, projectID.String())
159+
if err != nil {
160+
return nil, proxy.ConvertError(err)
161+
}
162+
163+
return connect.NewResponse(&v1.DeleteProjectResponse{}), nil
164+
}
165+
147166
func (s *ProjectsService) getConnection(ctx context.Context) (protocol.APIInterface, error) {
148167
token, err := auth.TokenFromContext(ctx)
149168
if err != nil {
@@ -210,3 +229,18 @@ func workspaceClassesToAPIResponse(s *protocol.WorkspaceClassesSettings) *v1.Wor
210229
Prebuild: s.Prebuild,
211230
}
212231
}
232+
233+
func validateProjectID(id string) (uuid.UUID, error) {
234+
trimmed := strings.TrimSpace(id)
235+
236+
if trimmed == "" {
237+
return uuid.Nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Project ID is a required argument."))
238+
}
239+
240+
projectID, err := uuid.Parse(trimmed)
241+
if err != nil {
242+
return uuid.Nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Project ID must be a valid UUID."))
243+
}
244+
245+
return projectID, nil
246+
}

components/public-api-server/pkg/apiv1/project_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,43 @@ func TestProjectsService_ListProjects(t *testing.T) {
313313
})
314314
}
315315

316+
func TestProjectsService_DeleteProject(t *testing.T) {
317+
318+
t.Run("invalid argument when project ID is empty", func(t *testing.T) {
319+
_, client := setupProjectsService(t)
320+
321+
_, err := client.DeleteProject(context.Background(), connect.NewRequest(&v1.DeleteProjectRequest{
322+
ProjectId: "",
323+
}))
324+
require.Error(t, err)
325+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
326+
})
327+
328+
t.Run("invalid argument when project ID is not a valid uuid", func(t *testing.T) {
329+
_, client := setupProjectsService(t)
330+
331+
_, err := client.DeleteProject(context.Background(), connect.NewRequest(&v1.DeleteProjectRequest{
332+
ProjectId: "something",
333+
}))
334+
require.Error(t, err)
335+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
336+
})
337+
338+
t.Run("proxies to server", func(t *testing.T) {
339+
serverMock, client := setupProjectsService(t)
340+
341+
projectID := uuid.New().String()
342+
343+
serverMock.EXPECT().DeleteProject(gomock.Any(), projectID).Return(nil)
344+
345+
resp, err := client.DeleteProject(context.Background(), connect.NewRequest(&v1.DeleteProjectRequest{
346+
ProjectId: projectID,
347+
}))
348+
require.NoError(t, err)
349+
requireEqualProto(t, &v1.DeleteProjectResponse{}, resp.Msg)
350+
})
351+
}
352+
316353
func setupProjectsService(t *testing.T) (*protocol.MockAPIInterface, v1connect.ProjectsServiceClient) {
317354
t.Helper()
318355

0 commit comments

Comments
 (0)