github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/gateway/operations/listbuckets.go (about)

     1  package operations
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/treeverse/lakefs/pkg/gateway/errors"
     7  	"github.com/treeverse/lakefs/pkg/gateway/serde"
     8  	"github.com/treeverse/lakefs/pkg/permissions"
     9  )
    10  
    11  type ListBuckets struct{}
    12  
    13  func (controller *ListBuckets) RequiredPermissions(_ *http.Request) (permissions.Node, error) {
    14  	return permissions.Node{
    15  		Permission: permissions.Permission{
    16  			Action:   permissions.ListRepositoriesAction,
    17  			Resource: "*",
    18  		},
    19  	}, nil
    20  }
    21  
    22  // Handle - list buckets (repositories)
    23  func (controller *ListBuckets) Handle(w http.ResponseWriter, req *http.Request, o *AuthorizedOperation) {
    24  	if o.HandleUnsupported(w, req, "events") {
    25  		return
    26  	}
    27  
    28  	o.Incr("list_repos", o.Principal, "", "")
    29  
    30  	buckets := make([]serde.Bucket, 0)
    31  	var after string
    32  	for {
    33  		// list repositories
    34  		repos, hasMore, err := o.Catalog.ListRepositories(req.Context(), -1, "", after)
    35  		if err != nil {
    36  			_ = o.EncodeError(w, req, err, errors.Codes.ToAPIErr(errors.ErrInternalError))
    37  			return
    38  		}
    39  
    40  		// collect repositories
    41  		for _, repo := range repos {
    42  			buckets = append(buckets, serde.Bucket{
    43  				CreationDate: serde.Timestamp(repo.CreationDate),
    44  				Name:         repo.Name,
    45  			})
    46  		}
    47  
    48  		if !hasMore || len(repos) == 0 {
    49  			break
    50  		}
    51  		after = repos[len(repos)-1].Name
    52  	}
    53  	// write response
    54  	o.EncodeResponse(w, req, serde.ListAllMyBucketsResult{
    55  		Buckets: serde.Buckets{Bucket: buckets},
    56  	}, http.StatusOK)
    57  }