From 3795424426da12dfc0af5eab79bec639fa4497c1 Mon Sep 17 00:00:00 2001 From: Honza Dvorsky Date: Thu, 28 Jan 2016 20:58:19 +0000 Subject: [PATCH] added bitbucket v2 pagination support, so now ALL PRs/comments get pulled, not just the first page --- .../BitBucket/BitBucketEntity.swift | 5 +-- .../BitBucket/BitBucketServer.swift | 45 +++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/BuildaGitServer/BitBucket/BitBucketEntity.swift b/BuildaGitServer/BitBucket/BitBucketEntity.swift index 4bf5ee9..e4ac8b1 100644 --- a/BuildaGitServer/BitBucket/BitBucketEntity.swift +++ b/BuildaGitServer/BitBucket/BitBucketEntity.swift @@ -39,10 +39,9 @@ class BitBucketEntity : BitBucketType { } //parse an array of dictionaries into an array of parsed entities -func BitBucketArray(jsonDict: NSDictionary) -> [T] { +func BitBucketArray(jsonArray: [NSDictionary]) -> [T] { - let array = jsonDict["values"] as! [NSDictionary]! - let parsed = array.map { + let parsed = jsonArray.map { (json: NSDictionary) -> (T) in return T(json: json) } diff --git a/BuildaGitServer/BitBucket/BitBucketServer.swift b/BuildaGitServer/BitBucket/BitBucketServer.swift index 741e67a..c4cf4dc 100644 --- a/BuildaGitServer/BitBucket/BitBucketServer.swift +++ b/BuildaGitServer/BitBucket/BitBucketServer.swift @@ -56,7 +56,7 @@ extension BitBucketServer: SourceServerType { return } - if let body = body as? NSDictionary { + if let body = body as? [NSDictionary] { let prs: [BitBucketPullRequest] = BitBucketArray(body) completion(prs: prs.map { $0 as PullRequestType }, error: nil) } else { @@ -206,7 +206,7 @@ extension BitBucketServer: SourceServerType { return } - if let body = body as? NSDictionary { + if let body = body as? [NSDictionary] { let comments: [BitBucketComment] = BitBucketArray(body) completion(comments: comments.map { $0 as CommentType }, error: nil) } else { @@ -321,9 +321,48 @@ extension BitBucketServer { do { let request = try self.endpoints.createRequest(method, endpoint: endpoint, params: allParams, query: query, body: body) - self._sendRequest(request, completion: completion) + self._sendRequestWithPossiblePagination(request, accumulatedResponseBody: NSArray(), completion: completion) } catch { completion(response: nil, body: nil, error: Error.withInfo("Couldn't create Request, error \(error)")) } } + + private func _sendRequestWithPossiblePagination(request: NSMutableURLRequest, accumulatedResponseBody: NSArray, completion: HTTP.Completion) { + + self._sendRequest(request) { + (response, body, error) -> () in + + if error != nil { + completion(response: response, body: body, error: error) + return + } + + guard let dictBody = body as? NSDictionary else { + completion(response: response, body: body, error: error) + return + } + + //pull out the values + guard let arrayBody = dictBody["values"] as? [AnyObject] else { + completion(response: response, body: dictBody, error: error) + return + } + + //we do have more, let's fetch it + let newBody = accumulatedResponseBody.arrayByAddingObjectsFromArray(arrayBody) + + guard let nextLink = dictBody.optionalStringForKey("next") else { + + //is array, but we don't have any more data + completion(response: response, body: newBody, error: error) + return + } + + let newRequest = request.mutableCopy() as! NSMutableURLRequest + newRequest.URL = NSURL(string: nextLink)! + self._sendRequestWithPossiblePagination(newRequest, accumulatedResponseBody: newBody, completion: completion) + return + } + } + }