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 }