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

     1  package apptemplate
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/kyma-incubator/compass/components/director/internal/domain/label"
     7  	"github.com/kyma-incubator/compass/components/director/internal/labelfilter"
     8  
     9  	"github.com/kyma-incubator/compass/components/director/pkg/log"
    10  
    11  	"github.com/kyma-incubator/compass/components/director/pkg/resource"
    12  
    13  	"github.com/kyma-incubator/compass/components/director/internal/model"
    14  	"github.com/kyma-incubator/compass/components/director/internal/repo"
    15  	"github.com/pkg/errors"
    16  )
    17  
    18  const tableName string = `public.app_templates`
    19  
    20  var (
    21  	updatableTableColumns = []string{"name", "description", "application_namespace", "application_input", "placeholders", "access_level"}
    22  	idTableColumns        = []string{"id"}
    23  	tableColumns          = append(idTableColumns, updatableTableColumns...)
    24  )
    25  
    26  // EntityConverter missing godoc
    27  //go:generate mockery --name=EntityConverter --output=automock --outpkg=automock --case=underscore --disable-version-string
    28  type EntityConverter interface {
    29  	ToEntity(in *model.ApplicationTemplate) (*Entity, error)
    30  	FromEntity(entity *Entity) (*model.ApplicationTemplate, error)
    31  }
    32  
    33  type repository struct {
    34  	creator               repo.CreatorGlobal
    35  	existQuerierGlobal    repo.ExistQuerierGlobal
    36  	singleGetterGlobal    repo.SingleGetterGlobal
    37  	pageableQuerierGlobal repo.PageableQuerierGlobal
    38  	updaterGlobal         repo.UpdaterGlobal
    39  	deleterGlobal         repo.DeleterGlobal
    40  	listerGlobal          repo.ListerGlobal
    41  	conv                  EntityConverter
    42  }
    43  
    44  // NewRepository missing godoc
    45  func NewRepository(conv EntityConverter) *repository {
    46  	return &repository{
    47  		creator:               repo.NewCreatorGlobal(resource.ApplicationTemplate, tableName, tableColumns),
    48  		existQuerierGlobal:    repo.NewExistQuerierGlobal(resource.ApplicationTemplate, tableName),
    49  		singleGetterGlobal:    repo.NewSingleGetterGlobal(resource.ApplicationTemplate, tableName, tableColumns),
    50  		pageableQuerierGlobal: repo.NewPageableQuerierGlobal(resource.ApplicationTemplate, tableName, tableColumns),
    51  		updaterGlobal:         repo.NewUpdaterGlobal(resource.ApplicationTemplate, tableName, updatableTableColumns, idTableColumns),
    52  		deleterGlobal:         repo.NewDeleterGlobal(resource.ApplicationTemplate, tableName),
    53  		listerGlobal:          repo.NewListerGlobal(resource.ApplicationTemplate, tableName, tableColumns),
    54  		conv:                  conv,
    55  	}
    56  }
    57  
    58  // Create missing godoc
    59  func (r *repository) Create(ctx context.Context, item model.ApplicationTemplate) error {
    60  	log.C(ctx).Debugf("Converting Application Template with id %s to entity", item.ID)
    61  	entity, err := r.conv.ToEntity(&item)
    62  	if err != nil {
    63  		return errors.Wrapf(err, "while converting Application Template with ID %s", item.ID)
    64  	}
    65  
    66  	log.C(ctx).Debugf("Persisting Application Template entity with id %s to db", item.ID)
    67  	return r.creator.Create(ctx, entity)
    68  }
    69  
    70  // Get missing godoc
    71  func (r *repository) Get(ctx context.Context, id string) (*model.ApplicationTemplate, error) {
    72  	var entity Entity
    73  	if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &entity); err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	result, err := r.conv.FromEntity(&entity)
    78  	if err != nil {
    79  		return nil, errors.Wrapf(err, "while converting Application Template with ID %s", id)
    80  	}
    81  
    82  	return result, nil
    83  }
    84  
    85  // GetByFilters builds a subquery for a given slice of labelfilter.LabelFilter and gets a model.ApplicationTemplate
    86  func (r *repository) GetByFilters(ctx context.Context, filter []*labelfilter.LabelFilter) (*model.ApplicationTemplate, error) {
    87  	filterSubquery, args, err := label.FilterQueryGlobal(model.AppTemplateLabelableObject, label.IntersectSet, filter)
    88  	if err != nil {
    89  		return nil, errors.Wrap(err, "while building filter query")
    90  	}
    91  
    92  	var additionalConditions repo.Conditions
    93  	if filterSubquery != "" {
    94  		additionalConditions = append(additionalConditions, repo.NewInConditionForSubQuery("id", filterSubquery, args))
    95  	}
    96  
    97  	var entity Entity
    98  	if err := r.singleGetterGlobal.GetGlobal(ctx, additionalConditions, repo.NoOrderBy, &entity); err != nil {
    99  		return nil, err
   100  	}
   101  
   102  	model, err := r.conv.FromEntity(&entity)
   103  	if err != nil {
   104  		return nil, errors.Wrapf(err, "while converting Application Template with ID %s", entity.ID)
   105  	}
   106  
   107  	return model, nil
   108  }
   109  
   110  func (r *repository) ListByIDs(ctx context.Context, ids []string) ([]*model.ApplicationTemplate, error) {
   111  	if len(ids) == 0 {
   112  		return nil, nil
   113  	}
   114  	var entities EntityCollection
   115  	if err := r.listerGlobal.ListGlobal(ctx, &entities, repo.NewInConditionForStringValues("id", ids)); err != nil {
   116  		return nil, err
   117  	}
   118  
   119  	return r.multipleFromEntities(entities)
   120  }
   121  
   122  // Exists missing godoc
   123  func (r *repository) Exists(ctx context.Context, id string) (bool, error) {
   124  	return r.existQuerierGlobal.ExistsGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)})
   125  }
   126  
   127  // List missing godoc
   128  func (r *repository) List(ctx context.Context, filter []*labelfilter.LabelFilter, pageSize int, cursor string) (model.ApplicationTemplatePage, error) {
   129  	var entityCollection EntityCollection
   130  
   131  	filterSubquery, args, err := label.FilterQueryGlobal(model.AppTemplateLabelableObject, label.IntersectSet, filter)
   132  	if err != nil {
   133  		return model.ApplicationTemplatePage{}, errors.Wrap(err, "while building filter query")
   134  	}
   135  
   136  	var conditions repo.Conditions
   137  	if filterSubquery != "" {
   138  		conditions = append(conditions, repo.NewInConditionForSubQuery("id", filterSubquery, args))
   139  	}
   140  
   141  	conditionsTree := repo.And(repo.ConditionTreesFromConditions(conditions)...)
   142  
   143  	page, totalCount, err := r.pageableQuerierGlobal.ListGlobalWithAdditionalConditions(ctx, pageSize, cursor, "id", &entityCollection, conditionsTree)
   144  	if err != nil {
   145  		return model.ApplicationTemplatePage{}, err
   146  	}
   147  
   148  	items := make([]*model.ApplicationTemplate, 0, len(entityCollection))
   149  
   150  	for _, entity := range entityCollection {
   151  		isModel, err := r.conv.FromEntity(&entity)
   152  		if err != nil {
   153  			return model.ApplicationTemplatePage{}, errors.Wrapf(err, "while converting Application Template entity with ID %s", entity.ID)
   154  		}
   155  
   156  		items = append(items, isModel)
   157  	}
   158  	return model.ApplicationTemplatePage{
   159  		Data:       items,
   160  		TotalCount: totalCount,
   161  		PageInfo:   page,
   162  	}, nil
   163  }
   164  
   165  // ListByName retrieves all Application Templates by given name
   166  func (r *repository) ListByName(ctx context.Context, name string) ([]*model.ApplicationTemplate, error) {
   167  	var entities EntityCollection
   168  	if err := r.listerGlobal.ListGlobal(ctx, &entities, repo.Conditions{repo.NewEqualCondition("name", name)}...); err != nil {
   169  		return nil, err
   170  	}
   171  
   172  	return r.multipleFromEntities(entities)
   173  }
   174  
   175  // ListByFilters builds a subquery for a given slice of labelfilter.LabelFilter and gets a slice of model.ApplicationTemplate
   176  func (r *repository) ListByFilters(ctx context.Context, filter []*labelfilter.LabelFilter) ([]*model.ApplicationTemplate, error) {
   177  	filterSubquery, args, err := label.FilterQueryGlobal(model.AppTemplateLabelableObject, label.IntersectSet, filter)
   178  	if err != nil {
   179  		return nil, errors.Wrap(err, "while building filter query")
   180  	}
   181  
   182  	var additionalConditions repo.Conditions
   183  	if filterSubquery != "" {
   184  		additionalConditions = append(additionalConditions, repo.NewInConditionForSubQuery("id", filterSubquery, args))
   185  	}
   186  
   187  	var entities EntityCollection
   188  	if err := r.listerGlobal.ListGlobal(ctx, &entities, additionalConditions...); err != nil {
   189  		return nil, err
   190  	}
   191  
   192  	return r.multipleFromEntities(entities)
   193  }
   194  
   195  // Update missing godoc
   196  func (r *repository) Update(ctx context.Context, model model.ApplicationTemplate) error {
   197  	entity, err := r.conv.ToEntity(&model)
   198  	if err != nil {
   199  		return errors.Wrapf(err, "while converting Application Template with ID %s", model.ID)
   200  	}
   201  
   202  	return r.updaterGlobal.UpdateSingleGlobal(ctx, entity)
   203  }
   204  
   205  // Delete missing godoc
   206  func (r *repository) Delete(ctx context.Context, id string) error {
   207  	return r.deleterGlobal.DeleteOneGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)})
   208  }
   209  
   210  func (r *repository) multipleFromEntities(entities EntityCollection) ([]*model.ApplicationTemplate, error) {
   211  	items := make([]*model.ApplicationTemplate, 0, len(entities))
   212  	for _, ent := range entities {
   213  		m, err := r.conv.FromEntity(&ent)
   214  		if err != nil {
   215  			return nil, err
   216  		}
   217  		items = append(items, m)
   218  	}
   219  	return items, nil
   220  }