diff --git a/app/api/controller/space/list_gitspaces.go b/app/api/controller/space/list_gitspaces.go index 6891d10f2..3890420cc 100644 --- a/app/api/controller/space/list_gitspaces.go +++ b/app/api/controller/space/list_gitspaces.go @@ -29,14 +29,14 @@ func (c *Controller) ListGitspaces( session *auth.Session, spaceRef string, filter types.GitspaceFilter, -) ([]*types.GitspaceConfig, int64, error) { +) ([]*types.GitspaceConfig, int64, int64, error) { space, err := c.spaceStore.FindByRef(ctx, spaceRef) if err != nil { - return nil, 0, fmt.Errorf("failed to find space: %w", err) + return nil, 0, 0, fmt.Errorf("failed to find space: %w", err) } err = apiauth.CheckGitspace(ctx, c.authorizer, session, space.Path, "", enum.PermissionGitspaceView) if err != nil { - return nil, 0, fmt.Errorf("failed to authorize gitspace: %w", err) + return nil, 0, 0, fmt.Errorf("failed to authorize gitspace: %w", err) } filter.UserIdentifier = session.Principal.UID diff --git a/app/api/handler/space/list_gitspaces.go b/app/api/handler/space/list_gitspaces.go index 5d1376eff..cb01fcfac 100644 --- a/app/api/handler/space/list_gitspaces.go +++ b/app/api/handler/space/list_gitspaces.go @@ -16,12 +16,15 @@ package space import ( "net/http" + "strconv" "github.com/harness/gitness/app/api/controller/space" "github.com/harness/gitness/app/api/render" "github.com/harness/gitness/app/api/request" ) +const HeaderTotalWithoutFilter = "x-total-no-filter" + func HandleListGitspaces(spacesCtrl *space.Controller) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -32,12 +35,13 @@ func HandleListGitspaces(spacesCtrl *space.Controller) http.HandlerFunc { return } filter := request.ParseGitspaceFilter(r) - repos, totalCount, err := spacesCtrl.ListGitspaces(ctx, session, spaceRef, filter) + repos, filterCount, totalCount, err := spacesCtrl.ListGitspaces(ctx, session, spaceRef, filter) if err != nil { render.TranslatedUserError(ctx, w, err) return } - render.Pagination(r, w, filter.QueryFilter.Page, filter.QueryFilter.Size, int(totalCount)) + w.Header().Set(HeaderTotalWithoutFilter, strconv.FormatInt(totalCount, 10)) + render.Pagination(r, w, filter.QueryFilter.Page, filter.QueryFilter.Size, int(filterCount)) render.JSON(w, http.StatusOK, repos) } } diff --git a/app/gitspace/orchestrator/container/devcontainer_config_utils.go b/app/gitspace/orchestrator/container/devcontainer_config_utils.go index 01b8c7959..32b9dd678 100644 --- a/app/gitspace/orchestrator/container/devcontainer_config_utils.go +++ b/app/gitspace/orchestrator/container/devcontainer_config_utils.go @@ -201,7 +201,7 @@ func ExtractIDECustomizations( var args = make(map[string]interface{}) if ideService.Type() == enum.IDETypeVSCodeWeb || ideService.Type() == enum.IDETypeVSCode { if devcontainerConfig.Customizations.ExtractVSCodeSpec() != nil { - args[gitspaceTypes.VSCodeCustomization] = *devcontainerConfig.Customizations.ExtractVSCodeSpec() + args[gitspaceTypes.VSCodeCustomizationArg] = *devcontainerConfig.Customizations.ExtractVSCodeSpec() } } return args diff --git a/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go b/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go index 21d18ff71..f032b3c00 100644 --- a/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go +++ b/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go @@ -573,7 +573,7 @@ func (e *EmbeddedDockerOrchestrator) buildSetupSteps( ) error { // Run IDE setup args := ExtractIDECustomizations(ideService, resolvedRepoDetails.DevcontainerConfig) - args[gitspaceTypes.IDERepoName] = resolvedRepoDetails.RepoName + args[gitspaceTypes.IDERepoNameArg] = resolvedRepoDetails.RepoName return SetupIDE(ctx, exec, ideService, args, gitspaceLogger) }, StopOnFailure: true, diff --git a/app/gitspace/orchestrator/ide/vscode.go b/app/gitspace/orchestrator/ide/vscode.go index 0a443f52f..5f3a985d1 100644 --- a/app/gitspace/orchestrator/ide/vscode.go +++ b/app/gitspace/orchestrator/ide/vscode.go @@ -143,7 +143,7 @@ func (v *VSCode) handleVSCodeCustomization( gitspaceLogger gitspaceTypes.GitspaceLogger, payload *template.SetupSSHServerPayload, ) error { - customization, exists := args[gitspaceTypes.VSCodeCustomization] + customization, exists := args[gitspaceTypes.VSCodeCustomizationArg] if !exists { return nil // No customization found, nothing to do } @@ -172,7 +172,7 @@ func (v *VSCode) handleRepoName( args map[string]interface{}, payload *template.SetupSSHServerPayload, ) error { - repoName, exists := args[gitspaceTypes.IDERepoName] + repoName, exists := args[gitspaceTypes.IDERepoNameArg] if !exists { return nil // No repo name found, nothing to do } diff --git a/app/gitspace/orchestrator/ide/vscodeweb.go b/app/gitspace/orchestrator/ide/vscodeweb.go index ec349f442..6d6dc23fb 100644 --- a/app/gitspace/orchestrator/ide/vscodeweb.go +++ b/app/gitspace/orchestrator/ide/vscodeweb.go @@ -168,11 +168,11 @@ func updateRunPayloadFromArgs( payload *template.RunVSCodeWebPayload, _ gitspaceTypes.GitspaceLogger, ) error { - if proxyURI, exists := args[gitspaceTypes.VSCodeProxyURI]; exists { + if proxyURI, exists := args[gitspaceTypes.VSCodeProxyURIArg]; exists { // Perform a type assertion to ensure proxyURI is a string proxyURIStr, ok := proxyURI.(string) if !ok { - return fmt.Errorf("%s is not a string", gitspaceTypes.VSCodeProxyURI) + return fmt.Errorf("%s is not a string", gitspaceTypes.VSCodeProxyURIArg) } payload.ProxyURI = proxyURIStr } @@ -184,7 +184,7 @@ func updateSetupPayloadFromArgs( payload *template.SetupVSCodeWebPayload, gitspaceLogger gitspaceTypes.GitspaceLogger, ) error { - if customization, exists := args[gitspaceTypes.VSCodeCustomization]; exists { + if customization, exists := args[gitspaceTypes.VSCodeCustomizationArg]; exists { // Perform a type assertion to ensure customization is a VSCodeCustomizationSpecs vsCodeCustomizationSpecs, ok := customization.(types.VSCodeCustomizationSpecs) if !ok { diff --git a/app/gitspace/types/types.go b/app/gitspace/types/types.go index 3354eb9c2..4276160e1 100644 --- a/app/gitspace/types/types.go +++ b/app/gitspace/types/types.go @@ -23,9 +23,9 @@ import ( "github.com/rs/zerolog" ) -const VSCodeCustomization = "vscode_customization" -const VSCodeProxyURI = "VSCODE_PROXY_URI" -const IDERepoName = "IDE_REPO_NAME" +const VSCodeCustomizationArg = "vscode_customization" +const VSCodeProxyURIArg = "VSCODE_PROXY_URI" +const IDERepoNameArg = "IDE_REPO_NAME" type GitspaceLogger interface { Info(msg string) diff --git a/app/services/gitspace/gitspace.go b/app/services/gitspace/gitspace.go index 89a87e692..058ef8a94 100644 --- a/app/services/gitspace/gitspace.go +++ b/app/services/gitspace/gitspace.go @@ -72,24 +72,36 @@ func (c *Service) ListGitspacesForSpace( ctx context.Context, space *types.Space, filter types.GitspaceFilter, -) ([]*types.GitspaceConfig, int64, error) { +) ([]*types.GitspaceConfig, int64, int64, error) { var gitspaceConfigs []*types.GitspaceConfig - var count int64 + var filterCount, allGitspacesInSpaceCount int64 err := c.tx.WithTx(ctx, func(ctx context.Context) (err error) { gitspaceConfigs, err = c.gitspaceConfigStore.ListWithLatestInstance(ctx, &filter) if err != nil { return fmt.Errorf("failed to list gitspace configs: %w", err) } - count, err = c.gitspaceConfigStore.Count(ctx, &filter) + filterCount, err = c.gitspaceConfigStore.Count(ctx, &filter) if err != nil { - return fmt.Errorf("failed to count gitspaces in space: %w", err) + return fmt.Errorf("failed to filterCount gitspaces in space: %w", err) + } + // Only filter from RBAC and Space is applied for this count, the user filter will be empty for admin users. + allGitspacesInSpaceCount, err = c.gitspaceConfigStore.Count(ctx, &types.GitspaceFilter{ + Deleted: filter.Deleted, + MarkedForDeletion: filter.MarkedForDeletion, + GitspaceInstanceFilter: types.GitspaceInstanceFilter{ + UserIdentifier: filter.UserIdentifier, + SpaceIDs: filter.SpaceIDs, + }, + }) + if err != nil { + return fmt.Errorf("failed to count all gitspace configs in space: %w", err) } return nil }, dbtx.TxDefaultReadOnly) if err != nil { - return nil, 0, err + return nil, 0, 0, err } for _, gitspaceConfig := range gitspaceConfigs { @@ -101,7 +113,7 @@ func (c *Service) ListGitspacesForSpace( gitspaceConfig.BranchURL = c.GetBranchURL(ctx, gitspaceConfig) } - return gitspaceConfigs, count, nil + return gitspaceConfigs, filterCount, allGitspacesInSpaceCount, nil } func (c *Service) GetBranchURL(ctx context.Context, config *types.GitspaceConfig) string {