github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/ordvendor/repository.go (about) 1 package ordvendor 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 vendorTable string = `public.vendors` 15 16 var ( 17 vendorColumns = []string{"ord_id", "app_id", "app_template_version_id", "title", "labels", "partners", "id", "tags", "documentation_labels"} 18 updatableColumns = []string{"title", "labels", "partners", "tags", "documentation_labels"} 19 ) 20 21 // EntityConverter missing godoc 22 // 23 //go:generate mockery --name=EntityConverter --output=automock --outpkg=automock --case=underscore --disable-version-string 24 type EntityConverter interface { 25 ToEntity(in *model.Vendor) *Entity 26 FromEntity(entity *Entity) (*model.Vendor, error) 27 } 28 29 type pgRepository struct { 30 conv EntityConverter 31 existQuerier repo.ExistQuerier 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 creator repo.Creator 39 creatorGlobal repo.CreatorGlobal 40 updater repo.Updater 41 updaterGlobal repo.UpdaterGlobal 42 } 43 44 // NewRepository creates a new instance of repository 45 func NewRepository(conv EntityConverter) *pgRepository { 46 return &pgRepository{ 47 conv: conv, 48 existQuerier: repo.NewExistQuerier(vendorTable), 49 singleGetter: repo.NewSingleGetter(vendorTable, vendorColumns), 50 singleGetterGlobal: repo.NewSingleGetterGlobal(resource.Vendor, vendorTable, vendorColumns), 51 lister: repo.NewLister(vendorTable, vendorColumns), 52 listerGlobal: repo.NewListerGlobal(resource.Vendor, vendorTable, vendorColumns), 53 deleter: repo.NewDeleter(vendorTable), 54 deleterGlobal: repo.NewDeleterGlobal(resource.Vendor, vendorTable), 55 creator: repo.NewCreator(vendorTable, vendorColumns), 56 creatorGlobal: repo.NewCreatorGlobal(resource.Vendor, vendorTable, vendorColumns), 57 updater: repo.NewUpdater(vendorTable, updatableColumns, []string{"id"}), 58 updaterGlobal: repo.NewUpdaterGlobal(resource.Vendor, vendorTable, updatableColumns, []string{"id"}), 59 } 60 } 61 62 // Create creates a new Vendor 63 func (r *pgRepository) Create(ctx context.Context, tenant string, model *model.Vendor) error { 64 if model == nil { 65 return apperrors.NewInternalError("model can not be nil") 66 } 67 68 log.C(ctx).Debugf("Persisting Vendor entity with id %q", model.ID) 69 return r.creator.Create(ctx, resource.Vendor, tenant, r.conv.ToEntity(model)) 70 } 71 72 // CreateGlobal creates a new Vendor without tenant isolation. 73 func (r *pgRepository) CreateGlobal(ctx context.Context, model *model.Vendor) error { 74 if model == nil { 75 return apperrors.NewInternalError("model can not be nil") 76 } 77 78 log.C(ctx).Debugf("Persisting Vendor entity with id %q", model.ID) 79 return r.creatorGlobal.Create(ctx, r.conv.ToEntity(model)) 80 } 81 82 // Update updates an existing Vendor 83 func (r *pgRepository) Update(ctx context.Context, tenant string, model *model.Vendor) error { 84 if model == nil { 85 return apperrors.NewInternalError("model can not be nil") 86 } 87 log.C(ctx).Debugf("Updating Vendor entity with id %q", model.ID) 88 return r.updater.UpdateSingle(ctx, resource.Vendor, tenant, r.conv.ToEntity(model)) 89 } 90 91 // UpdateGlobal updates a Vendor without tenant isolation. 92 func (r *pgRepository) UpdateGlobal(ctx context.Context, model *model.Vendor) error { 93 if model == nil { 94 return apperrors.NewInternalError("model can not be nil") 95 } 96 log.C(ctx).Debugf("Updating Vendor entity with id %q", model.ID) 97 return r.updaterGlobal.UpdateSingleGlobal(ctx, r.conv.ToEntity(model)) 98 } 99 100 // Delete deletes an existing Vendor 101 func (r *pgRepository) Delete(ctx context.Context, tenant, id string) error { 102 log.C(ctx).Debugf("Deleting Vendor entity with id %q", id) 103 return r.deleter.DeleteOne(ctx, resource.Vendor, tenant, repo.Conditions{repo.NewEqualCondition("id", id)}) 104 } 105 106 // DeleteGlobal deletes a Vendor without tenant isolation. 107 func (r *pgRepository) DeleteGlobal(ctx context.Context, id string) error { 108 log.C(ctx).Debugf("Deleting Vendor entity with id %q", id) 109 return r.deleterGlobal.DeleteOneGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)}) 110 } 111 112 // Exists checks if a Vendor exists 113 func (r *pgRepository) Exists(ctx context.Context, tenant, id string) (bool, error) { 114 return r.existQuerier.Exists(ctx, resource.Vendor, tenant, repo.Conditions{repo.NewEqualCondition("id", id)}) 115 } 116 117 // GetByID gets a Vendor by its id 118 func (r *pgRepository) GetByID(ctx context.Context, tenant, id string) (*model.Vendor, error) { 119 log.C(ctx).Debugf("Getting Vendor entity with id %q", id) 120 var vendorEnt Entity 121 if err := r.singleGetter.Get(ctx, resource.Vendor, tenant, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &vendorEnt); err != nil { 122 return nil, err 123 } 124 125 vendorModel, err := r.conv.FromEntity(&vendorEnt) 126 if err != nil { 127 return nil, errors.Wrap(err, "while converting Vendor from Entity") 128 } 129 130 return vendorModel, nil 131 } 132 133 // GetByIDGlobal gets a Vendor without tenant isolation. 134 func (r *pgRepository) GetByIDGlobal(ctx context.Context, id string) (*model.Vendor, error) { 135 log.C(ctx).Debugf("Getting Vendor entity with id %q", id) 136 var vendorEnt Entity 137 if err := r.singleGetterGlobal.GetGlobal(ctx, repo.Conditions{repo.NewEqualCondition("id", id)}, repo.NoOrderBy, &vendorEnt); err != nil { 138 return nil, err 139 } 140 141 vendorModel, err := r.conv.FromEntity(&vendorEnt) 142 if err != nil { 143 return nil, errors.Wrap(err, "while converting Vendor from Entity") 144 } 145 146 return vendorModel, nil 147 } 148 149 // ListByResourceID gets a list of Vendors by given resource id and type 150 func (r *pgRepository) ListByResourceID(ctx context.Context, tenantID, resourceID string, resourceType resource.Type) ([]*model.Vendor, error) { 151 vendorCollection := vendorCollection{} 152 153 var condition repo.Condition 154 var err error 155 if resourceType == resource.Application { 156 condition = repo.NewEqualCondition("app_id", resourceID) 157 err = r.lister.ListWithSelectForUpdate(ctx, resource.Vendor, tenantID, &vendorCollection, condition) 158 } else { 159 condition = repo.NewEqualCondition("app_template_version_id", resourceID) 160 err = r.listerGlobal.ListGlobalWithSelectForUpdate(ctx, &vendorCollection, condition) 161 } 162 if err != nil { 163 return nil, err 164 } 165 166 vendors := make([]*model.Vendor, 0, vendorCollection.Len()) 167 for _, vendor := range vendorCollection { 168 vendorModel, err := r.conv.FromEntity(&vendor) 169 if err != nil { 170 return nil, err 171 } 172 vendors = append(vendors, vendorModel) 173 } 174 return vendors, nil 175 } 176 177 // ListGlobal lists all Global Vendors (with NULL app_id) without tenant isolation. 178 func (r *pgRepository) ListGlobal(ctx context.Context) ([]*model.Vendor, error) { 179 vendorCollection := vendorCollection{} 180 if err := r.listerGlobal.ListGlobalWithSelectForUpdate(ctx, &vendorCollection, repo.NewNullCondition("app_id")); err != nil { 181 return nil, err 182 } 183 vendors := make([]*model.Vendor, 0, vendorCollection.Len()) 184 for _, vendor := range vendorCollection { 185 vendorModel, err := r.conv.FromEntity(&vendor) 186 if err != nil { 187 return nil, err 188 } 189 vendors = append(vendors, vendorModel) 190 } 191 return vendors, nil 192 } 193 194 type vendorCollection []Entity 195 196 // Len missing godoc 197 func (pc vendorCollection) Len() int { 198 return len(pc) 199 }