github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/ordvendor/service.go (about) 1 package ordvendor 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 // VendorRepository missing godoc 15 // 16 //go:generate mockery --name=VendorRepository --output=automock --outpkg=automock --case=underscore --disable-version-string 17 type VendorRepository interface { 18 Create(ctx context.Context, tenant string, item *model.Vendor) error 19 CreateGlobal(ctx context.Context, model *model.Vendor) error 20 Update(ctx context.Context, tenant string, item *model.Vendor) error 21 UpdateGlobal(ctx context.Context, model *model.Vendor) 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.Vendor, error) 26 GetByIDGlobal(ctx context.Context, id string) (*model.Vendor, error) 27 ListByResourceID(ctx context.Context, tenantID, resourceID string, resourceType resource.Type) ([]*model.Vendor, error) 28 ListGlobal(ctx context.Context) ([]*model.Vendor, error) 29 } 30 31 // UIDService missing godoc 32 // 33 //go:generate mockery --name=UIDService --output=automock --outpkg=automock --case=underscore --disable-version-string 34 type UIDService interface { 35 Generate() string 36 } 37 38 type service struct { 39 vendorRepo VendorRepository 40 uidService UIDService 41 } 42 43 // NewService creates a new instance of Vendor Service. 44 func NewService(vendorRepo VendorRepository, uidService UIDService) *service { 45 return &service{ 46 vendorRepo: vendorRepo, 47 uidService: uidService, 48 } 49 } 50 51 // Create creates a new Vendor. 52 func (s *service) Create(ctx context.Context, resourceType resource.Type, resourceID string, in model.VendorInput) (string, error) { 53 id := s.uidService.Generate() 54 vendor := in.ToVendor(id, resourceType, resourceID) 55 56 if err := s.createVendor(ctx, vendor, resourceType); err != nil { 57 return "", errors.Wrapf(err, "error occurred while creating a Vendor with id %s and title %s", id, vendor.Title) 58 } 59 60 log.C(ctx).Debugf("Successfully created a Vendor with id %s and title %s", id, vendor.Title) 61 62 return vendor.OrdID, nil 63 } 64 65 // CreateGlobal creates a new Global Vendor (with NULL app_id). 66 func (s *service) CreateGlobal(ctx context.Context, in model.VendorInput) (string, error) { 67 id := s.uidService.Generate() 68 vendor := in.ToVendor(id, "", "") 69 70 if err := s.vendorRepo.CreateGlobal(ctx, vendor); err != nil { 71 return "", errors.Wrapf(err, "error occurred while creating Global Vendor with id %s and title %s", id, vendor.Title) 72 } 73 log.C(ctx).Debugf("Successfully created Global Vendor with id %s and title %s", id, vendor.Title) 74 75 return vendor.OrdID, nil 76 } 77 78 // Update updates an existing Vendor. 79 func (s *service) Update(ctx context.Context, resourceType resource.Type, id string, in model.VendorInput) error { 80 vendor, err := s.getVendor(ctx, id, resourceType) 81 if err != nil { 82 return errors.Wrapf(err, "while getting Vendor with id %s", id) 83 } 84 85 vendor.SetFromUpdateInput(in) 86 87 if err = s.updateVendor(ctx, vendor, resourceType); err != nil { 88 return errors.Wrapf(err, "while updating Vendor with id %s", id) 89 } 90 91 return nil 92 } 93 94 // UpdateGlobal updates an existing Vendor without tenant isolation. 95 func (s *service) UpdateGlobal(ctx context.Context, id string, in model.VendorInput) error { 96 vendor, err := s.vendorRepo.GetByIDGlobal(ctx, id) 97 if err != nil { 98 return errors.Wrapf(err, "while getting Vendor with id %s", id) 99 } 100 101 vendor.SetFromUpdateInput(in) 102 103 if err = s.vendorRepo.UpdateGlobal(ctx, vendor); err != nil { 104 return errors.Wrapf(err, "while updating Vendor with id %s", id) 105 } 106 return nil 107 } 108 109 // Delete deletes an existing Vendor. 110 func (s *service) Delete(ctx context.Context, resourceType resource.Type, id string) error { 111 if err := s.deleteVendor(ctx, id, resourceType); err != nil { 112 return errors.Wrapf(err, "while deleting Vendor with id %s", id) 113 } 114 115 log.C(ctx).Infof("Successfully deleted Vendor with id %s", id) 116 117 return nil 118 } 119 120 // DeleteGlobal deletes an existing Vendor without tenant isolation. 121 func (s *service) DeleteGlobal(ctx context.Context, id string) error { 122 err := s.vendorRepo.DeleteGlobal(ctx, id) 123 if err != nil { 124 return errors.Wrapf(err, "while deleting Vendor with id %s", id) 125 } 126 127 return nil 128 } 129 130 // Exist checks if a Vendor exists. 131 func (s *service) Exist(ctx context.Context, id string) (bool, error) { 132 tnt, err := tenant.LoadFromContext(ctx) 133 if err != nil { 134 return false, errors.Wrap(err, "while loading tenant from context") 135 } 136 137 exist, err := s.vendorRepo.Exists(ctx, tnt, id) 138 if err != nil { 139 return false, errors.Wrapf(err, "while getting Vendor with ID: %q", id) 140 } 141 142 return exist, nil 143 } 144 145 // Get returns a Vendor by its ID. 146 func (s *service) Get(ctx context.Context, id string) (*model.Vendor, error) { 147 tnt, err := tenant.LoadFromContext(ctx) 148 if err != nil { 149 return nil, errors.Wrap(err, "while loading tenant from context") 150 } 151 152 vendor, err := s.vendorRepo.GetByID(ctx, tnt, id) 153 if err != nil { 154 return nil, errors.Wrapf(err, "while getting Vendor with ID: %q", id) 155 } 156 157 return vendor, nil 158 } 159 160 // ListByApplicationID returns a list of Vendors by Application ID. 161 func (s *service) ListByApplicationID(ctx context.Context, appID string) ([]*model.Vendor, error) { 162 tnt, err := tenant.LoadFromContext(ctx) 163 if err != nil { 164 return nil, err 165 } 166 167 return s.vendorRepo.ListByResourceID(ctx, tnt, appID, resource.Application) 168 } 169 170 // ListByApplicationTemplateVersionID returns a list of Vendors by Application Template Version ID without tenant isolation. 171 func (s *service) ListByApplicationTemplateVersionID(ctx context.Context, appTemplateVersionID string) ([]*model.Vendor, error) { 172 return s.vendorRepo.ListByResourceID(ctx, "", appTemplateVersionID, resource.ApplicationTemplateVersion) 173 } 174 175 // ListGlobal returns a list of Global Vendors (with NULL app_id). 176 func (s *service) ListGlobal(ctx context.Context) ([]*model.Vendor, error) { 177 return s.vendorRepo.ListGlobal(ctx) 178 } 179 180 func (s *service) createVendor(ctx context.Context, vendor *model.Vendor, resourceType resource.Type) error { 181 if resourceType.IsTenantIgnorable() { 182 return s.vendorRepo.CreateGlobal(ctx, vendor) 183 } 184 185 tnt, err := tenant.LoadFromContext(ctx) 186 if err != nil { 187 return err 188 } 189 190 return s.vendorRepo.Create(ctx, tnt, vendor) 191 } 192 193 func (s *service) getVendor(ctx context.Context, id string, resourceType resource.Type) (*model.Vendor, error) { 194 if resourceType.IsTenantIgnorable() { 195 return s.vendorRepo.GetByIDGlobal(ctx, id) 196 } 197 198 return s.Get(ctx, id) 199 } 200 201 func (s *service) updateVendor(ctx context.Context, vendor *model.Vendor, resourceType resource.Type) error { 202 if resourceType.IsTenantIgnorable() { 203 return s.vendorRepo.UpdateGlobal(ctx, vendor) 204 } 205 206 tnt, err := tenant.LoadFromContext(ctx) 207 if err != nil { 208 return err 209 } 210 211 return s.vendorRepo.Update(ctx, tnt, vendor) 212 } 213 214 func (s *service) deleteVendor(ctx context.Context, id string, resourceType resource.Type) error { 215 if resourceType.IsTenantIgnorable() { 216 return s.vendorRepo.DeleteGlobal(ctx, id) 217 } 218 219 tnt, err := tenant.LoadFromContext(ctx) 220 if err != nil { 221 return errors.Wrap(err, "while loading tenant from context") 222 } 223 224 return s.vendorRepo.Delete(ctx, tnt, id) 225 }