Skip to content

Commit 14de590

Browse files
NejcZdovcbsclifton
authored andcommitted
Adds pagination to publisher list
Resolves brave/brave-browser#9607
1 parent b5b5000 commit 14de590

File tree

13 files changed

+158
-127
lines changed

13 files changed

+158
-127
lines changed

components/brave_rewards/browser/rewards_service_browsertest.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,8 @@ class BraveRewardsBrowserTest
358358
} else if (URLMatches(url, "/captchas", PREFIX_V1,
359359
ServerTypes::kPromotion)) {
360360
*response = brave_test_resp::captcha_;
361-
} else if (URLMatches(url, GET_PUBLISHERS_LIST, "",
362-
ServerTypes::PUBLISHER_DISTRO)) {
361+
} else if (URLMatches(url, "/api/v3/public/channels", "",
362+
ServerTypes::kPublisher)) {
363363
if (alter_publisher_list_) {
364364
*response =
365365
"["

vendor/bat-native-ledger/BUILD.gn

+2
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ source_set("ledger") {
241241
"src/bat/ledger/internal/request/request_attestation.h",
242242
"src/bat/ledger/internal/request/request_promotion.cc",
243243
"src/bat/ledger/internal/request/request_promotion.h",
244+
"src/bat/ledger/internal/request/request_publisher.cc",
245+
"src/bat/ledger/internal/request/request_publisher.h",
244246
"src/bat/ledger/internal/request/request_util.cc",
245247
"src/bat/ledger/internal/request/request_util.h",
246248
"src/bat/ledger/internal/state_keys.h",

vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ using ServerPublisherInfoPtr = mojom::ServerPublisherInfoPtr;
138138

139139
using ServerPublisherPartial = mojom::ServerPublisherPartial;
140140
using ServerPublisherPartialPtr = mojom::ServerPublisherPartialPtr;
141+
using ServerPublisherPartialList =
142+
std::vector<mojom::ServerPublisherPartialPtr>;
141143

142144
using TransferFee = mojom::TransferFee;
143145
using TransferFeePtr = mojom::TransferFeePtr;

vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom

+4-1
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,10 @@ enum Result {
241241
ALREADY_EXISTS = 26,
242242
SAFETYNET_ATTESTATION_FAILED = 27,
243243
DATABASE_INIT_FAILED = 28,
244-
RETRY = 29
244+
RETRY = 29,
245+
RETRY_SHORT = 30,
246+
RETRY_LONG = 31,
247+
CONTINUE = 32
245248
};
246249

247250
enum PublisherStatus {

vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void Publisher::OnTimer(uint32_t timer_id) {
5656
void Publisher::RefreshPublisher(
5757
const std::string& publisher_key,
5858
ledger::OnRefreshPublisherCallback callback) {
59-
server_list_->Download(std::bind(&Publisher::OnRefreshPublisher,
59+
server_list_->Start(std::bind(&Publisher::OnRefreshPublisher,
6060
this,
6161
_1,
6262
publisher_key,

vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ namespace braveledger_publisher {
2828

2929
class PublisherServerList;
3030

31-
using ParsePublisherListCallback = std::function<void(const ledger::Result)>;
32-
using DownloadServerPublisherListCallback =
33-
std::function<void(const ledger::Result)>;
34-
3531
class Publisher {
3632
public:
3733
explicit Publisher(bat_ledger::LedgerImpl* ledger);
@@ -93,7 +89,7 @@ class Publisher {
9389

9490
void ParsePublisherList(
9591
const std::string& data,
96-
ParsePublisherListCallback callback);
92+
ledger::ResultCallback callback);
9793

9894
void getPublisherActivityFromUrl(
9995
uint64_t windowId,

vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher_server_list.cc

+86-72
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "bat/ledger/internal/ledger_impl.h"
1212
#include "bat/ledger/internal/publisher/publisher_server_list.h"
1313
#include "bat/ledger/internal/state_keys.h"
14+
#include "bat/ledger/internal/request/request_publisher.h"
1415
#include "bat/ledger/internal/request/request_util.h"
1516
#include "bat/ledger/internal/static_values.h"
1617
#include "bat/ledger/option_keys.h"
@@ -21,6 +22,12 @@ using std::placeholders::_1;
2122
using std::placeholders::_2;
2223
using std::placeholders::_3;
2324

25+
namespace {
26+
27+
const int kHardLimit = 100;
28+
29+
} // namespace
30+
2431
namespace braveledger_publisher {
2532

2633
PublisherServerList::PublisherServerList(bat_ledger::LedgerImpl* ledger) :
@@ -34,19 +41,29 @@ PublisherServerList::~PublisherServerList() {
3441
void PublisherServerList::OnTimer(uint32_t timer_id) {
3542
if (timer_id == server_list_timer_id_) {
3643
server_list_timer_id_ = 0;
37-
Download([](const ledger::Result _){});
44+
Start([](const ledger::Result _){});
45+
}
46+
}
47+
48+
void PublisherServerList::Start(ledger::ResultCallback callback) {
49+
if (in_progress_) {
50+
BLOG(ledger_, ledger::LogLevel::LOG_INFO) << "Publisher list in progress";
51+
callback(ledger::Result::LEDGER_OK);
52+
return;
3853
}
54+
55+
in_progress_ = true;
56+
current_page_ = 1;
57+
58+
Download(callback);
3959
}
4060

41-
void PublisherServerList::Download(
42-
DownloadServerPublisherListCallback callback) {
61+
void PublisherServerList::Download(ledger::ResultCallback callback) {
4362
std::vector<std::string> headers;
4463
headers.push_back("Accept-Encoding: gzip");
4564

46-
const std::string url = braveledger_request_util::BuildUrl(
47-
GET_PUBLISHERS_LIST,
48-
"",
49-
braveledger_request_util::ServerTypes::PUBLISHER_DISTRO);
65+
const std::string url =
66+
braveledger_request_util::GetPublisherListUrl(current_page_);
5067

5168
const ledger::LoadURLCallback download_callback = std::bind(
5269
&PublisherServerList::OnDownload,
@@ -69,13 +86,20 @@ void PublisherServerList::OnDownload(
6986
int response_status_code,
7087
const std::string& response,
7188
const std::map<std::string, std::string>& headers,
72-
DownloadServerPublisherListCallback callback) {
89+
ledger::ResultCallback callback) {
7390
ledger_->LogResponse(
7491
__func__,
7592
response_status_code,
7693
"Publisher list",
7794
headers);
7895

96+
// we iterated through all pages
97+
if (response_status_code == net::HTTP_NO_CONTENT) {
98+
in_progress_ = false;
99+
OnParsePublisherList(ledger::Result::LEDGER_OK, callback);
100+
return;
101+
}
102+
79103
if (response_status_code == net::HTTP_OK && !response.empty()) {
80104
const auto parse_callback =
81105
std::bind(&PublisherServerList::OnParsePublisherList, this, _1, callback);
@@ -90,15 +114,22 @@ void PublisherServerList::OnDownload(
90114

91115
void PublisherServerList::OnParsePublisherList(
92116
const ledger::Result result,
93-
DownloadServerPublisherListCallback callback) {
117+
ledger::ResultCallback callback) {
118+
if (result == ledger::Result::CONTINUE && current_page_ < kHardLimit) {
119+
current_page_++;
120+
Download(callback);
121+
return;
122+
}
123+
94124
uint64_t new_time = 0ull;
95-
if (result == ledger::Result::LEDGER_OK) {
125+
if (result != ledger::Result::LEDGER_ERROR) {
96126
ledger_->ContributeUnverifiedPublishers();
97127
new_time = braveledger_time_util::GetCurrentTimeStamp();
98128
}
99129

100130
ledger_->SetUint64State(ledger::kStateServerPublisherListStamp, new_time);
101131

132+
in_progress_ = false;
102133
bool retry_after_error = result != ledger::Result::LEDGER_OK;
103134
SetTimer(retry_after_error);
104135

@@ -153,7 +184,7 @@ uint64_t PublisherServerList::GetTimerTime(
153184
? 0ull
154185
: now_seconds - last_download;
155186

156-
uint64_t interval =
187+
const uint64_t interval =
157188
ledger_->GetUint64Option(ledger::kOptionPublisherListRefreshInterval);
158189

159190
if (now_seconds == last_download) {
@@ -183,7 +214,7 @@ ledger::PublisherStatus PublisherServerList::ParsePublisherStatus(
183214

184215
void PublisherServerList::ParsePublisherList(
185216
const std::string& data,
186-
ParsePublisherListCallback callback) {
217+
ledger::ResultCallback callback) {
187218
auto list_publisher =
188219
std::make_shared<std::vector<ledger::ServerPublisherPartial>>();
189220
auto list_banner = std::make_shared<std::vector<ledger::PublisherBanner>>();
@@ -234,18 +265,29 @@ void PublisherServerList::ParsePublisherList(
234265
}
235266

236267
if (list_publisher->empty()) {
268+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Publisher list is empty";
237269
callback(ledger::Result::LEDGER_ERROR);
238270
return;
239271
}
240272

241-
auto clear_callback = std::bind(&PublisherServerList::SaveParsedData,
273+
// we need to clear table when we process first page, but only once
274+
if (current_page_ == 1) {
275+
auto clear_callback = std::bind(&PublisherServerList::SaveParsedData,
242276
this,
243277
_1,
244278
list_publisher,
245279
list_banner,
246280
callback);
247281

248-
ledger_->ClearServerPublisherList(clear_callback);
282+
ledger_->ClearServerPublisherList(clear_callback);
283+
return;
284+
}
285+
286+
SaveParsedData(
287+
ledger::Result::LEDGER_OK,
288+
list_publisher,
289+
list_banner,
290+
callback);
249291
}
250292

251293
void PublisherServerList::ParsePublisherBanner(
@@ -299,91 +341,63 @@ void PublisherServerList::SaveParsedData(
299341
const ledger::Result result,
300342
const SharedServerPublisherPartial& list_publisher,
301343
const SharedPublisherBanner& list_banner,
302-
ParsePublisherListCallback callback) {
344+
ledger::ResultCallback callback) {
303345
if (result != ledger::Result::LEDGER_OK) {
346+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "DB was not cleared";
304347
callback(result);
305348
return;
306349
}
307350

308-
if (list_publisher && !list_publisher->empty()) {
309-
SavePublishers(list_publisher, list_banner, callback);
351+
if (!list_publisher || list_publisher->empty()) {
352+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Publisher list is null";
353+
callback(ledger::Result::LEDGER_ERROR);
310354
return;
311355
}
312356

313-
if (list_banner && !list_banner->empty()) {
314-
SaveBanners(list_banner, callback);
315-
return;
316-
}
357+
auto save_callback = std::bind(&PublisherServerList::SaveBanners,
358+
this,
359+
_1,
360+
list_banner,
361+
callback);
317362

318-
callback(ledger::Result::LEDGER_OK);
363+
ledger_->InsertServerPublisherList(*list_publisher, save_callback);
319364
}
320365

321-
void PublisherServerList::SavePublishers(
322-
const SharedServerPublisherPartial& list_publisher,
366+
void PublisherServerList::SaveBanners(
367+
const ledger::Result result,
323368
const SharedPublisherBanner& list_banner,
324-
ParsePublisherListCallback callback) {
325-
if (!list_publisher) {
326-
callback(ledger::Result::LEDGER_OK);
369+
ledger::ResultCallback callback) {
370+
if (!list_banner || result != ledger::Result::LEDGER_OK) {
371+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) <<
372+
"Publisher list was not saved";
373+
callback(ledger::Result::LEDGER_ERROR);
327374
return;
328375
}
329376

330-
const int max_insert_records_ = 100000;
331-
332-
int32_t interval = max_insert_records_;
333-
const auto list_size = list_publisher->size();
334-
if (list_size < max_insert_records_) {
335-
interval = list_size;
377+
if (list_banner->empty()) {
378+
callback(ledger::Result::CONTINUE);
379+
return;
336380
}
337381

338-
std::vector<ledger::ServerPublisherPartial> save_list(
339-
list_publisher->begin(),
340-
list_publisher->begin() + interval);
341-
auto new_list_publisher =
342-
std::make_shared<std::vector<ledger::ServerPublisherPartial>>(
343-
list_publisher->begin() + interval,
344-
list_publisher->end());
345-
346-
auto save_callback = std::bind(&PublisherServerList::SaveParsedData,
382+
auto save_callback = std::bind(&PublisherServerList::BannerSaved,
347383
this,
348384
_1,
349-
new_list_publisher,
350-
list_banner,
351385
callback);
352386

353-
ledger_->InsertServerPublisherList(save_list, save_callback);
387+
ledger_->InsertPublisherBannerList(*list_banner, save_callback);
354388
}
355389

356-
void PublisherServerList::SaveBanners(
357-
const SharedPublisherBanner& list_banner,
358-
ParsePublisherListCallback callback) {
359-
if (!list_banner) {
360-
callback(ledger::Result::LEDGER_OK);
390+
void PublisherServerList::BannerSaved(
391+
const ledger::Result result,
392+
ledger::ResultCallback callback) {
393+
if (result == ledger::Result::LEDGER_OK) {
394+
callback(ledger::Result::CONTINUE);
361395
return;
362396
}
363397

364-
const int max_insert_records_ = 80000;
365-
366-
int32_t interval = max_insert_records_;
367-
const auto list_size = list_banner->size();
368-
if (list_size < max_insert_records_) {
369-
interval = list_size;
370-
}
371398

372-
std::vector<ledger::PublisherBanner> save_list(
373-
list_banner->begin(),
374-
list_banner->begin() + interval);
375-
auto new_list_banner = std::make_shared<std::vector<ledger::PublisherBanner>>(
376-
list_banner->begin() + interval,
377-
list_banner->end());
378-
379-
auto save_callback = std::bind(&PublisherServerList::SaveParsedData,
380-
this,
381-
_1,
382-
nullptr,
383-
new_list_banner,
384-
callback);
385-
386-
ledger_->InsertPublisherBannerList(save_list, save_callback);
399+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Banners were not saved";
400+
callback(result);
387401
}
388402

389403
void PublisherServerList::ClearTimer() {

0 commit comments

Comments
 (0)