github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/bundlereferences/service.go (about) 1 package bundlereferences 2 3 import ( 4 "context" 5 6 "github.com/kyma-incubator/compass/components/director/internal/model" 7 "github.com/kyma-incubator/compass/components/director/pkg/apperrors" 8 "github.com/pkg/errors" 9 ) 10 11 // BundleReferenceRepository is responsible for the repo-layer BundleReference operations. 12 //go:generate mockery --name=BundleReferenceRepository --output=automock --outpkg=automock --case=underscore --disable-version-string 13 type BundleReferenceRepository interface { 14 Create(ctx context.Context, item *model.BundleReference) error 15 Update(ctx context.Context, item *model.BundleReference) error 16 DeleteByReferenceObjectID(ctx context.Context, bundleID string, objectType model.BundleReferenceObjectType, objectID string) error 17 GetByID(ctx context.Context, objectType model.BundleReferenceObjectType, objectID, bundleID *string) (*model.BundleReference, error) 18 GetBundleIDsForObject(ctx context.Context, objectType model.BundleReferenceObjectType, objectID *string) (ids []string, err error) 19 ListByBundleIDs(ctx context.Context, objectType model.BundleReferenceObjectType, bundleIDs []string, pageSize int, cursor string) ([]*model.BundleReference, map[string]int, error) 20 } 21 22 // UIDService is responsible for generating GUIDs, which will be used as internal bundleReference IDs when they are created. 23 //go:generate mockery --name=UIDService --output=automock --outpkg=automock --case=underscore --disable-version-string 24 type UIDService interface { 25 Generate() string 26 } 27 28 type service struct { 29 repo BundleReferenceRepository 30 uidService UIDService 31 } 32 33 // NewService returns a new object responsible for service-layer BundleReference operations. 34 func NewService(repo BundleReferenceRepository, uidService UIDService) *service { 35 return &service{ 36 repo: repo, 37 uidService: uidService, 38 } 39 } 40 41 // GetForBundle returns the BundleReference that is related to a specific Bundle. 42 func (s *service) GetForBundle(ctx context.Context, objectType model.BundleReferenceObjectType, objectID, bundleID *string) (*model.BundleReference, error) { 43 bundleRef, err := s.repo.GetByID(ctx, objectType, objectID, bundleID) 44 if err != nil { 45 return nil, err 46 } 47 48 return bundleRef, nil 49 } 50 51 // GetBundleIDsForObject returns all bundle IDs that are related for a specific object(APIDefinition/EventDefinition). 52 func (s *service) GetBundleIDsForObject(ctx context.Context, objectType model.BundleReferenceObjectType, objectID *string) ([]string, error) { 53 ids, err := s.repo.GetBundleIDsForObject(ctx, objectType, objectID) 54 if err != nil { 55 return nil, err 56 } 57 58 return ids, nil 59 } 60 61 // CreateByReferenceObjectID creates a BundleReference between a Bundle and object(APIDefinition/EventDefinition). 62 func (s *service) CreateByReferenceObjectID(ctx context.Context, in model.BundleReferenceInput, objectType model.BundleReferenceObjectType, objectID, bundleID *string) error { 63 id := s.uidService.Generate() 64 bundleReference, err := in.ToBundleReference(id, objectType, bundleID, objectID) 65 if err != nil { 66 return err 67 } 68 69 err = s.repo.Create(ctx, bundleReference) 70 if err != nil { 71 return errors.Wrapf(err, "while creating record for %s with id %q for Bundle with id %q", objectType, *objectID, *bundleID) 72 } 73 74 return nil 75 } 76 77 // UpdateByReferenceObjectID updates a BundleReference for a specific object(APIDefinition/EventDefinition). 78 func (s *service) UpdateByReferenceObjectID(ctx context.Context, in model.BundleReferenceInput, objectType model.BundleReferenceObjectType, objectID, bundleID *string) error { 79 bundleReference, err := s.repo.GetByID(ctx, objectType, objectID, bundleID) 80 if err != nil { 81 return err 82 } 83 84 bundleReference, err = in.ToBundleReference(bundleReference.ID, objectType, bundleID, objectID) 85 if err != nil { 86 return err 87 } 88 89 err = s.repo.Update(ctx, bundleReference) 90 if err != nil { 91 return errors.Wrapf(err, "while updating record for %s with id %q", objectType, *objectID) 92 } 93 94 return nil 95 } 96 97 // DeleteByReferenceObjectID deletes a BundleReference for a specific object(APIDefinition/EventDefinition). 98 func (s *service) DeleteByReferenceObjectID(ctx context.Context, objectType model.BundleReferenceObjectType, objectID, bundleID *string) error { 99 return s.repo.DeleteByReferenceObjectID(ctx, *bundleID, objectType, *objectID) 100 } 101 102 // ListByBundleIDs lists all BundleReferences for given array of bundle IDs. In addition, the number of records for each BundleReference is returned. 103 func (s *service) ListByBundleIDs(ctx context.Context, objectType model.BundleReferenceObjectType, bundleIDs []string, pageSize int, cursor string) ([]*model.BundleReference, map[string]int, error) { 104 if pageSize < 1 || pageSize > 200 { 105 return nil, nil, apperrors.NewInvalidDataError("page size must be between 1 and 200") 106 } 107 108 return s.repo.ListByBundleIDs(ctx, objectType, bundleIDs, pageSize, cursor) 109 }