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  }