From 563fedf028eeb32a2360b1ba962491d6db1b595c Mon Sep 17 00:00:00 2001 From: Shivanand Sonnad Date: Thu, 27 Feb 2025 04:53:27 +0000 Subject: [PATCH] fix: [AH-818]: fix configure upstream proxy order change is not working (#3447) * feat: [AH-818]: fix go lint errors * feat: [AH-818]: fix PR comments * feat: [AH-818]: fix PR comments * feat: [AH-818]: fix linting errors * feat: [AH-818]: fix failing lint test * fix: [AH-818]: fix configure upstream proxy order change is not working --- registry/app/api/controller/metadata/base.go | 4 +-- registry/app/store/database/registry.go | 35 +++++++++++++++++--- registry/utils/utils.go | 7 ++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/registry/app/api/controller/metadata/base.go b/registry/app/api/controller/metadata/base.go index 473b421d4..5199c973d 100644 --- a/registry/app/api/controller/metadata/base.go +++ b/registry/app/api/controller/metadata/base.go @@ -269,8 +269,8 @@ func (c *APIController) setUpstreamProxyIDs( } var upstreamProxies []int64 - for _, repo := range *repos { - for _, proxy := range *virtualConfig.UpstreamProxies { + for _, proxy := range *virtualConfig.UpstreamProxies { + for _, repo := range *repos { if repo.RegIdentifier == proxy { regID, err := strconv.ParseInt(repo.RegID, 10, 64) if err != nil { diff --git a/registry/app/store/database/registry.go b/registry/app/store/database/registry.go index ba863f4f2..08d0c81d1 100644 --- a/registry/app/store/database/registry.go +++ b/registry/app/store/database/registry.go @@ -26,6 +26,7 @@ import ( "github.com/harness/gitness/registry/app/store" "github.com/harness/gitness/registry/app/store/database/util" "github.com/harness/gitness/registry/types" + "github.com/harness/gitness/registry/utils" gitnessstore "github.com/harness/gitness/store" databaseg "github.com/harness/gitness/store/database" "github.com/harness/gitness/store/database/dbtx" @@ -73,6 +74,11 @@ type registryDB struct { UpdatedBy int64 `db:"registry_updated_by"` } +type registryNameID struct { + ID int64 `db:"registry_id"` + Name string `db:"registry_name"` +} + func (r registryDao) Get(ctx context.Context, id int64) (*types.Registry, error) { stmt := databaseg.Builder. Select(util.ArrToStringByDelimiter(util.GetDBTagsFromStruct(registryDB{}), ",")). @@ -165,19 +171,21 @@ func (r registryDao) FetchUpstreamProxyKeys( ctx context.Context, ids []int64, ) (repokeys []string, err error) { - dst := make([]string, 0) + orderedRepoKeys := make([]string, 0) + if commons.IsEmpty(ids) { - return dst, nil + return orderedRepoKeys, nil } stmt := databaseg.Builder. - Select("registry_name"). + Select(util.ArrToStringByDelimiter(util.GetDBTagsFromStruct(registryNameID{}), ",")). From("registries"). Where(sq.Eq{"registry_id": ids}). Where("registry_type = ?", artifact.RegistryTypeUPSTREAM) db := dbtx.GetAccessor(ctx, r.db) + dst := []registryNameID{} sql, args, err := stmt.ToSql() if err != nil { return nil, errors.Wrap(err, "Failed to convert query to sql") @@ -186,7 +194,24 @@ func (r registryDao) FetchUpstreamProxyKeys( if err = db.SelectContext(ctx, &dst, sql, args...); err != nil { return nil, databaseg.ProcessSQLErrorf(ctx, err, "Failed to find repo") } - return dst, nil + + // Create a map + recordMap := make(map[int64]registryNameID) + for _, record := range dst { + recordMap[record.ID] = record + } + + // Reorder the fetched records based on the ID list + for _, id := range ids { + if record, exists := recordMap[id]; exists { + orderedRepoKeys = append(orderedRepoKeys, record.Name) + } else { + log.Ctx(ctx).Error().Msgf("failed to map upstream registry: %d", id) + orderedRepoKeys = append(orderedRepoKeys, "") + } + } + + return orderedRepoKeys, nil } func (r registryDao) GetByIDIn(ctx context.Context, ids []int64) (*[]types.Registry, error) { @@ -335,7 +360,7 @@ func (r registryDao) GetAll( } else { query = query.OrderBy(fmt.Sprintf("r.registry_%s %s", sortByField, sortByOrder)) } - query = query.Limit(uint64(limit)).Offset(uint64(offset)) + query = query.Limit(utils.SafeUint64(limit)).Offset(utils.SafeUint64(offset)) // Convert query to SQL sql, args, err := query.ToSql() diff --git a/registry/utils/utils.go b/registry/utils/utils.go index c232a7749..e1ff5dc0d 100644 --- a/registry/utils/utils.go +++ b/registry/utils/utils.go @@ -33,3 +33,10 @@ func HasAnySuffix(s string, prefixes []string) bool { } return false } + +func SafeUint64(n int) uint64 { + if n < 0 { + return 0 + } + return uint64(n) +}