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  }