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

     1  package systemauth
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  
     7  	"github.com/kyma-incubator/compass/components/director/pkg/model"
     8  
     9  	"github.com/kyma-incubator/compass/components/director/internal/repo"
    10  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
    11  	"github.com/kyma-incubator/compass/components/director/pkg/log"
    12  	"github.com/kyma-incubator/compass/components/director/pkg/resource"
    13  	"github.com/pkg/errors"
    14  )
    15  
    16  const tableName string = `public.system_auths`
    17  
    18  var (
    19  	tableColumns = []string{"id", "tenant_id", "app_id", "runtime_id", "integration_system_id", "value"}
    20  	tenantColumn = "tenant_id"
    21  )
    22  
    23  // Converter missing godoc
    24  //go:generate mockery --name=Converter --output=automock --outpkg=automock --case=underscore --disable-version-string
    25  type Converter interface {
    26  	ToEntity(in model.SystemAuth) (Entity, error)
    27  	FromEntity(in Entity) (model.SystemAuth, error)
    28  }
    29  
    30  type repository struct {
    31  	creator            repo.CreatorGlobal
    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  	updater            repo.UpdaterGlobal
    39  
    40  	conv Converter
    41  }
    42  
    43  // NewRepository missing godoc
    44  func NewRepository(conv Converter) *repository {
    45  	return &repository{
    46  		creator:            repo.NewCreatorGlobal(resource.SystemAuth, tableName, tableColumns),
    47  		singleGetter:       repo.NewSingleGetterWithEmbeddedTenant(tableName, tenantColumn, tableColumns),
    48  		singleGetterGlobal: repo.NewSingleGetterGlobal(resource.SystemAuth, tableName, tableColumns),
    49  		lister:             repo.NewListerWithEmbeddedTenant(tableName, tenantColumn, tableColumns),
    50  		listerGlobal:       repo.NewListerGlobal(resource.SystemAuth, tableName, tableColumns),
    51  		deleter:            repo.NewDeleterWithEmbeddedTenant(tableName, tenantColumn),
    52  		deleterGlobal:      repo.NewDeleterGlobal(resource.SystemAuth, tableName),
    53  		updater:            repo.NewUpdaterWithEmbeddedTenant(resource.SystemAuth, tableName, []string{"value"}, tenantColumn, []string{"id"}),
    54  		conv:               conv,
    55  	}
    56  }
    57  
    58  // Create missing godoc
    59  func (r *repository) Create(ctx context.Context, item model.SystemAuth) error {
    60  	entity, err := r.conv.ToEntity(item)
    61  	if err != nil {
    62  		return errors.Wrap(err, "while converting model to entity")
    63  	}
    64  
    65  	log.C(ctx).Debugf("Persisting SystemAuth entity with id %s to db", item.ID)
    66  	return r.creator.Create(ctx, entity)
    67  }
    68  
    69  // GetByIDForObject missing godoc
    70  func (r *repository) GetByIDForObject(ctx context.Context, tenant, id string, objType model.SystemAuthReferenceObjectType) (*model.SystemAuth, error) {
    71  	column, err := referenceObjectField(objType)
    72  	if err != nil {
    73  		return nil, err
    74  	}
    75  	objTypeCond := repo.NewNotNullCondition(column)
    76  
    77  	var entity Entity
    78  	if err := r.singleGetter.Get(ctx, resource.SystemAuth, tenant, repo.Conditions{repo.NewEqualCondition("id", id), objTypeCond}, repo.NoOrderBy, &entity); err != nil {
    79  		return nil, err
    80  	}
    81  
    82  	itemModel, err := r.conv.FromEntity(entity)
    83  	if err != nil {
    84  		return nil, errors.Wrap(err, "while converting SystemAuth entity to model")
    85  	}
    86  
    87  	return &itemModel, nil
    88  }
    89  
    90  // GetByIDGlobal missing godoc
    91  func (r *repository) GetByIDGlobal(ctx context.Context, id string) (*model.SystemAuth, error) {
    92  	var entity Entity
    93  	if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &entity); err != nil {
    94  		return nil, err
    95  	}
    96  
    97  	itemModel, err := r.conv.FromEntity(entity)
    98  	if err != nil {
    99  		return nil, errors.Wrap(err, "while converting SystemAuth entity to model")
   100  	}
   101  
   102  	return &itemModel, nil
   103  }
   104  
   105  // GetByIDForObjectGlobal missing godoc
   106  func (r *repository) GetByIDForObjectGlobal(ctx context.Context, id string, objType model.SystemAuthReferenceObjectType) (*model.SystemAuth, error) {
   107  	column, err := referenceObjectField(objType)
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  	objTypeCond := repo.NewNotNullCondition(column)
   112  
   113  	var entity Entity
   114  	if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id), objTypeCond}, repo.NoOrderBy, &entity); err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	itemModel, err := r.conv.FromEntity(entity)
   119  	if err != nil {
   120  		return nil, errors.Wrap(err, "while converting SystemAuth entity to model")
   121  	}
   122  
   123  	return &itemModel, nil
   124  }
   125  
   126  // GetByJSONValue missing godoc
   127  func (r *repository) GetByJSONValue(ctx context.Context, value map[string]interface{}) (*model.SystemAuth, error) {
   128  	valueBytes, err := json.Marshal(value)
   129  	if err != nil {
   130  		return nil, errors.Wrap(err, "could not marshal")
   131  	}
   132  	var entity Entity
   133  	if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewJSONCondition("value", string(valueBytes))}, repo.NoOrderBy, &entity); err != nil {
   134  		return nil, err
   135  	}
   136  
   137  	itemModel, err := r.conv.FromEntity(entity)
   138  	if err != nil {
   139  		return nil, errors.Wrap(err, "while converting SystemAuth entity to model")
   140  	}
   141  
   142  	return &itemModel, nil
   143  }
   144  
   145  // ListForObject missing godoc
   146  func (r *repository) ListForObject(ctx context.Context, tenant string, objectType model.SystemAuthReferenceObjectType, objectID string) ([]model.SystemAuth, error) {
   147  	objTypeFieldName, err := referenceObjectField(objectType)
   148  	if err != nil {
   149  		return nil, err
   150  	}
   151  
   152  	var entities Collection
   153  
   154  	conditions := repo.Conditions{
   155  		repo.NewEqualCondition(objTypeFieldName, objectID),
   156  	}
   157  
   158  	err = r.lister.List(ctx, resource.SystemAuth, tenant, &entities, conditions...)
   159  
   160  	if err != nil {
   161  		return nil, err
   162  	}
   163  
   164  	return r.multipleFromEntities(entities)
   165  }
   166  
   167  // ListForObjectGlobal missing godoc
   168  func (r *repository) ListForObjectGlobal(ctx context.Context, objectType model.SystemAuthReferenceObjectType, objectID string) ([]model.SystemAuth, error) {
   169  	objTypeFieldName, err := referenceObjectField(objectType)
   170  	if err != nil {
   171  		return nil, err
   172  	}
   173  
   174  	var entities Collection
   175  
   176  	conditions := repo.Conditions{
   177  		repo.NewEqualCondition(objTypeFieldName, objectID),
   178  	}
   179  
   180  	err = r.listerGlobal.ListGlobal(ctx, &entities, conditions...)
   181  	if err != nil {
   182  		return nil, err
   183  	}
   184  
   185  	return r.multipleFromEntities(entities)
   186  }
   187  
   188  // ListGlobalWithConditions missing godoc
   189  func (r *repository) ListGlobalWithConditions(ctx context.Context, conditions repo.Conditions) ([]model.SystemAuth, error) {
   190  	var entities Collection
   191  
   192  	if err := r.listerGlobal.ListGlobal(ctx, &entities, conditions...); err != nil {
   193  		return nil, err
   194  	}
   195  
   196  	return r.multipleFromEntities(entities)
   197  }
   198  
   199  func (r *repository) multipleFromEntities(entities Collection) ([]model.SystemAuth, error) {
   200  	items := make([]model.SystemAuth, 0, len(entities))
   201  
   202  	for _, ent := range entities {
   203  		m, err := r.conv.FromEntity(ent)
   204  		if err != nil {
   205  			return nil, errors.Wrap(err, "while creating system auth model from entity")
   206  		}
   207  
   208  		items = append(items, m)
   209  	}
   210  
   211  	return items, nil
   212  }
   213  
   214  // DeleteAllForObject missing godoc
   215  func (r *repository) DeleteAllForObject(ctx context.Context, tenant string, objectType model.SystemAuthReferenceObjectType, objectID string) error {
   216  	objTypeFieldName, err := referenceObjectField(objectType)
   217  	if err != nil {
   218  		return err
   219  	}
   220  	if objectType == model.IntegrationSystemReference {
   221  		return r.deleterGlobal.DeleteManyGlobal(ctx, repo.Conditions{repo.NewEqualCondition(objTypeFieldName, objectID)})
   222  	}
   223  	return r.deleter.DeleteMany(ctx, resource.SystemAuth, tenant, repo.Conditions{repo.NewEqualCondition(objTypeFieldName, objectID)})
   224  }
   225  
   226  // DeleteByIDForObject missing godoc
   227  func (r *repository) DeleteByIDForObject(ctx context.Context, tenant, id string, objType model.SystemAuthReferenceObjectType) error {
   228  	var objTypeCond repo.Condition
   229  
   230  	column, err := referenceObjectField(objType)
   231  	if err != nil {
   232  		return err
   233  	}
   234  	objTypeCond = repo.NewNotNullCondition(column)
   235  
   236  	return r.deleter.DeleteOne(ctx, resource.SystemAuth, tenant, repo.Conditions{repo.NewEqualCondition("id", id), objTypeCond})
   237  }
   238  
   239  // DeleteByIDForObjectGlobal missing godoc
   240  func (r *repository) DeleteByIDForObjectGlobal(ctx context.Context, id string, objType model.SystemAuthReferenceObjectType) error {
   241  	var objTypeCond repo.Condition
   242  
   243  	column, err := referenceObjectField(objType)
   244  	if err != nil {
   245  		return err
   246  	}
   247  	objTypeCond = repo.NewNotNullCondition(column)
   248  
   249  	return r.deleterGlobal.DeleteOneGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id), objTypeCond})
   250  }
   251  
   252  // Update missing godoc
   253  func (r *repository) Update(ctx context.Context, item *model.SystemAuth) error {
   254  	if item == nil {
   255  		return apperrors.NewInternalError("item cannot be nil")
   256  	}
   257  
   258  	entity, err := r.conv.ToEntity(*item)
   259  	if err != nil {
   260  		return errors.Wrap(err, "while converting model to entity")
   261  	}
   262  
   263  	return r.updater.UpdateSingleGlobal(ctx, entity)
   264  }
   265  
   266  func referenceObjectField(objectType model.SystemAuthReferenceObjectType) (string, error) {
   267  	switch objectType {
   268  	case model.ApplicationReference:
   269  		return "app_id", nil
   270  	case model.RuntimeReference:
   271  		return "runtime_id", nil
   272  	case model.IntegrationSystemReference:
   273  		return "integration_system_id", nil
   274  	}
   275  
   276  	return "", apperrors.NewInternalError("unsupported reference object type")
   277  }