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 }