github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/package/service.go (about)

     1  package ordpackage
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/kyma-incubator/compass/components/director/pkg/resource"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/internal/domain/tenant"
     9  	"github.com/kyma-incubator/compass/components/director/internal/model"
    10  	"github.com/kyma-incubator/compass/components/director/pkg/log"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // PackageRepository missing godoc
    15  //
    16  //go:generate mockery --name=PackageRepository --output=automock --outpkg=automock --case=underscore --disable-version-string
    17  type PackageRepository interface {
    18  	Create(ctx context.Context, tenant string, item *model.Package) error
    19  	CreateGlobal(ctx context.Context, model *model.Package) error
    20  	Update(ctx context.Context, tenant string, item *model.Package) error
    21  	UpdateGlobal(ctx context.Context, model *model.Package) error
    22  	Delete(ctx context.Context, tenant, id string) error
    23  	DeleteGlobal(ctx context.Context, id string) error
    24  	Exists(ctx context.Context, tenant, id string) (bool, error)
    25  	GetByID(ctx context.Context, tenant, id string) (*model.Package, error)
    26  	GetByIDGlobal(ctx context.Context, id string) (*model.Package, error)
    27  	ListByResourceID(ctx context.Context, tenantID, resourceID string, resourceType resource.Type) ([]*model.Package, error)
    28  }
    29  
    30  // UIDService missing godoc
    31  //
    32  //go:generate mockery --name=UIDService --output=automock --outpkg=automock --case=underscore --disable-version-string
    33  type UIDService interface {
    34  	Generate() string
    35  }
    36  
    37  type service struct {
    38  	pkgRepo PackageRepository
    39  
    40  	uidService UIDService
    41  }
    42  
    43  // NewService missing godoc
    44  func NewService(pkgRepo PackageRepository, uidService UIDService) *service {
    45  	return &service{
    46  		pkgRepo:    pkgRepo,
    47  		uidService: uidService,
    48  	}
    49  }
    50  
    51  // Create creates a package for a given resource.Type
    52  func (s *service) Create(ctx context.Context, resourceType resource.Type, resourceID string, in model.PackageInput, pkgHash uint64) (string, error) {
    53  	id := s.uidService.Generate()
    54  	pkg := in.ToPackage(id, resourceType, resourceID, pkgHash)
    55  
    56  	if err := s.createPackage(ctx, pkg, resourceType); err != nil {
    57  		return "", errors.Wrapf(err, "error occurred while creating a Package with id %s and title %s for %s with id %s", id, pkg.Title, resourceType, resourceID)
    58  	}
    59  
    60  	log.C(ctx).Debugf("Successfully created a Package with id %s and title %s for %s with id %s", id, pkg.Title, resourceType, resourceID)
    61  
    62  	return id, nil
    63  }
    64  
    65  // Update updates a package by ID for a given resource.Type
    66  func (s *service) Update(ctx context.Context, resourceType resource.Type, id string, in model.PackageInput, pkgHash uint64) error {
    67  	pkg, err := s.getPackage(ctx, id, resourceType)
    68  	if err != nil {
    69  		return errors.Wrapf(err, "while getting Package with id %s", id)
    70  	}
    71  
    72  	pkg.SetFromUpdateInput(in, pkgHash)
    73  
    74  	if err = s.updatePackage(ctx, pkg, resourceType); err != nil {
    75  		return errors.Wrapf(err, "while updating Package with id %s", id)
    76  	}
    77  
    78  	return nil
    79  }
    80  
    81  // Delete missing godoc
    82  func (s *service) Delete(ctx context.Context, resourceType resource.Type, id string) error {
    83  	if err := s.deletePackage(ctx, id, resourceType); err != nil {
    84  		return errors.Wrapf(err, "while deleting Package with id %s", id)
    85  	}
    86  
    87  	log.C(ctx).Infof("Successfully deleted Package with id %s", id)
    88  
    89  	return nil
    90  }
    91  
    92  // Exist missing godoc
    93  func (s *service) Exist(ctx context.Context, id string) (bool, error) {
    94  	tnt, err := tenant.LoadFromContext(ctx)
    95  	if err != nil {
    96  		return false, errors.Wrap(err, "while loading tenant from context")
    97  	}
    98  
    99  	exist, err := s.pkgRepo.Exists(ctx, tnt, id)
   100  	if err != nil {
   101  		return false, errors.Wrapf(err, "while getting Package with ID: %q", id)
   102  	}
   103  
   104  	return exist, nil
   105  }
   106  
   107  // Get missing godoc
   108  func (s *service) Get(ctx context.Context, id string) (*model.Package, error) {
   109  	tnt, err := tenant.LoadFromContext(ctx)
   110  	if err != nil {
   111  		return nil, errors.Wrap(err, "while loading tenant from context")
   112  	}
   113  
   114  	pkg, err := s.pkgRepo.GetByID(ctx, tnt, id)
   115  	if err != nil {
   116  		return nil, errors.Wrapf(err, "while getting Package with ID: %q", id)
   117  	}
   118  
   119  	return pkg, nil
   120  }
   121  
   122  // ListByApplicationID missing godoc
   123  func (s *service) ListByApplicationID(ctx context.Context, appID string) ([]*model.Package, error) {
   124  	tnt, err := tenant.LoadFromContext(ctx)
   125  	if err != nil {
   126  		return nil, err
   127  	}
   128  
   129  	return s.pkgRepo.ListByResourceID(ctx, tnt, appID, resource.Application)
   130  }
   131  
   132  // ListByApplicationTemplateVersionID lists packages by Application Template Version ID without tenant isolation
   133  func (s *service) ListByApplicationTemplateVersionID(ctx context.Context, appTemplateVersionID string) ([]*model.Package, error) {
   134  	return s.pkgRepo.ListByResourceID(ctx, "", appTemplateVersionID, resource.ApplicationTemplateVersion)
   135  }
   136  
   137  func (s *service) createPackage(ctx context.Context, pkg *model.Package, resourceType resource.Type) error {
   138  	if resourceType.IsTenantIgnorable() {
   139  		return s.pkgRepo.CreateGlobal(ctx, pkg)
   140  	}
   141  
   142  	tnt, err := tenant.LoadFromContext(ctx)
   143  	if err != nil {
   144  		return err
   145  	}
   146  
   147  	return s.pkgRepo.Create(ctx, tnt, pkg)
   148  }
   149  
   150  func (s *service) getPackage(ctx context.Context, id string, resourceType resource.Type) (*model.Package, error) {
   151  	if resourceType.IsTenantIgnorable() {
   152  		return s.pkgRepo.GetByIDGlobal(ctx, id)
   153  	}
   154  
   155  	return s.Get(ctx, id)
   156  }
   157  
   158  func (s *service) updatePackage(ctx context.Context, pkg *model.Package, resourceType resource.Type) error {
   159  	if resourceType.IsTenantIgnorable() {
   160  		return s.pkgRepo.UpdateGlobal(ctx, pkg)
   161  	}
   162  
   163  	tnt, err := tenant.LoadFromContext(ctx)
   164  	if err != nil {
   165  		return err
   166  	}
   167  
   168  	return s.pkgRepo.Update(ctx, tnt, pkg)
   169  }
   170  
   171  func (s *service) deletePackage(ctx context.Context, id string, resourceType resource.Type) error {
   172  	if resourceType.IsTenantIgnorable() {
   173  		return s.pkgRepo.DeleteGlobal(ctx, id)
   174  	}
   175  
   176  	tnt, err := tenant.LoadFromContext(ctx)
   177  	if err != nil {
   178  		return errors.Wrap(err, "while loading tenant from context")
   179  	}
   180  
   181  	return s.pkgRepo.Delete(ctx, tnt, id)
   182  }