feat: [CDE-522]: send total gitspaces without applying user filters in header (#3089)

* feat: [CDE-522]: formatting
* feat: [CDE-522]: formatting
* feat: [CDE-522]: send total gitspaces without applying user filters in header
* feat: [CDE-522]: send total gitspaces without applying filter in header
pull/3597/head
Ansuman Satapathy 2024-12-02 07:03:22 +00:00 committed by Harness
parent 08d9d959cc
commit c65f994af9
8 changed files with 37 additions and 21 deletions

View File

@ -29,14 +29,14 @@ func (c *Controller) ListGitspaces(
session *auth.Session, session *auth.Session,
spaceRef string, spaceRef string,
filter types.GitspaceFilter, filter types.GitspaceFilter,
) ([]*types.GitspaceConfig, int64, error) { ) ([]*types.GitspaceConfig, int64, int64, error) {
space, err := c.spaceStore.FindByRef(ctx, spaceRef) space, err := c.spaceStore.FindByRef(ctx, spaceRef)
if err != nil { 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) err = apiauth.CheckGitspace(ctx, c.authorizer, session, space.Path, "", enum.PermissionGitspaceView)
if err != nil { 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 filter.UserIdentifier = session.Principal.UID

View File

@ -16,12 +16,15 @@ package space
import ( import (
"net/http" "net/http"
"strconv"
"github.com/harness/gitness/app/api/controller/space" "github.com/harness/gitness/app/api/controller/space"
"github.com/harness/gitness/app/api/render" "github.com/harness/gitness/app/api/render"
"github.com/harness/gitness/app/api/request" "github.com/harness/gitness/app/api/request"
) )
const HeaderTotalWithoutFilter = "x-total-no-filter"
func HandleListGitspaces(spacesCtrl *space.Controller) http.HandlerFunc { func HandleListGitspaces(spacesCtrl *space.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
@ -32,12 +35,13 @@ func HandleListGitspaces(spacesCtrl *space.Controller) http.HandlerFunc {
return return
} }
filter := request.ParseGitspaceFilter(r) 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 { if err != nil {
render.TranslatedUserError(ctx, w, err) render.TranslatedUserError(ctx, w, err)
return 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) render.JSON(w, http.StatusOK, repos)
} }
} }

View File

@ -201,7 +201,7 @@ func ExtractIDECustomizations(
var args = make(map[string]interface{}) var args = make(map[string]interface{})
if ideService.Type() == enum.IDETypeVSCodeWeb || ideService.Type() == enum.IDETypeVSCode { if ideService.Type() == enum.IDETypeVSCodeWeb || ideService.Type() == enum.IDETypeVSCode {
if devcontainerConfig.Customizations.ExtractVSCodeSpec() != nil { if devcontainerConfig.Customizations.ExtractVSCodeSpec() != nil {
args[gitspaceTypes.VSCodeCustomization] = *devcontainerConfig.Customizations.ExtractVSCodeSpec() args[gitspaceTypes.VSCodeCustomizationArg] = *devcontainerConfig.Customizations.ExtractVSCodeSpec()
} }
} }
return args return args

View File

@ -573,7 +573,7 @@ func (e *EmbeddedDockerOrchestrator) buildSetupSteps(
) error { ) error {
// Run IDE setup // Run IDE setup
args := ExtractIDECustomizations(ideService, resolvedRepoDetails.DevcontainerConfig) args := ExtractIDECustomizations(ideService, resolvedRepoDetails.DevcontainerConfig)
args[gitspaceTypes.IDERepoName] = resolvedRepoDetails.RepoName args[gitspaceTypes.IDERepoNameArg] = resolvedRepoDetails.RepoName
return SetupIDE(ctx, exec, ideService, args, gitspaceLogger) return SetupIDE(ctx, exec, ideService, args, gitspaceLogger)
}, },
StopOnFailure: true, StopOnFailure: true,

View File

@ -143,7 +143,7 @@ func (v *VSCode) handleVSCodeCustomization(
gitspaceLogger gitspaceTypes.GitspaceLogger, gitspaceLogger gitspaceTypes.GitspaceLogger,
payload *template.SetupSSHServerPayload, payload *template.SetupSSHServerPayload,
) error { ) error {
customization, exists := args[gitspaceTypes.VSCodeCustomization] customization, exists := args[gitspaceTypes.VSCodeCustomizationArg]
if !exists { if !exists {
return nil // No customization found, nothing to do return nil // No customization found, nothing to do
} }
@ -172,7 +172,7 @@ func (v *VSCode) handleRepoName(
args map[string]interface{}, args map[string]interface{},
payload *template.SetupSSHServerPayload, payload *template.SetupSSHServerPayload,
) error { ) error {
repoName, exists := args[gitspaceTypes.IDERepoName] repoName, exists := args[gitspaceTypes.IDERepoNameArg]
if !exists { if !exists {
return nil // No repo name found, nothing to do return nil // No repo name found, nothing to do
} }

View File

@ -168,11 +168,11 @@ func updateRunPayloadFromArgs(
payload *template.RunVSCodeWebPayload, payload *template.RunVSCodeWebPayload,
_ gitspaceTypes.GitspaceLogger, _ gitspaceTypes.GitspaceLogger,
) error { ) 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 // Perform a type assertion to ensure proxyURI is a string
proxyURIStr, ok := proxyURI.(string) proxyURIStr, ok := proxyURI.(string)
if !ok { 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 payload.ProxyURI = proxyURIStr
} }
@ -184,7 +184,7 @@ func updateSetupPayloadFromArgs(
payload *template.SetupVSCodeWebPayload, payload *template.SetupVSCodeWebPayload,
gitspaceLogger gitspaceTypes.GitspaceLogger, gitspaceLogger gitspaceTypes.GitspaceLogger,
) error { ) 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 // Perform a type assertion to ensure customization is a VSCodeCustomizationSpecs
vsCodeCustomizationSpecs, ok := customization.(types.VSCodeCustomizationSpecs) vsCodeCustomizationSpecs, ok := customization.(types.VSCodeCustomizationSpecs)
if !ok { if !ok {

View File

@ -23,9 +23,9 @@ import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
) )
const VSCodeCustomization = "vscode_customization" const VSCodeCustomizationArg = "vscode_customization"
const VSCodeProxyURI = "VSCODE_PROXY_URI" const VSCodeProxyURIArg = "VSCODE_PROXY_URI"
const IDERepoName = "IDE_REPO_NAME" const IDERepoNameArg = "IDE_REPO_NAME"
type GitspaceLogger interface { type GitspaceLogger interface {
Info(msg string) Info(msg string)

View File

@ -72,24 +72,36 @@ func (c *Service) ListGitspacesForSpace(
ctx context.Context, ctx context.Context,
space *types.Space, space *types.Space,
filter types.GitspaceFilter, filter types.GitspaceFilter,
) ([]*types.GitspaceConfig, int64, error) { ) ([]*types.GitspaceConfig, int64, int64, error) {
var gitspaceConfigs []*types.GitspaceConfig var gitspaceConfigs []*types.GitspaceConfig
var count int64 var filterCount, allGitspacesInSpaceCount int64
err := c.tx.WithTx(ctx, func(ctx context.Context) (err error) { err := c.tx.WithTx(ctx, func(ctx context.Context) (err error) {
gitspaceConfigs, err = c.gitspaceConfigStore.ListWithLatestInstance(ctx, &filter) gitspaceConfigs, err = c.gitspaceConfigStore.ListWithLatestInstance(ctx, &filter)
if err != nil { if err != nil {
return fmt.Errorf("failed to list gitspace configs: %w", err) 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 { 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 return nil
}, dbtx.TxDefaultReadOnly) }, dbtx.TxDefaultReadOnly)
if err != nil { if err != nil {
return nil, 0, err return nil, 0, 0, err
} }
for _, gitspaceConfig := range gitspaceConfigs { for _, gitspaceConfig := range gitspaceConfigs {
@ -101,7 +113,7 @@ func (c *Service) ListGitspacesForSpace(
gitspaceConfig.BranchURL = c.GetBranchURL(ctx, gitspaceConfig) 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 { func (c *Service) GetBranchURL(ctx context.Context, config *types.GitspaceConfig) string {