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

     1  package labeldef
     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/model"
     9  	"github.com/kyma-incubator/compass/components/director/internal/repo"
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  const (
    14  	tableName     = "public.label_definitions"
    15  	tenantColumn  = "tenant_id"
    16  	keyColumn     = "key"
    17  	schemaColumn  = "schema"
    18  	versionColumn = "version"
    19  )
    20  
    21  // EntityConverter missing godoc
    22  //go:generate mockery --name=EntityConverter --output=automock --outpkg=automock --case=underscore --disable-version-string
    23  type EntityConverter interface {
    24  	ToEntity(in model.LabelDefinition) (Entity, error)
    25  	FromEntity(in Entity) (model.LabelDefinition, error)
    26  }
    27  
    28  var (
    29  	idColumns          = []string{"id"}
    30  	versionedIDColumns = append(idColumns, versionColumn)
    31  	labeldefColumns    = []string{"id", tenantColumn, keyColumn, schemaColumn, versionColumn}
    32  	updatableColumns   = []string{"schema"}
    33  )
    34  
    35  type repository struct {
    36  	conv             EntityConverter
    37  	creator          repo.CreatorGlobal
    38  	getter           repo.SingleGetter
    39  	lister           repo.Lister
    40  	existQuerier     repo.ExistQuerier
    41  	deleter          repo.Deleter
    42  	updater          repo.UpdaterGlobal
    43  	versionedUpdater repo.UpdaterGlobal
    44  	upserter         repo.UpserterGlobal
    45  }
    46  
    47  // NewRepository missing godoc
    48  func NewRepository(conv EntityConverter) *repository {
    49  	return &repository{conv: conv,
    50  		creator:          repo.NewCreatorGlobal(resource.LabelDefinition, tableName, labeldefColumns),
    51  		getter:           repo.NewSingleGetterWithEmbeddedTenant(tableName, tenantColumn, labeldefColumns),
    52  		existQuerier:     repo.NewExistQuerierWithEmbeddedTenant(tableName, tenantColumn),
    53  		lister:           repo.NewListerWithEmbeddedTenant(tableName, tenantColumn, labeldefColumns),
    54  		deleter:          repo.NewDeleterWithEmbeddedTenant(tableName, tenantColumn),
    55  		updater:          repo.NewUpdaterWithEmbeddedTenant(resource.LabelDefinition, tableName, updatableColumns, tenantColumn, idColumns),
    56  		versionedUpdater: repo.NewUpdaterWithEmbeddedTenant(resource.LabelDefinition, tableName, updatableColumns, tenantColumn, versionedIDColumns),
    57  		upserter:         repo.NewUpserterWithEmbeddedTenant(resource.LabelDefinition, tableName, labeldefColumns, []string{tenantColumn, keyColumn}, []string{schemaColumn}, tenantColumn),
    58  	}
    59  }
    60  
    61  // Create missing godoc
    62  func (r *repository) Create(ctx context.Context, def model.LabelDefinition) error {
    63  	entity, err := r.conv.ToEntity(def)
    64  	if err != nil {
    65  		return errors.Wrap(err, "while converting Label Definition to insert")
    66  	}
    67  
    68  	err = r.creator.Create(ctx, entity)
    69  	if err != nil {
    70  		return errors.Wrap(err, "while inserting Label Definition")
    71  	}
    72  	return nil
    73  }
    74  
    75  // Upsert missing godoc
    76  func (r *repository) Upsert(ctx context.Context, label model.LabelDefinition) error {
    77  	labelEntity, err := r.conv.ToEntity(label)
    78  	if err != nil {
    79  		return errors.Wrap(err, "while creating label definition entity from model")
    80  	}
    81  
    82  	return r.upserter.UpsertGlobal(ctx, labelEntity)
    83  }
    84  
    85  // GetByKey missing godoc
    86  func (r *repository) GetByKey(ctx context.Context, tenant string, key string) (*model.LabelDefinition, error) {
    87  	conds := repo.Conditions{repo.NewEqualCondition("key", key)}
    88  	dest := Entity{}
    89  
    90  	err := r.getter.Get(ctx, resource.LabelDefinition, tenant, conds, repo.NoOrderBy, &dest)
    91  	if err != nil {
    92  		return nil, errors.Wrapf(err, "while getting Label Definition by key=%s", key)
    93  	}
    94  
    95  	out, err := r.conv.FromEntity(dest)
    96  	if err != nil {
    97  		return nil, errors.Wrap(err, "while converting Label Definition")
    98  	}
    99  	return &out, nil
   100  }
   101  
   102  // Exists missing godoc
   103  func (r *repository) Exists(ctx context.Context, tenant string, key string) (bool, error) {
   104  	conds := repo.Conditions{repo.NewEqualCondition("key", key)}
   105  	return r.existQuerier.Exists(ctx, resource.LabelDefinition, tenant, conds)
   106  }
   107  
   108  // List missing godoc
   109  func (r *repository) List(ctx context.Context, tenant string) ([]model.LabelDefinition, error) {
   110  	var dest EntityCollection
   111  
   112  	err := r.lister.List(ctx, resource.LabelDefinition, tenant, &dest)
   113  	if err != nil {
   114  		return nil, errors.Wrap(err, "while listing Label Definitions")
   115  	}
   116  	out := make([]model.LabelDefinition, 0, len(dest))
   117  	for _, entity := range dest {
   118  		ld, err := r.conv.FromEntity(entity)
   119  		if err != nil {
   120  			return nil, errors.Wrapf(err, "while converting Label Definition [key=%s]", entity.Key)
   121  		}
   122  		out = append(out, ld)
   123  	}
   124  	return out, nil
   125  }
   126  
   127  // Update missing godoc
   128  func (r *repository) Update(ctx context.Context, def model.LabelDefinition) error {
   129  	entity, err := r.conv.ToEntity(def)
   130  	if err != nil {
   131  		return errors.Wrap(err, "while creating Label Definition entity from model")
   132  	}
   133  	return r.updater.UpdateSingleWithVersionGlobal(ctx, entity)
   134  }
   135  
   136  // UpdateWithVersion missing godoc
   137  func (r *repository) UpdateWithVersion(ctx context.Context, def model.LabelDefinition) error {
   138  	entity, err := r.conv.ToEntity(def)
   139  	if err != nil {
   140  		return errors.Wrap(err, "while creating Label Definition entity from model")
   141  	}
   142  	return r.versionedUpdater.UpdateSingleWithVersionGlobal(ctx, entity)
   143  }
   144  
   145  // DeleteByKey missing godoc
   146  func (r *repository) DeleteByKey(ctx context.Context, tenant, key string) error {
   147  	conds := repo.Conditions{repo.NewEqualCondition("key", key)}
   148  	return r.deleter.DeleteOne(ctx, resource.LabelDefinition, tenant, conds)
   149  }