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 }