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 }