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 }