Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 45 additions & 4 deletions framework/configstore/rdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -2565,13 +2565,54 @@ func preloadVirtualKeyDetailRelations(db *gorm.DB) *gorm.DB {
return preloadCustomerRelations(preloadVirtualKeyBaseRelations(db), "Customer.")
}

// virtualKeyInternalPageSize is the bounded page size used when loading every
// virtual key with preloaded relationships. Keeping each page small avoids
// PostgreSQL's extended protocol parameter limit during GORM preloads.
const virtualKeyInternalPageSize = 1000

// GetVirtualKeys retrieves all virtual keys from the database.
func (s *RDBConfigStore) GetVirtualKeys(ctx context.Context) ([]tables.TableVirtualKey, error) {
var virtualKeys []tables.TableVirtualKey
var allVirtualKeys []tables.TableVirtualKey
var lastCreatedAt time.Time
var lastID string
hasCursor := false

// Preload all relationships for complete information
if err := preloadVirtualKeyBaseRelations(s.ScopedDB(ctx)).
Order("created_at ASC").
for {
virtualKeys, err := s.getVirtualKeysPage(ctx, virtualKeyInternalPageSize, lastCreatedAt, lastID, hasCursor)
if err != nil {
return nil, err
}
if len(virtualKeys) == 0 {
return allVirtualKeys, nil
}

allVirtualKeys = append(allVirtualKeys, virtualKeys...)
last := virtualKeys[len(virtualKeys)-1]
lastCreatedAt = last.CreatedAt
lastID = last.ID
hasCursor = true
if len(virtualKeys) < virtualKeyInternalPageSize {
return allVirtualKeys, nil
}
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.
}

// getVirtualKeysPage retrieves one unfiltered page of virtual keys without a
// COUNT query for internal all-key loading paths.
func (s *RDBConfigStore) getVirtualKeysPage(ctx context.Context, limit int, lastCreatedAt time.Time, lastID string, hasCursor bool) ([]tables.TableVirtualKey, error) {
var virtualKeys []tables.TableVirtualKey
query := preloadVirtualKeyBaseRelations(s.ScopedDB(ctx))
if hasCursor {
query = query.Where(
"(governance_virtual_keys.created_at > ? OR (governance_virtual_keys.created_at = ? AND governance_virtual_keys.id > ?))",
lastCreatedAt,
lastCreatedAt,
lastID,
)
}
if err := query.
Order("governance_virtual_keys.created_at ASC, governance_virtual_keys.id ASC").
Limit(limit).
Find(&virtualKeys).Error; err != nil {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
return nil, err
}
Expand Down
30 changes: 30 additions & 0 deletions framework/configstore/rdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package configstore
import (
"context"
"encoding/json"
"fmt"
"testing"
"time"

"github.com/maximhq/bifrost/core/schemas"
"github.com/maximhq/bifrost/framework/configstore/tables"
Expand Down Expand Up @@ -1259,6 +1261,34 @@ func TestFullVirtualKeyFlow(t *testing.T) {
assert.Equal(t, "openai", configs[0].Provider)
}

// TestGetVirtualKeysUsesInternalPagination verifies that the unpaginated
// virtual-key API still returns every row when the result spans multiple
// internal preload pages.
func TestGetVirtualKeysUsesInternalPagination(t *testing.T) {
store := setupRDBTestStore(t)
ctx := context.Background()

totalVirtualKeys := virtualKeyInternalPageSize + 5
createdAt := time.Date(2026, time.January, 1, 0, 0, 0, 0, time.UTC)
for i := 0; i < totalVirtualKeys; i++ {
vk := &tables.TableVirtualKey{
ID: fmt.Sprintf("vk-page-%04d", i),
Name: fmt.Sprintf("Virtual Key %04d", i),
Value: fmt.Sprintf("vk-value-%04d", i),
IsActive: schemas.Ptr(true),
CreatedAt: createdAt,
UpdatedAt: createdAt,
}
require.NoError(t, store.CreateVirtualKey(ctx, vk))
}

virtualKeys, err := store.GetVirtualKeys(ctx)
require.NoError(t, err)
require.Len(t, virtualKeys, totalVirtualKeys)
require.Equal(t, "vk-page-0000", virtualKeys[0].ID)
require.Equal(t, fmt.Sprintf("vk-page-%04d", totalVirtualKeys-1), virtualKeys[len(virtualKeys)-1].ID)
}

// =============================================================================
// Helper function tests
// =============================================================================
Expand Down
Loading