private async Task <List <T> > IterateThroughPaginationAsync <T>(LightspeedRequest r, T response) { var additionalResponses = new List <T>(); if (!NeedToIterateThroughPagination(response, r)) { return(additionalResponses); } var paginatedRequest = ( IRequestPagination )r; var paginatedResponse = ( IPaginatedResponse )response; if (paginatedRequest.GetOffset() != 0) { return(additionalResponses); } var numPages = paginatedRequest.GetLimit() / paginatedResponse.GetCount() + 1; for (int pageNum = 1; pageNum < numPages; pageNum++) { paginatedRequest.SetOffset(pageNum * 10); additionalResponses.Add(await GetResponseAsync <T>(r)); } return(additionalResponses); }
private static bool NeedToIterateThroughPagination <T>(T response, LightspeedRequest r) { var paginatedResponse = response as IPaginatedResponse; var requestWithPagination = r as IRequestPagination; return(paginatedResponse != null && requestWithPagination != null && paginatedResponse.GetCount() > requestWithPagination.GetLimit()); }
public async Task <T> GetResponseAsync <T>(LightspeedRequest request) { var webRequest = this.CreateHttpWebRequest(_config.Endpoint + request.GetUri()); var body = request.GetBody(); if (body != null) { webRequest.Method = "PUT"; webRequest.ContentLength = body.Length; Stream dataStream = webRequest.GetRequestStream(); dataStream.Write(body, 0, body.Length); dataStream.Close(); webRequest.ContentType = "text/xml"; } var response = await webRequest.GetResponseAsync(); var stream = response.GetResponseStream(); var deserializer = new XmlSerializer(typeof(T)); var result = ( T )deserializer.Deserialize(stream); var possibleAdditionalResponses = await IterateThroughPaginationAsync <T>(request, result); var aggregatedResult = result as IPaginatedResponse; if (aggregatedResult != null) { possibleAdditionalResponses.ForEach(resp => aggregatedResult.Aggregate(( IPaginatedResponse )resp)); } return(result); }