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

     1  package ordvendor
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/kyma-incubator/compass/components/director/internal/model"
     7  	"github.com/kyma-incubator/compass/components/director/internal/repo"
     8  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
     9  	"github.com/kyma-incubator/compass/components/director/pkg/log"
    10  	"github.com/kyma-incubator/compass/components/director/pkg/resource"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  const vendorTable string = `public.vendors`
    15  
    16  var (
    17  	vendorColumns    = []string{"ord_id", "app_id", "app_template_version_id", "title", "labels", "partners", "id", "tags", "documentation_labels"}
    18  	updatableColumns = []string{"title", "labels", "partners", "tags", "documentation_labels"}
    19  )
    20  
    21  // EntityConverter missing godoc
    22  //
    23  //go:generate mockery --name=EntityConverter --output=automock --outpkg=automock --case=underscore --disable-version-string
    24  type EntityConverter interface {
    25  	ToEntity(in *model.Vendor) *Entity
    26  	FromEntity(entity *Entity) (*model.Vendor, error)
    27  }
    28  
    29  type pgRepository struct {
    30  	conv               EntityConverter
    31  	existQuerier       repo.ExistQuerier
    32  	singleGetter       repo.SingleGetter
    33  	singleGetterGlobal repo.SingleGetterGlobal
    34  	lister             repo.Lister
    35  	listerGlobal       repo.ListerGlobal
    36  	deleter            repo.Deleter
    37  	deleterGlobal      repo.DeleterGlobal
    38  	creator            repo.Creator
    39  	creatorGlobal      repo.CreatorGlobal
    40  	updater            repo.Updater
    41  	updaterGlobal      repo.UpdaterGlobal
    42  }
    43  
    44  // NewRepository creates a new instance of repository
    45  func NewRepository(conv EntityConverter) *pgRepository {
    46  	return &pgRepository{
    47  		conv:               conv,
    48  		existQuerier:       repo.NewExistQuerier(vendorTable),
    49  		singleGetter:       repo.NewSingleGetter(vendorTable, vendorColumns),
    50  		singleGetterGlobal: repo.NewSingleGetterGlobal(resource.Vendor, vendorTable, vendorColumns),
    51  		lister:             repo.NewLister(vendorTable, vendorColumns),
    52  		listerGlobal:       repo.NewListerGlobal(resource.Vendor, vendorTable, vendorColumns),
    53  		deleter:            repo.NewDeleter(vendorTable),
    54  		deleterGlobal:      repo.NewDeleterGlobal(resource.Vendor, vendorTable),
    55  		creator:            repo.NewCreator(vendorTable, vendorColumns),
    56  		creatorGlobal:      repo.NewCreatorGlobal(resource.Vendor, vendorTable, vendorColumns),
    57  		updater:            repo.NewUpdater(vendorTable, updatableColumns, []string{"id"}),
    58  		updaterGlobal:      repo.NewUpdaterGlobal(resource.Vendor, vendorTable, updatableColumns, []string{"id"}),
    59  	}
    60  }
    61  
    62  // Create creates a new Vendor
    63  func (r *pgRepository) Create(ctx context.Context, tenant string, model *model.Vendor) error {
    64  	if model == nil {
    65  		return apperrors.NewInternalError("model can not be nil")
    66  	}
    67  
    68  	log.C(ctx).Debugf("Persisting Vendor entity with id %q", model.ID)
    69  	return r.creator.Create(ctx, resource.Vendor, tenant, r.conv.ToEntity(model))
    70  }
    71  
    72  // CreateGlobal creates a new Vendor without tenant isolation.
    73  func (r *pgRepository) CreateGlobal(ctx context.Context, model *model.Vendor) error {
    74  	if model == nil {
    75  		return apperrors.NewInternalError("model can not be nil")
    76  	}
    77  
    78  	log.C(ctx).Debugf("Persisting Vendor entity with id %q", model.ID)
    79  	return r.creatorGlobal.Create(ctx, r.conv.ToEntity(model))
    80  }
    81  
    82  // Update updates an existing Vendor
    83  func (r *pgRepository) Update(ctx context.Context, tenant string, model *model.Vendor) error {
    84  	if model == nil {
    85  		return apperrors.NewInternalError("model can not be nil")
    86  	}
    87  	log.C(ctx).Debugf("Updating Vendor entity with id %q", model.ID)
    88  	return r.updater.UpdateSingle(ctx, resource.Vendor, tenant, r.conv.ToEntity(model))
    89  }
    90  
    91  // UpdateGlobal updates a Vendor without tenant isolation.
    92  func (r *pgRepository) UpdateGlobal(ctx context.Context, model *model.Vendor) error {
    93  	if model == nil {
    94  		return apperrors.NewInternalError("model can not be nil")
    95  	}
    96  	log.C(ctx).Debugf("Updating Vendor entity with id %q", model.ID)
    97  	return r.updaterGlobal.UpdateSingleGlobal(ctx, r.conv.ToEntity(model))
    98  }
    99  
   100  // Delete deletes an existing Vendor
   101  func (r *pgRepository) Delete(ctx context.Context, tenant, id string) error {
   102  	log.C(ctx).Debugf("Deleting Vendor entity with id %q", id)
   103  	return r.deleter.DeleteOne(ctx, resource.Vendor, tenant, repo.Conditions{repo.NewEqualCondition("id", id)})
   104  }
   105  
   106  // DeleteGlobal deletes a Vendor without tenant isolation.
   107  func (r *pgRepository) DeleteGlobal(ctx context.Context, id string) error {
   108  	log.C(ctx).Debugf("Deleting Vendor entity with id %q", id)
   109  	return r.deleterGlobal.DeleteOneGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)})
   110  }
   111  
   112  // Exists checks if a Vendor exists
   113  func (r *pgRepository) Exists(ctx context.Context, tenant, id string) (bool, error) {
   114  	return r.existQuerier.Exists(ctx, resource.Vendor, tenant, repo.Conditions{repo.NewEqualCondition("id", id)})
   115  }
   116  
   117  // GetByID gets a Vendor by its id
   118  func (r *pgRepository) GetByID(ctx context.Context, tenant, id string) (*model.Vendor, error) {
   119  	log.C(ctx).Debugf("Getting Vendor entity with id %q", id)
   120  	var vendorEnt Entity
   121  	if err := r.singleGetter.Get(ctx, resource.Vendor, tenant, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &vendorEnt); err != nil {
   122  		return nil, err
   123  	}
   124  
   125  	vendorModel, err := r.conv.FromEntity(&vendorEnt)
   126  	if err != nil {
   127  		return nil, errors.Wrap(err, "while converting Vendor from Entity")
   128  	}
   129  
   130  	return vendorModel, nil
   131  }
   132  
   133  // GetByIDGlobal gets a Vendor without tenant isolation.
   134  func (r *pgRepository) GetByIDGlobal(ctx context.Context, id string) (*model.Vendor, error) {
   135  	log.C(ctx).Debugf("Getting Vendor entity with id %q", id)
   136  	var vendorEnt Entity
   137  	if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &vendorEnt); err != nil {
   138  		return nil, err
   139  	}
   140  
   141  	vendorModel, err := r.conv.FromEntity(&vendorEnt)
   142  	if err != nil {
   143  		return nil, errors.Wrap(err, "while converting Vendor from Entity")
   144  	}
   145  
   146  	return vendorModel, nil
   147  }
   148  
   149  // ListByResourceID gets a list of Vendors by given resource id and type
   150  func (r *pgRepository) ListByResourceID(ctx context.Context, tenantID, resourceID string, resourceType resource.Type) ([]*model.Vendor, error) {
   151  	vendorCollection := vendorCollection{}
   152  
   153  	var condition repo.Condition
   154  	var err error
   155  	if resourceType == resource.Application {
   156  		condition = repo.NewEqualCondition("app_id", resourceID)
   157  		err = r.lister.ListWithSelectForUpdate(ctx, resource.Vendor, tenantID, &vendorCollection, condition)
   158  	} else {
   159  		condition = repo.NewEqualCondition("app_template_version_id", resourceID)
   160  		err = r.listerGlobal.ListGlobalWithSelectForUpdate(ctx, &vendorCollection, condition)
   161  	}
   162  	if err != nil {
   163  		return nil, err
   164  	}
   165  
   166  	vendors := make([]*model.Vendor, 0, vendorCollection.Len())
   167  	for _, vendor := range vendorCollection {
   168  		vendorModel, err := r.conv.FromEntity(&vendor)
   169  		if err != nil {
   170  			return nil, err
   171  		}
   172  		vendors = append(vendors, vendorModel)
   173  	}
   174  	return vendors, nil
   175  }
   176  
   177  // ListGlobal lists all Global Vendors (with NULL app_id) without tenant isolation.
   178  func (r *pgRepository) ListGlobal(ctx context.Context) ([]*model.Vendor, error) {
   179  	vendorCollection := vendorCollection{}
   180  	if err := r.listerGlobal.ListGlobalWithSelectForUpdate(ctx, &vendorCollection, repo.NewNullCondition("app_id")); err != nil {
   181  		return nil, err
   182  	}
   183  	vendors := make([]*model.Vendor, 0, vendorCollection.Len())
   184  	for _, vendor := range vendorCollection {
   185  		vendorModel, err := r.conv.FromEntity(&vendor)
   186  		if err != nil {
   187  			return nil, err
   188  		}
   189  		vendors = append(vendors, vendorModel)
   190  	}
   191  	return vendors, nil
   192  }
   193  
   194  type vendorCollection []Entity
   195  
   196  // Len missing godoc
   197  func (pc vendorCollection) Len() int {
   198  	return len(pc)
   199  }