diff --git a/cli/service/pb_mock.go b/cli/service/pb_mock.go index 0e72d44..0881b7a 100644 --- a/cli/service/pb_mock.go +++ b/cli/service/pb_mock.go @@ -49,7 +49,8 @@ func (m *protoClientMock) ListVersions(ctx context.Context, in *v1proto.ListVers } func (m *protoClientMock) DeleteVersion(ctx context.Context, in *v1proto.DeleteVersionRequest, opts ...grpc.CallOption) (*v1proto.DeleteVersionResponse, error) { - panic("not implemented") + args := m.Called(in.GetContainer(), in.GetVersion()) + return &v1proto.DeleteVersionResponse{}, args.Error(0) } func (m *protoClientMock) PublishVersion(ctx context.Context, in *v1proto.PublishVersionRequest, opts ...grpc.CallOption) (*v1proto.PublishVersionResponse, error) { diff --git a/cli/service/service.go b/cli/service/service.go index d887db2..239a5de 100644 --- a/cli/service/service.go +++ b/cli/service/service.go @@ -25,6 +25,7 @@ type Service interface { ListContainers() func(ctx context.Context) error CreateVersion(containerName string, shouldPublish bool, fromDir *string) func(ctx context.Context) error + DeleteVersion(containerName, versionID string) func(ctx context.Context) error ListVersions(containerName string) func(ctx context.Context) error PublishVersion(containerName, versionID string) func(ctx context.Context) error @@ -109,6 +110,22 @@ func (s *service) CreateVersion(containerName string, shouldPublish bool, fromDi } } +func (s *service) DeleteVersion(containerName, versionID string) func(ctx context.Context) error { + return func(ctx context.Context) error { + _, err := s.cli.DeleteVersion(ctx, &v1proto.DeleteVersionRequest{ + Container: containerName, + Version: versionID, + }) + if err != nil { + return errors.Wrap(err, "error deleting version") + } + + fmt.Printf("version `%s` of container `%s` has been deleted\n", versionID, containerName) + + return nil + } +} + func (s *service) ListVersions(containerName string) func(ctx context.Context) error { return func(ctx context.Context) error { resp, err := s.cli.ListVersions(ctx, &v1proto.ListVersionsRequest{ diff --git a/cli/service/service_test.go b/cli/service/service_test.go index 6c16105..ccb7133 100644 --- a/cli/service/service_test.go +++ b/cli/service/service_test.go @@ -68,6 +68,13 @@ func (s *serviceTestSuite) TestCreateVersionFromDirAndPublish() { s.Require().NoError(fn(s.ctx)) } +func (s *serviceTestSuite) TestDeleteVersion() { + s.cliMock.On("DeleteVersion", "container1", "version1").Return(nil).Once() + + fn := s.svc.DeleteVersion("container1", "version1") + s.Require().NoError(fn(s.ctx)) +} + func (s *serviceTestSuite) TestListVersions() { s.cliMock.On("ListVersions", "container1").Return([]string{"version1", "version2", "version3"}, nil).Once() diff --git a/cmd/cli/main.go b/cmd/cli/main.go index ad8542e..4004e70 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -168,9 +168,12 @@ func main() { r := router.New(ctx) r.Register(containerCreate.FullCommand(), cliSvc.CreateContainer(*containerCreateName)) r.Register(containerList.FullCommand(), cliSvc.ListContainers()) + r.Register(versionList.FullCommand(), cliSvc.ListVersions(*versionListContainer)) r.Register(versionCreate.FullCommand(), cliSvc.CreateVersion(*versionCreateContainer, *versionCreatePublish, versionCreateFromDir)) + r.Register(versionDelete.FullCommand(), cliSvc.DeleteVersion(*versionDeleteContainer, *versionDeleteVersion)) r.Register(versionPublish.FullCommand(), cliSvc.PublishVersion(*versionPublishContainer, *versionPublishVersion)) + r.Register(objectCreate.FullCommand(), cliSvc.CreateObject(*objectCreateContainer, *objectCreateVersion, *objectCreatePath)) r.Register(objectList.FullCommand(), cliSvc.ListObjects(*objectListContainer, *objectListVersion)) r.Register(objectURL.FullCommand(), cliSvc.GetObjectURL(*objectURLContainer, *objectURLVersion, *objectURLKey)) diff --git a/presenter/manager/grpc/handlers.go b/presenter/manager/grpc/handlers.go index ee9b113..484510a 100644 --- a/presenter/manager/grpc/handlers.go +++ b/presenter/manager/grpc/handlers.go @@ -86,8 +86,13 @@ func (h *handlers) ListVersions(ctx context.Context, in *v1.ListVersionsRequest) }, nil } -func (h *handlers) DeleteVersion(context.Context, *v1.DeleteVersionRequest) (*v1.DeleteVersionResponse, error) { - panic("not implemented") +func (h *handlers) DeleteVersion(ctx context.Context, in *v1.DeleteVersionRequest) (*v1.DeleteVersionResponse, error) { + err := h.svc.DeleteVersion(ctx, in.GetContainer(), in.GetVersion()) + if err != nil { + return nil, err + } + + return &v1.DeleteVersionResponse{}, nil } func (h *handlers) PublishVersion(ctx context.Context, in *v1.PublishVersionRequest) (*v1.PublishVersionResponse, error) { diff --git a/presenter/manager/grpc/handlers_test.go b/presenter/manager/grpc/handlers_test.go index a84dea2..65a6d15 100644 --- a/presenter/manager/grpc/handlers_test.go +++ b/presenter/manager/grpc/handlers_test.go @@ -41,6 +41,16 @@ func (s *manageHandlersTestSuite) TestCreateVersion() { s.Require().Equal("20240102030405", resp.GetVersion()) } +func (s *manageHandlersTestSuite) TestDeleteVersion() { + s.svcMock.On("DeleteVersion", "test-container", "test-version").Return(nil).Once() + + _, err := s.client.DeleteVersion(s.ctx, &v1pb.DeleteVersionRequest{ + Container: "test-container", + Version: "test-version", + }) + s.Require().NoError(err) +} + func (s *manageHandlersTestSuite) TestPublishVersion() { s.svcMock.On("PublishVersion", "test-container", "20240102030405").Return(nil).Once() diff --git a/repositories/metadata/postgresql/versions.go b/repositories/metadata/postgresql/versions.go index 44a000d..bc69beb 100644 --- a/repositories/metadata/postgresql/versions.go +++ b/repositories/metadata/postgresql/versions.go @@ -239,6 +239,16 @@ func (r *repository) DeleteVersion(ctx context.Context, container, version strin return errors.Wrap(err, "error looking up version") } + _, err = deleteQuery(ctx, tx, psql. + Delete("objects"). + Where(sq.Eq{ + "version_id": versionID, + }), + ) + if err != nil { + return mapSQLErrors(err) + } + _, err = deleteQuery(ctx, tx, psql. Delete("versions"). Where(sq.Eq{ diff --git a/repositories/metadata/postgresql/versions_test.go b/repositories/metadata/postgresql/versions_test.go index a94557e..45ce510 100644 --- a/repositories/metadata/postgresql/versions_test.go +++ b/repositories/metadata/postgresql/versions_test.go @@ -169,6 +169,7 @@ func (s *postgreSQLRepositoryTestSuite) TestDeleteVersion() { s.tp.On("Now").Return("2024-07-07T10:11:13Z").Times(2) s.tp.On("Now").Return("2024-07-07T10:11:14Z").Times(2) s.tp.On("Now").Return("2024-07-07T10:11:15Z").Times(2) + s.tp.On("Now").Return("2024-07-07T10:11:16Z").Times(3) err := s.repo.CreateContainer(s.ctx, "container1") s.Require().NoError(err) @@ -188,6 +189,12 @@ func (s *postgreSQLRepositoryTestSuite) TestDeleteVersion() { version4, err := s.repo.CreateVersion(s.ctx, "container2") s.Require().NoError(err) + err = s.repo.CreateBLOB(s.ctx, "deadbeef", 10, "application/octet-stream") + s.Require().NoError(err) + + err = s.repo.CreateObject(s.ctx, "container2", version4, "testkey", "deadbeef") + s.Require().NoError(err) + versions1, err := s.repo.ListAllVersionsByContainer(s.ctx, "container1") s.Require().NoError(err) s.Require().Equal([]models.Version{ diff --git a/service/service.go b/service/service.go index 94fad78..27077eb 100644 --- a/service/service.go +++ b/service/service.go @@ -123,7 +123,8 @@ func (s *service) PublishVersion(ctx context.Context, container, id string) erro } func (s *service) DeleteVersion(ctx context.Context, container, id string) error { - panic("not implemented") + err := s.mdRepo.DeleteVersion(ctx, container, id) + return mapMetadataErrors(err) } func (s *service) AddObject(ctx context.Context, container, versionID, key, casKey string) error { diff --git a/service/service_test.go b/service/service_test.go index 70d9476..9eb2d5f 100644 --- a/service/service_test.go +++ b/service/service_test.go @@ -51,9 +51,10 @@ func (s *serviceTestSuite) TestPublishVersion() { } func (s *serviceTestSuite) TestDeleteVersion() { - s.Require().PanicsWithValue("not implemented", func() { - s.svc.DeleteVersion(s.ctx, "container", "version") - }) + s.mdRepoMock.On("DeleteVersion", "test_container", "test_version").Return(nil).Once() + + err := s.svc.DeleteVersion(s.ctx, "test_container", "test_version") + s.Require().NoError(err) } func (s *serviceTestSuite) TestAddObject() {