From 47a40e766c56f3dad6c8690698101b88deb326c7 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Oct 2022 15:53:26 -0500 Subject: [PATCH] Change so that we only send 300 markers per request. Fixes #3711 --- .../Account/Feedly/FeedlyAPICaller.swift | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/Account/Sources/Account/Feedly/FeedlyAPICaller.swift b/Account/Sources/Account/Feedly/FeedlyAPICaller.swift index 40942b2f8..e84b801bd 100644 --- a/Account/Sources/Account/Feedly/FeedlyAPICaller.swift +++ b/Account/Sources/Account/Feedly/FeedlyAPICaller.swift @@ -7,6 +7,7 @@ // import Foundation +import RSCore import RSWeb import Secrets @@ -820,33 +821,48 @@ extension FeedlyAPICaller: FeedlyMarkArticlesService { fatalError("\(components) does not produce a valid URL.") } - var request = URLRequest(url: url) - request.httpMethod = "POST" - request.addValue("application/json", forHTTPHeaderField: HTTPRequestHeader.contentType) - request.addValue("application/json", forHTTPHeaderField: "Accept-Type") - request.addValue("OAuth \(accessToken)", forHTTPHeaderField: HTTPRequestHeader.authorization) - - do { - let body = MarkerEntriesBody(action: action.actionValue, entryIds: Array(articleIds)) - let encoder = JSONEncoder() - let data = try encoder.encode(body) - request.httpBody = data - } catch { - return DispatchQueue.main.async { - completion(.failure(error)) + let articleIdChunks = Array(articleIds).chunked(into: 300) + let dispatchGroup = DispatchGroup() + var groupError: Error? = nil + + for articleIdChunk in articleIdChunks { + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.addValue("application/json", forHTTPHeaderField: HTTPRequestHeader.contentType) + request.addValue("application/json", forHTTPHeaderField: "Accept-Type") + request.addValue("OAuth \(accessToken)", forHTTPHeaderField: HTTPRequestHeader.authorization) + + do { + let body = MarkerEntriesBody(action: action.actionValue, entryIds: Array(articleIdChunk)) + let encoder = JSONEncoder() + let data = try encoder.encode(body) + request.httpBody = data + } catch { + return DispatchQueue.main.async { + completion(.failure(error)) + } + } + + dispatchGroup.enter() + send(request: request, resultType: String.self, dateDecoding: .millisecondsSince1970, keyDecoding: .convertFromSnakeCase) { result in + switch result { + case .success(let (httpResponse, _)): + if httpResponse.statusCode != 200 { + groupError = URLError(.cannotDecodeContentData) + } + case .failure(let error): + groupError = error + } + dispatchGroup.leave() } } - send(request: request, resultType: String.self, dateDecoding: .millisecondsSince1970, keyDecoding: .convertFromSnakeCase) { result in - switch result { - case .success(let (httpResponse, _)): - if httpResponse.statusCode == 200 { - completion(.success(())) - } else { - completion(.failure(URLError(.cannotDecodeContentData))) - } - case .failure(let error): - completion(.failure(error)) + dispatchGroup.notify(queue: .main) { + if let groupError = groupError { + completion(.failure(groupError)) + } else { + completion(.success(())) } } }