From 4c49331753d5e66f8f02b898d41727ff180f5111 Mon Sep 17 00:00:00 2001 From: Emilia Grant Date: Tue, 20 Jan 2026 14:34:02 -0500 Subject: [PATCH] feat(clientcache): Implement sorting in targets repository (#6346) --- .../internal/cache/repository_targets.go | 12 +++++- .../internal/cache/repository_targets_test.go | 40 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/internal/clientcache/internal/cache/repository_targets.go b/internal/clientcache/internal/cache/repository_targets.go index ce4805f365..f85be97bbf 100644 --- a/internal/clientcache/internal/cache/repository_targets.go +++ b/internal/clientcache/internal/cache/repository_targets.go @@ -373,8 +373,18 @@ func (r *Repository) searchTargets(ctx context.Context, condition string, search searchArgs = append(searchArgs, opts.withUserId) } + dbOpts := []db.Option{db.WithLimit(opts.withMaxResultSetSize + 1)} + if opts.withSortBy != "" { + sd := opts.withSortDirection + if sd != Ascending && sd != Descending { + sd = Ascending + } + orderClause := fmt.Sprintf("%s %s", opts.withSortBy, sd) + dbOpts = append(dbOpts, db.WithOrder(orderClause)) + } + var cachedTargets []*Target - if err := r.rw.SearchWhere(ctx, &cachedTargets, condition, searchArgs, db.WithLimit(opts.withMaxResultSetSize+1)); err != nil { + if err := r.rw.SearchWhere(ctx, &cachedTargets, condition, searchArgs, dbOpts...); err != nil { return nil, errors.Wrap(ctx, err, op) } diff --git a/internal/clientcache/internal/cache/repository_targets_test.go b/internal/clientcache/internal/cache/repository_targets_test.go index 11a96631f3..6bb968289d 100644 --- a/internal/clientcache/internal/cache/repository_targets_test.go +++ b/internal/clientcache/internal/cache/repository_targets_test.go @@ -358,6 +358,27 @@ func TestRepository_ListTargets(t *testing.T) { assert.Len(t, l.Targets, len(ts)) assert.ElementsMatch(t, l.Targets, ts) }) + + t.Run("withSortBy sorts targets", func(t *testing.T) { + l, err := r.ListTargets(ctx, kt1.AuthTokenId, WithSort(SortByName, Descending, []SortBy{SortByName})) + assert.NoError(t, err) + assert.Equal(t, ts[2].Name, l.Targets[0].Name) + assert.Equal(t, ts[1].Name, l.Targets[1].Name) + assert.Equal(t, ts[0].Name, l.Targets[2].Name) + }) + + t.Run("withSortBy bad SortBy errors", func(t *testing.T) { + _, err := r.ListTargets(ctx, kt1.AuthTokenId, WithSort(SortByCreatedTime, Descending, []SortBy{SortByName})) + assert.Error(t, err) + }) + + t.Run("withSortBy bad SortDirection defaults to Ascending", func(t *testing.T) { + l, err := r.ListTargets(ctx, kt1.AuthTokenId, WithSort(SortByName, "Something else", []SortBy{SortByName})) + assert.NoError(t, err) + assert.Equal(t, ts[0].Name, l.Targets[0].Name) + assert.Equal(t, ts[1].Name, l.Targets[1].Name) + assert.Equal(t, ts[2].Name, l.Targets[2].Name) + }) } func TestRepository_ListTargetsLimiting(t *testing.T) { @@ -525,6 +546,25 @@ func TestRepository_QueryTargets(t *testing.T) { assert.Len(t, l.Targets, 2) assert.ElementsMatch(t, l.Targets, ts[0:2]) }) + + t.Run("withSortBy sorts targets", func(t *testing.T) { + l, err := r.QueryTargets(ctx, kt1.AuthTokenId, query, WithSort(SortByName, Descending, []SortBy{SortByName})) + assert.NoError(t, err) + assert.Equal(t, ts[1].Name, l.Targets[0].Name) + assert.Equal(t, ts[0].Name, l.Targets[1].Name) + }) + + t.Run("withSortBy bad SortBy errors", func(t *testing.T) { + _, err := r.QueryTargets(ctx, kt1.AuthTokenId, query, WithSort(SortByCreatedTime, Descending, []SortBy{SortByName})) + assert.Error(t, err) + }) + + t.Run("withSortBy bad SortDirection defaults to Ascending", func(t *testing.T) { + l, err := r.QueryTargets(ctx, kt1.AuthTokenId, query, WithSort(SortByName, "Something else", []SortBy{SortByName})) + assert.NoError(t, err) + assert.Equal(t, ts[0].Name, l.Targets[0].Name) + assert.Equal(t, ts[1].Name, l.Targets[1].Name) + }) } func TestRepository_QueryTargetsLimiting(t *testing.T) {