From 5b5fad319b2ff3be8f9a8f76396478f2eaeb8f3b Mon Sep 17 00:00:00 2001 From: mayanksharmaCSE Date: Sat, 11 Apr 2026 18:23:06 +0530 Subject: [PATCH 1/4] fix: implement cursor-based pagination for ListRepositories endpoint Signed-off-by: mayanksharmaCSE --- .../controlplane/handlers_repositories.go | 33 +++++-- .../handlers_repositories_test.go | 12 ++- .../repositories/mock/fixtures/service.go | 30 ++++++ internal/repositories/mock/service.go | 16 +++ internal/repositories/service.go | 99 +++++++++++++++++++ 5 files changed, 177 insertions(+), 13 deletions(-) diff --git a/internal/controlplane/handlers_repositories.go b/internal/controlplane/handlers_repositories.go index 5fd823e857..448e11c6e0 100644 --- a/internal/controlplane/handlers_repositories.go +++ b/internal/controlplane/handlers_repositories.go @@ -135,9 +135,11 @@ func (s *Server) repoCreateInfoFromUpstreamEntityRef( // ListRepositories returns a list of repositories for a given project // This function will typically be called by the client to get a list of -// repositories that are registered present in the minder database +// repositories that are registered present in the minder database. +// Pagination is cursor-based: pass an empty cursor for the first page, +// then use the returned cursor for subsequent pages. func (s *Server) ListRepositories(ctx context.Context, - _ *pb.ListRepositoriesRequest) (*pb.ListRepositoriesResponse, error) { + in *pb.ListRepositoriesRequest) (*pb.ListRepositoriesResponse, error) { entityCtx := engcontext.EntityFromContext(ctx) projectID := entityCtx.Project.ID providerName := entityCtx.Provider.Name @@ -154,8 +156,24 @@ func (s *Server) ListRepositories(ctx context.Context, return nil, status.Errorf(codes.Internal, "cannot get provider: %v", err) } - // Fetch repositories using the service - repoEntities, err := s.repos.ListRepositories(ctx, projectID, provider.ID) + // Parse cursor from request (empty string means first page) + var cursor uuid.UUID + if in.GetCursor() != "" { + cursor, err = uuid.Parse(in.GetCursor()) + if err != nil { + return nil, util.UserVisibleError(codes.InvalidArgument, "invalid cursor format") + } + } + + // Use request limit if provided, otherwise default + limit := in.GetLimit() + if limit <= 0 { + limit = 100 + } + + // Fetch repositories using the paginated service method + repoEntities, nextCursor, err := s.repos.ListRepositoriesPaginated( + ctx, projectID, provider.ID, cursor, limit) if err != nil { return nil, err } @@ -191,11 +209,10 @@ func (s *Server) ListRepositories(ctx context.Context, results = append(results, pbRepo) } - // TODO: Implement cursor-based pagination using entity IDs - // For now, return all results without pagination - resp.Results = results - resp.Cursor = "" + if nextCursor != uuid.Nil { + resp.Cursor = nextCursor.String() + } return &resp, nil } diff --git a/internal/controlplane/handlers_repositories_test.go b/internal/controlplane/handlers_repositories_test.go index ce7f31e8ae..2feac499b4 100644 --- a/internal/controlplane/handlers_repositories_test.go +++ b/internal/controlplane/handlers_repositories_test.go @@ -175,9 +175,11 @@ func TestServer_ListRepositories(t *testing.T) { { Name: "List repositories succeeds with multiple results", RepoServiceSetup: rf.NewRepoService( - rf.WithSuccessfulListRepositories( - simpleDbRepository(repoName, remoteRepoId), - simpleDbRepository(repoName2, remoteRepoId2), + rf.WithSuccessfulListRepositoriesPaginated( + []*models.EntityWithProperties{ + simpleDbRepository(repoName, remoteRepoId), + simpleDbRepository(repoName2, remoteRepoId2), + }, ), ), ProviderSetup: func(ctrl *gomock.Controller, mgr *mockmanager.MockProviderManager) { @@ -246,14 +248,14 @@ func TestServer_ListRepositories(t *testing.T) { { Name: "List repositories succeeds with empty results", RepoServiceSetup: rf.NewRepoService( - rf.WithSuccessfulListRepositories(), + rf.WithSuccessfulListRepositoriesPaginated(nil), ), ExpectedResults: nil, }, { Name: "List repositories fails when repo service returns error", RepoServiceSetup: rf.NewRepoService( - rf.WithFailedListRepositories(errDefault), + rf.WithFailedListRepositoriesPaginated(errDefault), ), ExpectedError: errDefault.Error(), }, diff --git a/internal/repositories/mock/fixtures/service.go b/internal/repositories/mock/fixtures/service.go index ad34557208..134eaa8231 100644 --- a/internal/repositories/mock/fixtures/service.go +++ b/internal/repositories/mock/fixtures/service.go @@ -138,3 +138,33 @@ func WithFailedListRepositories(err error) func(RepoServiceMock) { Return(nil, err).AnyTimes() } } + +func WithSuccessfulListRepositoriesPaginated( + repositories []*models.EntityWithProperties, +) func(RepoServiceMock) { + return func(mock RepoServiceMock) { + mock.EXPECT(). + ListRepositoriesPaginated( + gomock.Any(), + gomock.Any(), + gomock.Any(), + gomock.Any(), + gomock.Any(), + ). + Return(repositories, uuid.Nil, nil).AnyTimes() + } +} + +func WithFailedListRepositoriesPaginated(err error) func(RepoServiceMock) { + return func(mock RepoServiceMock) { + mock.EXPECT(). + ListRepositoriesPaginated( + gomock.Any(), + gomock.Any(), + gomock.Any(), + gomock.Any(), + gomock.Any(), + ). + Return(nil, uuid.Nil, err).AnyTimes() + } +} diff --git a/internal/repositories/mock/service.go b/internal/repositories/mock/service.go index a06c3faa5d..89a4920979 100644 --- a/internal/repositories/mock/service.go +++ b/internal/repositories/mock/service.go @@ -132,3 +132,19 @@ func (mr *MockRepositoryServiceMockRecorder) ListRepositories(ctx, projectID, pr mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRepositories", reflect.TypeOf((*MockRepositoryService)(nil).ListRepositories), ctx, projectID, providerID) } + +// ListRepositoriesPaginated mocks base method. +func (m *MockRepositoryService) ListRepositoriesPaginated(ctx context.Context, projectID, providerID, cursor uuid.UUID, limit int64) ([]*models.EntityWithProperties, uuid.UUID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListRepositoriesPaginated", ctx, projectID, providerID, cursor, limit) + ret0, _ := ret[0].([]*models.EntityWithProperties) + ret1, _ := ret[1].(uuid.UUID) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListRepositoriesPaginated indicates an expected call of ListRepositoriesPaginated. +func (mr *MockRepositoryServiceMockRecorder) ListRepositoriesPaginated(ctx, projectID, providerID, cursor, limit any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRepositoriesPaginated", reflect.TypeOf((*MockRepositoryService)(nil).ListRepositoriesPaginated), ctx, projectID, providerID, cursor, limit) +} diff --git a/internal/repositories/service.go b/internal/repositories/service.go index 1dea8b818a..610dafffd9 100644 --- a/internal/repositories/service.go +++ b/internal/repositories/service.go @@ -70,6 +70,16 @@ type RepositoryService interface { providerID uuid.UUID, ) ([]*models.EntityWithProperties, error) + // ListRepositoriesPaginated retrieves repositories with cursor-based pagination. + // If cursor is empty, returns the first page. limit defaults to 100. + ListRepositoriesPaginated( + ctx context.Context, + projectID uuid.UUID, + providerID uuid.UUID, + cursor uuid.UUID, + limit int64, + ) ([]*models.EntityWithProperties, uuid.UUID, error) + // GetRepositoryById retrieves a repository by its ID and project. GetRepositoryById(ctx context.Context, repositoryID uuid.UUID, projectID uuid.UUID) (*pb.Repository, error) // GetRepositoryByName retrieves a repository by its name, owner, project and provider (if specified). @@ -210,6 +220,95 @@ func (r *repositoryService) ListRepositories( return ents, nil } +func (r *repositoryService) ListRepositoriesPaginated( + ctx context.Context, + projectID uuid.UUID, + providerID uuid.UUID, + cursor uuid.UUID, + limit int64, +) ([]*models.EntityWithProperties, uuid.UUID, error) { + if limit <= 0 { + limit = 100 + } + if limit > 1000 { + limit = 1000 + } + + tx, err := r.store.BeginTransaction() + if err != nil { + return nil, uuid.Nil, fmt.Errorf("error starting transaction: %w", err) + } + + outErr := errors.New("outer error placeholder") + defer func() { + if outErr != nil { + if err := tx.Rollback(); err != nil { + log.Printf("error rolling back transaction: %v", err) + } + } + }() + + qtx := r.store.GetQuerierWithTransaction(tx) + + var repoEnts []db.EntityInstance + if cursor == uuid.Nil { + repoEnts, outErr = qtx.GetEntitiesByType(ctx, db.GetEntitiesByTypeParams{ + EntityType: db.EntitiesRepository, + ProviderID: providerID, + Projects: []uuid.UUID{projectID}, + }) + if outErr != nil { + return nil, uuid.Nil, fmt.Errorf("error fetching repositories: %w", outErr) + } + } else { + repoEnts, outErr = qtx.ListEntitiesAfterID(ctx, db.ListEntitiesAfterIDParams{ + EntityType: db.EntitiesRepository, + ID: cursor, + Limit: limit, + }) + if outErr != nil { + return nil, uuid.Nil, fmt.Errorf("error fetching repositories after cursor: %w", outErr) + } + } + + // Apply limit in memory for the non-cursor case (GetEntitiesByType has no limit) + hasMore := false + if cursor == uuid.Nil && int64(len(repoEnts)) > limit { + repoEnts = repoEnts[:limit] + hasMore = true + } + + ents := make([]*models.EntityWithProperties, 0, len(repoEnts)) + var lastID uuid.UUID + for _, ent := range repoEnts { + ewp, err := r.propSvc.EntityWithPropertiesByID(ctx, ent.ID, + service.CallBuilder().WithStoreOrTransaction(qtx)) + if err != nil { + return nil, uuid.Nil, fmt.Errorf("error fetching properties for repository: %w", err) + } + + if err := r.propSvc.RetrieveAllPropertiesForEntity(ctx, ewp, r.providerManager, + service.ReadBuilder().WithStoreOrTransaction(qtx).TolerateStaleData()); err != nil { + return nil, uuid.Nil, fmt.Errorf("error fetching properties for repository: %w", err) + } + + ents = append(ents, ewp) + lastID = ent.ID + } + + if err := tx.Commit(); err != nil { + return nil, uuid.Nil, fmt.Errorf("error committing transaction: %w", err) + } + outErr = nil + + var nextCursor uuid.UUID + if hasMore || cursor != uuid.Nil { + nextCursor = lastID + } + + return ents, nextCursor, nil +} + func (r *repositoryService) GetRepositoryById( ctx context.Context, repositoryID uuid.UUID, From 6c4d5919175057f8426b410f3c98fcee3d8af606 Mon Sep 17 00:00:00 2001 From: mayanksharmaCSE Date: Thu, 23 Apr 2026 20:20:47 +0530 Subject: [PATCH 2/4] Address PR review on cursor-based pagination. - Use sqlc.arg for ListEntitiesByTypePaginated so generated params are named (Projects, Cursor, PageLimit) and correctly typed. - Fix transaction leak in ListRepositoriesPaginated via named returns so deferred rollback runs on early errors. - Replace stdlib log with zerolog.Ctx for rollback errors. - Extract decodeCursor and hydrateEntityProperties helpers to reduce cyclomatic complexity. - Introduce DefaultListRepositoriesPageLimit constant. Signed-off-by: mayanksharmaCSE --- database/mock/store.go | 15 +++ database/query/entities.sql | 13 ++ .../controlplane/handlers_repositories.go | 16 +-- .../handlers_repositories_test.go | 5 +- internal/db/datasources.sql.go | 2 +- internal/db/db.go | 2 +- internal/db/entities.sql.go | 61 ++++++++- internal/db/entitlements.sql.go | 2 +- internal/db/entity_execution_lock.sql.go | 2 +- internal/db/eval_history.sql.go | 2 +- internal/db/eval_outputs.sql.go | 2 +- internal/db/invitations.sql.go | 2 +- internal/db/models.go | 2 +- internal/db/profile_status.sql.go | 2 +- internal/db/profiles.sql.go | 2 +- internal/db/projects.sql.go | 2 +- internal/db/provider_access_tokens.sql.go | 2 +- .../provider_github_app_installations.sql.go | 2 +- internal/db/providers.sql.go | 2 +- internal/db/querier.go | 6 +- internal/db/rule_instances.sql.go | 2 +- internal/db/rule_types.sql.go | 2 +- internal/db/selectors.sql.go | 2 +- internal/db/session_store.sql.go | 2 +- internal/db/subscriptions.sql.go | 2 +- internal/db/users.sql.go | 2 +- .../repositories/mock/fixtures/service.go | 5 +- internal/repositories/mock/service.go | 4 +- internal/repositories/service.go | 118 ++++++++++-------- 29 files changed, 193 insertions(+), 90 deletions(-) diff --git a/database/mock/store.go b/database/mock/store.go index 4ee5419eb5..a630e15758 100644 --- a/database/mock/store.go +++ b/database/mock/store.go @@ -1913,6 +1913,21 @@ func (mr *MockStoreMockRecorder) ListEntitiesAfterID(ctx, arg any) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEntitiesAfterID", reflect.TypeOf((*MockStore)(nil).ListEntitiesAfterID), ctx, arg) } +// ListEntitiesByTypePaginated mocks base method. +func (m *MockStore) ListEntitiesByTypePaginated(ctx context.Context, arg db.ListEntitiesByTypePaginatedParams) ([]db.EntityInstance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListEntitiesByTypePaginated", ctx, arg) + ret0, _ := ret[0].([]db.EntityInstance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListEntitiesByTypePaginated indicates an expected call of ListEntitiesByTypePaginated. +func (mr *MockStoreMockRecorder) ListEntitiesByTypePaginated(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEntitiesByTypePaginated", reflect.TypeOf((*MockStore)(nil).ListEntitiesByTypePaginated), ctx, arg) +} + // ListEvaluationHistory mocks base method. func (m *MockStore) ListEvaluationHistory(ctx context.Context, arg db.ListEvaluationHistoryParams) ([]db.ListEvaluationHistoryRow, error) { m.ctrl.T.Helper() diff --git a/database/query/entities.sql b/database/query/entities.sql index 771a008251..047c7e7bcc 100644 --- a/database/query/entities.sql +++ b/database/query/entities.sql @@ -80,6 +80,19 @@ WHERE entity_instances.entity_type = $1 ORDER BY entity_instances.id LIMIT sqlc.arg('limit')::bigint; +-- ListEntitiesByTypePaginated retrieves entities of a given type for a project/provider +-- with cursor-based pagination. Pass a null (all-zeros) UUID as cursor for the first page. +-- The query over-fetches one row to determine if there are more results. + +-- name: ListEntitiesByTypePaginated :many +SELECT * FROM entity_instances +WHERE entity_type = sqlc.arg(entity_type) + AND provider_id = sqlc.arg(provider_id) + AND project_id = ANY(sqlc.arg(projects)::uuid[]) + AND id > sqlc.arg(cursor)::uuid +ORDER BY id +LIMIT (sqlc.arg(page_limit)::bigint + 1); + -- EntityExistsAfterID checks if any entity of a given type exists after a cursor ID. -- name: EntityExistsAfterID :one diff --git a/internal/controlplane/handlers_repositories.go b/internal/controlplane/handlers_repositories.go index 448e11c6e0..ba38179218 100644 --- a/internal/controlplane/handlers_repositories.go +++ b/internal/controlplane/handlers_repositories.go @@ -156,14 +156,8 @@ func (s *Server) ListRepositories(ctx context.Context, return nil, status.Errorf(codes.Internal, "cannot get provider: %v", err) } - // Parse cursor from request (empty string means first page) - var cursor uuid.UUID - if in.GetCursor() != "" { - cursor, err = uuid.Parse(in.GetCursor()) - if err != nil { - return nil, util.UserVisibleError(codes.InvalidArgument, "invalid cursor format") - } - } + // Parse cursor from request (base64-encoded UUID) + cursorStr := in.GetCursor() // Use request limit if provided, otherwise default limit := in.GetLimit() @@ -173,7 +167,7 @@ func (s *Server) ListRepositories(ctx context.Context, // Fetch repositories using the paginated service method repoEntities, nextCursor, err := s.repos.ListRepositoriesPaginated( - ctx, projectID, provider.ID, cursor, limit) + ctx, projectID, provider.ID, cursorStr, limit) if err != nil { return nil, err } @@ -210,9 +204,7 @@ func (s *Server) ListRepositories(ctx context.Context, } resp.Results = results - if nextCursor != uuid.Nil { - resp.Cursor = nextCursor.String() - } + resp.Cursor = nextCursor return &resp, nil } diff --git a/internal/controlplane/handlers_repositories_test.go b/internal/controlplane/handlers_repositories_test.go index 2feac499b4..4e2cea9cc3 100644 --- a/internal/controlplane/handlers_repositories_test.go +++ b/internal/controlplane/handlers_repositories_test.go @@ -176,10 +176,11 @@ func TestServer_ListRepositories(t *testing.T) { Name: "List repositories succeeds with multiple results", RepoServiceSetup: rf.NewRepoService( rf.WithSuccessfulListRepositoriesPaginated( - []*models.EntityWithProperties{ + []*models.EntityWithProperties{ simpleDbRepository(repoName, remoteRepoId), simpleDbRepository(repoName2, remoteRepoId2), }, + "", ), ), ProviderSetup: func(ctrl *gomock.Controller, mgr *mockmanager.MockProviderManager) { @@ -248,7 +249,7 @@ func TestServer_ListRepositories(t *testing.T) { { Name: "List repositories succeeds with empty results", RepoServiceSetup: rf.NewRepoService( - rf.WithSuccessfulListRepositoriesPaginated(nil), + rf.WithSuccessfulListRepositoriesPaginated(nil, ""), ), ExpectedResults: nil, }, diff --git a/internal/db/datasources.sql.go b/internal/db/datasources.sql.go index d84007ee6e..c1222c8931 100644 --- a/internal/db/datasources.sql.go +++ b/internal/db/datasources.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: datasources.sql package db diff --git a/internal/db/db.go b/internal/db/db.go index cd5bbb8e08..f43598b1eb 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 package db diff --git a/internal/db/entities.sql.go b/internal/db/entities.sql.go index fe75ce30cf..24bd23c042 100644 --- a/internal/db/entities.sql.go +++ b/internal/db/entities.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: entities.sql package db @@ -590,6 +590,65 @@ func (q *Queries) ListEntitiesAfterID(ctx context.Context, arg ListEntitiesAfter return items, nil } +const listEntitiesByTypePaginated = `-- name: ListEntitiesByTypePaginated :many + +SELECT id, entity_type, name, project_id, provider_id, created_at, originated_from FROM entity_instances +WHERE entity_type = $1 + AND provider_id = $2 + AND project_id = ANY($3::uuid[]) + AND id > $4::uuid +ORDER BY id +LIMIT ($5::bigint + 1) +` + +type ListEntitiesByTypePaginatedParams struct { + EntityType Entities `json:"entity_type"` + ProviderID uuid.UUID `json:"provider_id"` + Projects []uuid.UUID `json:"projects"` + Cursor uuid.UUID `json:"cursor"` + PageLimit int64 `json:"page_limit"` +} + +// ListEntitiesByTypePaginated retrieves entities of a given type for a project/provider +// with cursor-based pagination. Pass a null (all-zeros) UUID as cursor for the first page. +// The query over-fetches one row to determine if there are more results. +func (q *Queries) ListEntitiesByTypePaginated(ctx context.Context, arg ListEntitiesByTypePaginatedParams) ([]EntityInstance, error) { + rows, err := q.db.QueryContext(ctx, listEntitiesByTypePaginated, + arg.EntityType, + arg.ProviderID, + pq.Array(arg.Projects), + arg.Cursor, + arg.PageLimit, + ) + if err != nil { + return nil, err + } + defer rows.Close() + items := []EntityInstance{} + for rows.Next() { + var i EntityInstance + if err := rows.Scan( + &i.ID, + &i.EntityType, + &i.Name, + &i.ProjectID, + &i.ProviderID, + &i.CreatedAt, + &i.OriginatedFrom, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const upsertProperty = `-- name: UpsertProperty :one INSERT INTO properties ( entity_id, diff --git a/internal/db/entitlements.sql.go b/internal/db/entitlements.sql.go index 0f496ca433..29c245d475 100644 --- a/internal/db/entitlements.sql.go +++ b/internal/db/entitlements.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: entitlements.sql package db diff --git a/internal/db/entity_execution_lock.sql.go b/internal/db/entity_execution_lock.sql.go index 5d4c2e71bc..b1ec440f46 100644 --- a/internal/db/entity_execution_lock.sql.go +++ b/internal/db/entity_execution_lock.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: entity_execution_lock.sql package db diff --git a/internal/db/eval_history.sql.go b/internal/db/eval_history.sql.go index 687eb4ef8c..be8ab07338 100644 --- a/internal/db/eval_history.sql.go +++ b/internal/db/eval_history.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: eval_history.sql package db diff --git a/internal/db/eval_outputs.sql.go b/internal/db/eval_outputs.sql.go index 48fa6c1229..2490d29823 100644 --- a/internal/db/eval_outputs.sql.go +++ b/internal/db/eval_outputs.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: eval_outputs.sql package db diff --git a/internal/db/invitations.sql.go b/internal/db/invitations.sql.go index 1e902b77b8..dd79bf612a 100644 --- a/internal/db/invitations.sql.go +++ b/internal/db/invitations.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: invitations.sql package db diff --git a/internal/db/models.go b/internal/db/models.go index 1a37982421..013bfe2ea2 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 package db diff --git a/internal/db/profile_status.sql.go b/internal/db/profile_status.sql.go index ce5368dfcc..7000addc50 100644 --- a/internal/db/profile_status.sql.go +++ b/internal/db/profile_status.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: profile_status.sql package db diff --git a/internal/db/profiles.sql.go b/internal/db/profiles.sql.go index 4b94c08418..6b71576d16 100644 --- a/internal/db/profiles.sql.go +++ b/internal/db/profiles.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: profiles.sql package db diff --git a/internal/db/projects.sql.go b/internal/db/projects.sql.go index 8610626307..ce72245f23 100644 --- a/internal/db/projects.sql.go +++ b/internal/db/projects.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: projects.sql package db diff --git a/internal/db/provider_access_tokens.sql.go b/internal/db/provider_access_tokens.sql.go index b38ddf4512..b05c3871f8 100644 --- a/internal/db/provider_access_tokens.sql.go +++ b/internal/db/provider_access_tokens.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: provider_access_tokens.sql package db diff --git a/internal/db/provider_github_app_installations.sql.go b/internal/db/provider_github_app_installations.sql.go index 17d3cacfc0..f0b3a8bef4 100644 --- a/internal/db/provider_github_app_installations.sql.go +++ b/internal/db/provider_github_app_installations.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: provider_github_app_installations.sql package db diff --git a/internal/db/providers.sql.go b/internal/db/providers.sql.go index 774f0b6543..2a350f2f67 100644 --- a/internal/db/providers.sql.go +++ b/internal/db/providers.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: providers.sql package db diff --git a/internal/db/querier.go b/internal/db/querier.go index 5c6286796f..081e67e6f2 100644 --- a/internal/db/querier.go +++ b/internal/db/querier.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 package db @@ -207,6 +207,10 @@ type Querier interface { // ListEntitiesAfterID retrieves entities of a given type after a cursor ID, for pagination. // This is used for cursor-based iteration over all entities (e.g., in the reminder service). ListEntitiesAfterID(ctx context.Context, arg ListEntitiesAfterIDParams) ([]EntityInstance, error) + // ListEntitiesByTypePaginated retrieves entities of a given type for a project/provider + // with cursor-based pagination. Pass a null (all-zeros) UUID as cursor for the first page. + // The query over-fetches one row to determine if there are more results. + ListEntitiesByTypePaginated(ctx context.Context, arg ListEntitiesByTypePaginatedParams) ([]EntityInstance, error) ListEvaluationHistory(ctx context.Context, arg ListEvaluationHistoryParams) ([]ListEvaluationHistoryRow, error) ListEvaluationHistoryStaleRecords(ctx context.Context, arg ListEvaluationHistoryStaleRecordsParams) ([]ListEvaluationHistoryStaleRecordsRow, error) ListFlushCache(ctx context.Context) ([]FlushCache, error) diff --git a/internal/db/rule_instances.sql.go b/internal/db/rule_instances.sql.go index 9b25f25d97..61d6bed28e 100644 --- a/internal/db/rule_instances.sql.go +++ b/internal/db/rule_instances.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: rule_instances.sql package db diff --git a/internal/db/rule_types.sql.go b/internal/db/rule_types.sql.go index d6013b8de6..13015b62e1 100644 --- a/internal/db/rule_types.sql.go +++ b/internal/db/rule_types.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: rule_types.sql package db diff --git a/internal/db/selectors.sql.go b/internal/db/selectors.sql.go index dcc06e516d..9bf2716035 100644 --- a/internal/db/selectors.sql.go +++ b/internal/db/selectors.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: selectors.sql package db diff --git a/internal/db/session_store.sql.go b/internal/db/session_store.sql.go index d4fdaccf11..864ef00087 100644 --- a/internal/db/session_store.sql.go +++ b/internal/db/session_store.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: session_store.sql package db diff --git a/internal/db/subscriptions.sql.go b/internal/db/subscriptions.sql.go index c55d81eaba..7d1c184e03 100644 --- a/internal/db/subscriptions.sql.go +++ b/internal/db/subscriptions.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: subscriptions.sql package db diff --git a/internal/db/users.sql.go b/internal/db/users.sql.go index 1b9ec798dd..d4eed24e8e 100644 --- a/internal/db/users.sql.go +++ b/internal/db/users.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.1 // source: users.sql package db diff --git a/internal/repositories/mock/fixtures/service.go b/internal/repositories/mock/fixtures/service.go index 134eaa8231..891b67d5e8 100644 --- a/internal/repositories/mock/fixtures/service.go +++ b/internal/repositories/mock/fixtures/service.go @@ -141,6 +141,7 @@ func WithFailedListRepositories(err error) func(RepoServiceMock) { func WithSuccessfulListRepositoriesPaginated( repositories []*models.EntityWithProperties, + nextCursor string, ) func(RepoServiceMock) { return func(mock RepoServiceMock) { mock.EXPECT(). @@ -151,7 +152,7 @@ func WithSuccessfulListRepositoriesPaginated( gomock.Any(), gomock.Any(), ). - Return(repositories, uuid.Nil, nil).AnyTimes() + Return(repositories, nextCursor, nil).AnyTimes() } } @@ -165,6 +166,6 @@ func WithFailedListRepositoriesPaginated(err error) func(RepoServiceMock) { gomock.Any(), gomock.Any(), ). - Return(nil, uuid.Nil, err).AnyTimes() + Return(nil, "", err).AnyTimes() } } diff --git a/internal/repositories/mock/service.go b/internal/repositories/mock/service.go index 89a4920979..f4f064fa9a 100644 --- a/internal/repositories/mock/service.go +++ b/internal/repositories/mock/service.go @@ -134,11 +134,11 @@ func (mr *MockRepositoryServiceMockRecorder) ListRepositories(ctx, projectID, pr } // ListRepositoriesPaginated mocks base method. -func (m *MockRepositoryService) ListRepositoriesPaginated(ctx context.Context, projectID, providerID, cursor uuid.UUID, limit int64) ([]*models.EntityWithProperties, uuid.UUID, error) { +func (m *MockRepositoryService) ListRepositoriesPaginated(ctx context.Context, projectID, providerID uuid.UUID, cursor string, limit int64) ([]*models.EntityWithProperties, string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListRepositoriesPaginated", ctx, projectID, providerID, cursor, limit) ret0, _ := ret[0].([]*models.EntityWithProperties) - ret1, _ := ret[1].(uuid.UUID) + ret1, _ := ret[1].(string) ret2, _ := ret[2].(error) return ret0, ret1, ret2 } diff --git a/internal/repositories/service.go b/internal/repositories/service.go index 610dafffd9..8b61039444 100644 --- a/internal/repositories/service.go +++ b/internal/repositories/service.go @@ -7,6 +7,7 @@ package repositories import ( "context" "database/sql" + "encoding/base64" "errors" "fmt" @@ -76,9 +77,9 @@ type RepositoryService interface { ctx context.Context, projectID uuid.UUID, providerID uuid.UUID, - cursor uuid.UUID, + cursor string, limit int64, - ) ([]*models.EntityWithProperties, uuid.UUID, error) + ) ([]*models.EntityWithProperties, string, error) // GetRepositoryById retrieves a repository by its ID and project. GetRepositoryById(ctx context.Context, repositoryID uuid.UUID, projectID uuid.UUID) (*pb.Repository, error) @@ -220,95 +221,112 @@ func (r *repositoryService) ListRepositories( return ents, nil } +// DefaultListRepositoriesPageLimit is the default (and maximum) page size for +// ListRepositoriesPaginated when the caller does not request a specific value +// or requests one above the cap. +const DefaultListRepositoriesPageLimit = 100 + func (r *repositoryService) ListRepositoriesPaginated( ctx context.Context, projectID uuid.UUID, providerID uuid.UUID, - cursor uuid.UUID, + cursorStr string, limit int64, -) ([]*models.EntityWithProperties, uuid.UUID, error) { - if limit <= 0 { - limit = 100 +) (ents []*models.EntityWithProperties, nextCursor string, outErr error) { + if limit <= 0 || limit > DefaultListRepositoriesPageLimit { + limit = DefaultListRepositoriesPageLimit } - if limit > 1000 { - limit = 1000 + + cursor, err := decodeCursor(cursorStr) + if err != nil { + return nil, "", err } tx, err := r.store.BeginTransaction() if err != nil { - return nil, uuid.Nil, fmt.Errorf("error starting transaction: %w", err) + return nil, "", fmt.Errorf("error starting transaction: %w", err) } - outErr := errors.New("outer error placeholder") defer func() { if outErr != nil { - if err := tx.Rollback(); err != nil { - log.Printf("error rolling back transaction: %v", err) + if rbErr := tx.Rollback(); rbErr != nil && !errors.Is(rbErr, sql.ErrTxDone) { + zerolog.Ctx(ctx).Error().Err(rbErr).Msg("error rolling back transaction") } } }() qtx := r.store.GetQuerierWithTransaction(tx) - var repoEnts []db.EntityInstance - if cursor == uuid.Nil { - repoEnts, outErr = qtx.GetEntitiesByType(ctx, db.GetEntitiesByTypeParams{ - EntityType: db.EntitiesRepository, - ProviderID: providerID, - Projects: []uuid.UUID{projectID}, - }) - if outErr != nil { - return nil, uuid.Nil, fmt.Errorf("error fetching repositories: %w", outErr) - } - } else { - repoEnts, outErr = qtx.ListEntitiesAfterID(ctx, db.ListEntitiesAfterIDParams{ - EntityType: db.EntitiesRepository, - ID: cursor, - Limit: limit, - }) - if outErr != nil { - return nil, uuid.Nil, fmt.Errorf("error fetching repositories after cursor: %w", outErr) - } + repoEnts, err := qtx.ListEntitiesByTypePaginated(ctx, db.ListEntitiesByTypePaginatedParams{ + EntityType: db.EntitiesRepository, + ProviderID: providerID, + Projects: []uuid.UUID{projectID}, + Cursor: cursor, + PageLimit: limit, + }) + if err != nil { + return nil, "", fmt.Errorf("error fetching repositories: %w", err) } - // Apply limit in memory for the non-cursor case (GetEntitiesByType has no limit) - hasMore := false - if cursor == uuid.Nil && int64(len(repoEnts)) > limit { + hasMore := int64(len(repoEnts)) > limit + if hasMore { repoEnts = repoEnts[:limit] - hasMore = true } - ents := make([]*models.EntityWithProperties, 0, len(repoEnts)) + ents = make([]*models.EntityWithProperties, 0, len(repoEnts)) var lastID uuid.UUID for _, ent := range repoEnts { - ewp, err := r.propSvc.EntityWithPropertiesByID(ctx, ent.ID, - service.CallBuilder().WithStoreOrTransaction(qtx)) + ewp, err := r.hydrateEntityProperties(ctx, qtx, ent.ID) if err != nil { - return nil, uuid.Nil, fmt.Errorf("error fetching properties for repository: %w", err) + return nil, "", err } - - if err := r.propSvc.RetrieveAllPropertiesForEntity(ctx, ewp, r.providerManager, - service.ReadBuilder().WithStoreOrTransaction(qtx).TolerateStaleData()); err != nil { - return nil, uuid.Nil, fmt.Errorf("error fetching properties for repository: %w", err) - } - ents = append(ents, ewp) lastID = ent.ID } if err := tx.Commit(); err != nil { - return nil, uuid.Nil, fmt.Errorf("error committing transaction: %w", err) + return nil, "", fmt.Errorf("error committing transaction: %w", err) } - outErr = nil - var nextCursor uuid.UUID - if hasMore || cursor != uuid.Nil { - nextCursor = lastID + if hasMore && lastID != uuid.Nil { + nextCursor = base64.StdEncoding.EncodeToString(lastID[:]) } return ents, nextCursor, nil } +func (r *repositoryService) hydrateEntityProperties( + ctx context.Context, + qtx db.ExtendQuerier, + entityID uuid.UUID, +) (*models.EntityWithProperties, error) { + ewp, err := r.propSvc.EntityWithPropertiesByID(ctx, entityID, + service.CallBuilder().WithStoreOrTransaction(qtx)) + if err != nil { + return nil, fmt.Errorf("error fetching properties for repository: %w", err) + } + if err := r.propSvc.RetrieveAllPropertiesForEntity(ctx, ewp, r.providerManager, + service.ReadBuilder().WithStoreOrTransaction(qtx).TolerateStaleData()); err != nil { + return nil, fmt.Errorf("error fetching properties for repository: %w", err) + } + return ewp, nil +} + +func decodeCursor(cursorStr string) (uuid.UUID, error) { + if cursorStr == "" { + return uuid.Nil, nil + } + cursorBytes, err := base64.StdEncoding.DecodeString(cursorStr) + if err != nil { + return uuid.Nil, fmt.Errorf("invalid cursor format: %w", err) + } + cursor, err := uuid.FromBytes(cursorBytes) + if err != nil { + return uuid.Nil, fmt.Errorf("invalid cursor format: %w", err) + } + return cursor, nil +} + func (r *repositoryService) GetRepositoryById( ctx context.Context, repositoryID uuid.UUID, From 81e80be0d03621d1807c993d30db8bc9f69d69c8 Mon Sep 17 00:00:00 2001 From: mayanksharmaCSE Date: Fri, 24 Apr 2026 01:51:19 +0530 Subject: [PATCH 3/4] Address PR review on cursor-based pagination. - Use sqlc.arg for ListEntitiesByTypePaginated so generated params are named (Projects, Cursor, PageLimit) and correctly typed. - Fix transaction leak in ListRepositoriesPaginated via named returns so deferred rollback runs on early errors. - Replace stdlib log with zerolog.Ctx for rollback errors. - Extract decodeCursor and hydrateEntityProperties helpers to reduce cyclomatic complexity. - Introduce DefaultListRepositoriesPageLimit constant. --- internal/db/db.go | 2 +- internal/db/entities.sql.go | 2 +- internal/db/models.go | 2 +- internal/db/querier.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/db/db.go b/internal/db/db.go index f43598b1eb..cd5bbb8e08 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 package db diff --git a/internal/db/entities.sql.go b/internal/db/entities.sql.go index 24bd23c042..19c688358a 100644 --- a/internal/db/entities.sql.go +++ b/internal/db/entities.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: entities.sql package db diff --git a/internal/db/models.go b/internal/db/models.go index 013bfe2ea2..1a37982421 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 package db diff --git a/internal/db/querier.go b/internal/db/querier.go index 081e67e6f2..acdd46d2f9 100644 --- a/internal/db/querier.go +++ b/internal/db/querier.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 package db From a9ab09b2971a0a1398a7beac2b16b005fdef282c Mon Sep 17 00:00:00 2001 From: mayanksharmaCSE Date: Sat, 16 May 2026 01:02:05 +0530 Subject: [PATCH 4/4] Regenerate db code with sqlc v1.30.0 to match project version Signed-off-by: mayanksharmaCSE --- internal/db/datasources.sql.go | 2 +- internal/db/entitlements.sql.go | 2 +- internal/db/entity_execution_lock.sql.go | 2 +- internal/db/eval_history.sql.go | 2 +- internal/db/eval_outputs.sql.go | 2 +- internal/db/invitations.sql.go | 2 +- internal/db/profile_status.sql.go | 2 +- internal/db/profiles.sql.go | 2 +- internal/db/projects.sql.go | 2 +- internal/db/provider_access_tokens.sql.go | 2 +- internal/db/provider_github_app_installations.sql.go | 2 +- internal/db/providers.sql.go | 2 +- internal/db/rule_instances.sql.go | 2 +- internal/db/rule_types.sql.go | 2 +- internal/db/selectors.sql.go | 2 +- internal/db/session_store.sql.go | 2 +- internal/db/subscriptions.sql.go | 2 +- internal/db/users.sql.go | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/internal/db/datasources.sql.go b/internal/db/datasources.sql.go index c1222c8931..d84007ee6e 100644 --- a/internal/db/datasources.sql.go +++ b/internal/db/datasources.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: datasources.sql package db diff --git a/internal/db/entitlements.sql.go b/internal/db/entitlements.sql.go index 29c245d475..0f496ca433 100644 --- a/internal/db/entitlements.sql.go +++ b/internal/db/entitlements.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: entitlements.sql package db diff --git a/internal/db/entity_execution_lock.sql.go b/internal/db/entity_execution_lock.sql.go index b1ec440f46..5d4c2e71bc 100644 --- a/internal/db/entity_execution_lock.sql.go +++ b/internal/db/entity_execution_lock.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: entity_execution_lock.sql package db diff --git a/internal/db/eval_history.sql.go b/internal/db/eval_history.sql.go index be8ab07338..687eb4ef8c 100644 --- a/internal/db/eval_history.sql.go +++ b/internal/db/eval_history.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: eval_history.sql package db diff --git a/internal/db/eval_outputs.sql.go b/internal/db/eval_outputs.sql.go index 2490d29823..48fa6c1229 100644 --- a/internal/db/eval_outputs.sql.go +++ b/internal/db/eval_outputs.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: eval_outputs.sql package db diff --git a/internal/db/invitations.sql.go b/internal/db/invitations.sql.go index dd79bf612a..1e902b77b8 100644 --- a/internal/db/invitations.sql.go +++ b/internal/db/invitations.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: invitations.sql package db diff --git a/internal/db/profile_status.sql.go b/internal/db/profile_status.sql.go index 7000addc50..ce5368dfcc 100644 --- a/internal/db/profile_status.sql.go +++ b/internal/db/profile_status.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: profile_status.sql package db diff --git a/internal/db/profiles.sql.go b/internal/db/profiles.sql.go index 6b71576d16..4b94c08418 100644 --- a/internal/db/profiles.sql.go +++ b/internal/db/profiles.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: profiles.sql package db diff --git a/internal/db/projects.sql.go b/internal/db/projects.sql.go index ce72245f23..8610626307 100644 --- a/internal/db/projects.sql.go +++ b/internal/db/projects.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: projects.sql package db diff --git a/internal/db/provider_access_tokens.sql.go b/internal/db/provider_access_tokens.sql.go index b05c3871f8..b38ddf4512 100644 --- a/internal/db/provider_access_tokens.sql.go +++ b/internal/db/provider_access_tokens.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: provider_access_tokens.sql package db diff --git a/internal/db/provider_github_app_installations.sql.go b/internal/db/provider_github_app_installations.sql.go index f0b3a8bef4..17d3cacfc0 100644 --- a/internal/db/provider_github_app_installations.sql.go +++ b/internal/db/provider_github_app_installations.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: provider_github_app_installations.sql package db diff --git a/internal/db/providers.sql.go b/internal/db/providers.sql.go index 2a350f2f67..774f0b6543 100644 --- a/internal/db/providers.sql.go +++ b/internal/db/providers.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: providers.sql package db diff --git a/internal/db/rule_instances.sql.go b/internal/db/rule_instances.sql.go index 61d6bed28e..9b25f25d97 100644 --- a/internal/db/rule_instances.sql.go +++ b/internal/db/rule_instances.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: rule_instances.sql package db diff --git a/internal/db/rule_types.sql.go b/internal/db/rule_types.sql.go index 13015b62e1..d6013b8de6 100644 --- a/internal/db/rule_types.sql.go +++ b/internal/db/rule_types.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: rule_types.sql package db diff --git a/internal/db/selectors.sql.go b/internal/db/selectors.sql.go index 9bf2716035..dcc06e516d 100644 --- a/internal/db/selectors.sql.go +++ b/internal/db/selectors.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: selectors.sql package db diff --git a/internal/db/session_store.sql.go b/internal/db/session_store.sql.go index 864ef00087..d4fdaccf11 100644 --- a/internal/db/session_store.sql.go +++ b/internal/db/session_store.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: session_store.sql package db diff --git a/internal/db/subscriptions.sql.go b/internal/db/subscriptions.sql.go index 7d1c184e03..c55d81eaba 100644 --- a/internal/db/subscriptions.sql.go +++ b/internal/db/subscriptions.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: subscriptions.sql package db diff --git a/internal/db/users.sql.go b/internal/db/users.sql.go index d4eed24e8e..1b9ec798dd 100644 --- a/internal/db/users.sql.go +++ b/internal/db/users.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.31.1 +// sqlc v1.30.0 // source: users.sql package db