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