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

     1  package ordpackage
     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 (
    15  	packageTable               = `public.packages`
    16  	appTemplateVersionIDColumn = "app_template_version_id"
    17  	appIDColumn                = "app_id"
    18  )
    19  
    20  var (
    21  	packageColumns = []string{"id", "app_id", "app_template_version_id", "ord_id", "vendor", "title", "short_description",
    22  		"description", "version", "package_links", "links", "licence_type", "tags", "countries", "labels", "policy_level",
    23  		"custom_policy_level", "part_of_products", "line_of_business", "industry", "resource_hash", "documentation_labels", "support_info"}
    24  	updatableColumns = []string{"vendor", "title", "short_description", "description", "version", "package_links", "links",
    25  		"licence_type", "tags", "countries", "labels", "policy_level", "custom_policy_level", "part_of_products", "line_of_business", "industry", "resource_hash", "documentation_labels", "support_info"}
    26  )
    27  
    28  // EntityConverter missing godoc
    29  //
    30  //go:generate mockery --name=EntityConverter --output=automock --outpkg=automock --case=underscore --disable-version-string
    31  type EntityConverter interface {
    32  	ToEntity(in *model.Package) *Entity
    33  	FromEntity(entity *Entity) (*model.Package, error)
    34  }
    35  
    36  type pgRepository struct {
    37  	conv               EntityConverter
    38  	existQuerier       repo.ExistQuerier
    39  	lister             repo.Lister
    40  	listerGlobal       repo.ListerGlobal
    41  	singleGetter       repo.SingleGetter
    42  	singleGetterGlobal repo.SingleGetterGlobal
    43  	deleter            repo.Deleter
    44  	deleterGlobal      repo.DeleterGlobal
    45  	creator            repo.Creator
    46  	creatorGlobal      repo.CreatorGlobal
    47  	updater            repo.Updater
    48  	updaterGlobal      repo.UpdaterGlobal
    49  }
    50  
    51  // NewRepository missing godoc
    52  func NewRepository(conv EntityConverter) *pgRepository {
    53  	return &pgRepository{
    54  		conv:               conv,
    55  		existQuerier:       repo.NewExistQuerier(packageTable),
    56  		lister:             repo.NewLister(packageTable, packageColumns),
    57  		listerGlobal:       repo.NewListerGlobal(resource.Package, packageTable, packageColumns),
    58  		singleGetter:       repo.NewSingleGetter(packageTable, packageColumns),
    59  		singleGetterGlobal: repo.NewSingleGetterGlobal(resource.Package, packageTable, packageColumns),
    60  		deleter:            repo.NewDeleter(packageTable),
    61  		deleterGlobal:      repo.NewDeleterGlobal(resource.Package, packageTable),
    62  		creator:            repo.NewCreator(packageTable, packageColumns),
    63  		creatorGlobal:      repo.NewCreatorGlobal(resource.Package, packageTable, packageColumns),
    64  		updater:            repo.NewUpdater(packageTable, updatableColumns, []string{"id"}),
    65  		updaterGlobal:      repo.NewUpdaterGlobal(resource.Package, packageTable, updatableColumns, []string{"id"}),
    66  	}
    67  }
    68  
    69  // Create missing godoc
    70  func (r *pgRepository) Create(ctx context.Context, tenant string, model *model.Package) error {
    71  	if model == nil {
    72  		return apperrors.NewInternalError("model can not be nil")
    73  	}
    74  
    75  	log.C(ctx).Debugf("Persisting Package entity with id %q", model.ID)
    76  	return r.creator.Create(ctx, resource.Package, tenant, r.conv.ToEntity(model))
    77  }
    78  
    79  // CreateGlobal creates a packages globally without tenant isolation
    80  func (r *pgRepository) CreateGlobal(ctx context.Context, model *model.Package) error {
    81  	if model == nil {
    82  		return apperrors.NewInternalError("model can not be nil")
    83  	}
    84  
    85  	log.C(ctx).Debugf("Persisting Package entity with id %q", model.ID)
    86  	return r.creatorGlobal.Create(ctx, r.conv.ToEntity(model))
    87  }
    88  
    89  // Update missing godoc
    90  func (r *pgRepository) Update(ctx context.Context, tenant string, model *model.Package) error {
    91  	if model == nil {
    92  		return apperrors.NewInternalError("model can not be nil")
    93  	}
    94  	log.C(ctx).Debugf("Updating Package entity with id %q", model.ID)
    95  	return r.updater.UpdateSingle(ctx, resource.Package, tenant, r.conv.ToEntity(model))
    96  }
    97  
    98  // UpdateGlobal updates a package globally without tenant isolation
    99  func (r *pgRepository) UpdateGlobal(ctx context.Context, model *model.Package) error {
   100  	if model == nil {
   101  		return apperrors.NewInternalError("model can not be nil")
   102  	}
   103  	log.C(ctx).Debugf("Updating Package entity with id %q", model.ID)
   104  	return r.updaterGlobal.UpdateSingleGlobal(ctx, r.conv.ToEntity(model))
   105  }
   106  
   107  // Delete missing godoc
   108  func (r *pgRepository) Delete(ctx context.Context, tenant, id string) error {
   109  	log.C(ctx).Debugf("Deleting Package entity with id %q", id)
   110  	return r.deleter.DeleteOne(ctx, resource.Package, tenant, repo.Conditions{repo.NewEqualCondition("id", id)})
   111  }
   112  
   113  // DeleteGlobal deletes a Package without tenant isolation
   114  func (r *pgRepository) DeleteGlobal(ctx context.Context, id string) error {
   115  	log.C(ctx).Debugf("Deleting Package entity with id %q", id)
   116  	return r.deleterGlobal.DeleteOneGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)})
   117  }
   118  
   119  // Exists missing godoc
   120  func (r *pgRepository) Exists(ctx context.Context, tenant, id string) (bool, error) {
   121  	return r.existQuerier.Exists(ctx, resource.Package, tenant, repo.Conditions{repo.NewEqualCondition("id", id)})
   122  }
   123  
   124  // GetByID missing godoc
   125  func (r *pgRepository) GetByID(ctx context.Context, tenant, id string) (*model.Package, error) {
   126  	log.C(ctx).Debugf("Getting Package entity with id %q", id)
   127  	var pkgEnt Entity
   128  	if err := r.singleGetter.Get(ctx, resource.Package, tenant, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &pkgEnt); err != nil {
   129  		return nil, err
   130  	}
   131  
   132  	pkgModel, err := r.conv.FromEntity(&pkgEnt)
   133  	if err != nil {
   134  		return nil, errors.Wrap(err, "while converting Package from Entity")
   135  	}
   136  
   137  	return pkgModel, nil
   138  }
   139  
   140  // GetByIDGlobal gets a package by ID without tenant isolation
   141  func (r *pgRepository) GetByIDGlobal(ctx context.Context, id string) (*model.Package, error) {
   142  	log.C(ctx).Debugf("Getting Package entity with id %q", id)
   143  	var pkgEnt Entity
   144  	if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &pkgEnt); err != nil {
   145  		return nil, err
   146  	}
   147  
   148  	pkgModel, err := r.conv.FromEntity(&pkgEnt)
   149  	if err != nil {
   150  		return nil, errors.Wrap(err, "while converting Package from Entity")
   151  	}
   152  
   153  	return pkgModel, nil
   154  }
   155  
   156  // ListByResourceID lists Packages by a given resource type and resource ID
   157  func (r *pgRepository) ListByResourceID(ctx context.Context, tenantID, resourceID string, resourceType resource.Type) ([]*model.Package, error) {
   158  	pkgCollection := pkgCollection{}
   159  
   160  	var condition repo.Condition
   161  	var err error
   162  	if resourceType == resource.Application {
   163  		condition = repo.NewEqualCondition(appIDColumn, resourceID)
   164  		err = r.lister.ListWithSelectForUpdate(ctx, resource.Package, tenantID, &pkgCollection, condition)
   165  	} else {
   166  		condition = repo.NewEqualCondition(appTemplateVersionIDColumn, resourceID)
   167  		err = r.listerGlobal.ListGlobalWithSelectForUpdate(ctx, &pkgCollection, condition)
   168  	}
   169  	if err != nil {
   170  		return nil, err
   171  	}
   172  
   173  	pkgs := make([]*model.Package, 0, pkgCollection.Len())
   174  	for _, pkg := range pkgCollection {
   175  		pkgModel, err := r.conv.FromEntity(&pkg)
   176  		if err != nil {
   177  			return nil, err
   178  		}
   179  		pkgs = append(pkgs, pkgModel)
   180  	}
   181  	return pkgs, nil
   182  }
   183  
   184  type pkgCollection []Entity
   185  
   186  // Len missing godoc
   187  func (pc pkgCollection) Len() int {
   188  	return len(pc)
   189  }