github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv3/paginate.go (about)

     1  package ccv3
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller"
     7  )
     8  
     9  func (client Client) paginate(request *cloudcontroller.Request, obj interface{}, appendToExternalList func(interface{}) error) (Warnings, error) {
    10  	fullWarningsList := Warnings{}
    11  
    12  	for {
    13  		wrapper := NewPaginatedResources(obj)
    14  		response := cloudcontroller.Response{
    15  			DecodeJSONResponseInto: &wrapper,
    16  		}
    17  
    18  		err := client.connection.Make(request, &response)
    19  		fullWarningsList = append(fullWarningsList, response.Warnings...)
    20  		if err != nil {
    21  			return fullWarningsList, err
    22  		}
    23  
    24  		list, err := wrapper.Resources()
    25  		if err != nil {
    26  			return fullWarningsList, err
    27  		}
    28  
    29  		for _, item := range list {
    30  			err = appendToExternalList(item)
    31  			if err != nil {
    32  				return fullWarningsList, err
    33  			}
    34  		}
    35  
    36  		if wrapper.NextPage() == "" {
    37  			break
    38  		}
    39  
    40  		request, err = client.newHTTPRequest(requestOptions{
    41  			URL:    wrapper.NextPage(),
    42  			Method: http.MethodGet,
    43  		})
    44  		if err != nil {
    45  			return fullWarningsList, err
    46  		}
    47  	}
    48  
    49  	return fullWarningsList, nil
    50  }
    51  
    52  func (requester RealRequester) paginate(request *cloudcontroller.Request, obj interface{}, appendToExternalList func(interface{}) error) (IncludedResources, Warnings, error) {
    53  	fullWarningsList := Warnings{}
    54  	var includes IncludedResources
    55  
    56  	for {
    57  		wrapper, warnings, err := requester.wrapFirstPage(request, obj, appendToExternalList)
    58  		fullWarningsList = append(fullWarningsList, warnings...)
    59  		if err != nil {
    60  			return IncludedResources{}, fullWarningsList, err
    61  		}
    62  
    63  		includes.Users = append(includes.Users, wrapper.IncludedResources.Users...)
    64  		includes.Organizations = append(includes.Organizations, wrapper.IncludedResources.Organizations...)
    65  		includes.Spaces = append(includes.Spaces, wrapper.IncludedResources.Spaces...)
    66  		includes.ServiceOfferings = append(includes.ServiceOfferings, wrapper.IncludedResources.ServiceOfferings...)
    67  		includes.ServiceBrokers = append(includes.ServiceBrokers, wrapper.IncludedResources.ServiceBrokers...)
    68  
    69  		if wrapper.NextPage() == "" {
    70  			break
    71  		}
    72  
    73  		request, err = requester.newHTTPRequest(requestOptions{
    74  			URL:    wrapper.NextPage(),
    75  			Method: http.MethodGet,
    76  		})
    77  		if err != nil {
    78  			return IncludedResources{}, fullWarningsList, err
    79  		}
    80  	}
    81  
    82  	return includes, fullWarningsList, nil
    83  }
    84  
    85  func (requester RealRequester) wrapFirstPage(request *cloudcontroller.Request, obj interface{}, appendToExternalList func(interface{}) error) (*PaginatedResources, Warnings, error) {
    86  	warnings := Warnings{}
    87  	wrapper := NewPaginatedResources(obj)
    88  	response := cloudcontroller.Response{
    89  		DecodeJSONResponseInto: &wrapper,
    90  	}
    91  
    92  	err := requester.connection.Make(request, &response)
    93  	warnings = append(warnings, response.Warnings...)
    94  	if err != nil {
    95  		return nil, warnings, err
    96  	}
    97  
    98  	list, err := wrapper.Resources()
    99  	if err != nil {
   100  		return nil, warnings, err
   101  	}
   102  
   103  	for _, item := range list {
   104  		err = appendToExternalList(item)
   105  		if err != nil {
   106  			return nil, warnings, err
   107  		}
   108  	}
   109  
   110  	return wrapper, warnings, nil
   111  }