github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/certificatemanager/paginate.go (about)

     1  package certificatemanager
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"reflect"
     7  	"strings"
     8  )
     9  
    10  type GenericPaginatedResourcesHandler struct {
    11  	resourceType reflect.Type
    12  }
    13  
    14  func NewCMSPaginatedResources(resource interface{}) GenericPaginatedResourcesHandler {
    15  	return GenericPaginatedResourcesHandler{
    16  		resourceType: reflect.TypeOf(resource),
    17  	}
    18  }
    19  
    20  func (pr GenericPaginatedResourcesHandler) Resources(bytes []byte, curURL string) ([]interface{}, string, error) {
    21  	var paginatedResources = struct {
    22  		NextPageInfo struct {
    23  			StartDocId        string `json:"startWithDocId"`
    24  			StartOrderByValue string `json:"startWithOrderByValue"`
    25  		} `json:"nextPageInfo"`
    26  		Certificates json.RawMessage `json:"certificates"`
    27  		TotalDocs    int             `json:"totalScannedDocs"`
    28  	}{}
    29  
    30  	if err := json.Unmarshal(bytes, &paginatedResources); err != nil {
    31  		return nil, "", fmt.Errorf("failed to unmarshal paginated response as json: %s", err)
    32  	}
    33  	slicePtr := reflect.New(reflect.SliceOf(pr.resourceType))
    34  	dc := json.NewDecoder(strings.NewReader(string(paginatedResources.Certificates)))
    35  	dc.UseNumber()
    36  	if err := dc.Decode(slicePtr.Interface()); err != nil {
    37  		return nil, "", fmt.Errorf("failed to decode paginated objects as %T: %s", pr.resourceType, err)
    38  	}
    39  	slice := reflect.Indirect(slicePtr)
    40  
    41  	contents := make([]interface{}, 0, slice.Len())
    42  	for i := 0; i < slice.Len(); i++ {
    43  		contents = append(contents, slice.Index(i).Interface())
    44  	}
    45  	if paginatedResources.NextPageInfo.StartDocId == "" && paginatedResources.NextPageInfo.StartOrderByValue == "" {
    46  		return contents, "", nil
    47  	}
    48  	urlprefix := strings.Split(curURL, "?")[0]
    49  	nextURL := fmt.Sprintf("%s?page_number=1&&page_size=200&&start_from_document_id=%s&&start_from_orderby_value=%s", urlprefix, strings.Replace(paginatedResources.NextPageInfo.StartDocId, "/", "%2F", -1), paginatedResources.NextPageInfo.StartOrderByValue)
    50  	return contents, nextURL, nil
    51  }