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 }