Skip to content

Commit e777715

Browse files
committed
Adds pagination to publisher list
Resolves brave/brave-browser#9607
1 parent 63f2d2d commit e777715

File tree

13 files changed

+156
-127
lines changed

13 files changed

+156
-127
lines changed

components/brave_rewards/browser/rewards_service_browsertest.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,8 @@ class BraveRewardsBrowserTest
391391
} else if (URLMatches(url, "/captchas", PREFIX_V1,
392392
ServerTypes::kPromotion)) {
393393
*response = brave_test_resp::captcha_;
394-
} else if (URLMatches(url, GET_PUBLISHERS_LIST, "",
395-
ServerTypes::PUBLISHER_DISTRO)) {
394+
} else if (URLMatches(url, "/api/v3/public/channels", "",
395+
ServerTypes::kPublisher)) {
396396
if (alter_publisher_list_) {
397397
*response =
398398
"["

vendor/bat-native-ledger/BUILD.gn

+2
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ source_set("ledger") {
245245
"src/bat/ledger/internal/request/request_attestation.h",
246246
"src/bat/ledger/internal/request/request_promotion.cc",
247247
"src/bat/ledger/internal/request/request_promotion.h",
248+
"src/bat/ledger/internal/request/request_publisher.cc",
249+
"src/bat/ledger/internal/request/request_publisher.h",
248250
"src/bat/ledger/internal/request/request_sku.cc",
249251
"src/bat/ledger/internal/request/request_sku.h",
250252
"src/bat/ledger/internal/request/request_util.cc",

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 SKUOrder = mojom::SKUOrder;
143145
using SKUOrderPtr = mojom::SKUOrderPtr;

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,8 @@ enum Result {
248248
DATABASE_INIT_FAILED = 28,
249249
RETRY = 29,
250250
RETRY_SHORT = 30,
251-
RETRY_LONG = 30
251+
RETRY_LONG = 31,
252+
CONTINUE = 32
252253
};
253254

254255
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
@@ -27,10 +27,6 @@ namespace braveledger_publisher {
2727

2828
class PublisherServerList;
2929

30-
using ParsePublisherListCallback = std::function<void(const ledger::Result)>;
31-
using DownloadServerPublisherListCallback =
32-
std::function<void(const ledger::Result)>;
33-
3430
class Publisher {
3531
public:
3632
explicit Publisher(bat_ledger::LedgerImpl* ledger);
@@ -92,7 +88,7 @@ class Publisher {
9288

9389
void ParsePublisherList(
9490
const std::string& data,
95-
ParsePublisherListCallback callback);
91+
ledger::ResultCallback callback);
9692

9793
void getPublisherActivityFromUrl(
9894
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"
@@ -25,6 +26,12 @@ using std::placeholders::_1;
2526
using std::placeholders::_2;
2627
using std::placeholders::_3;
2728

29+
namespace {
30+
31+
const int kHardLimit = 100;
32+
33+
} // namespace
34+
2835
namespace braveledger_publisher {
2936

3037
PublisherServerList::PublisherServerList(bat_ledger::LedgerImpl* ledger) :
@@ -38,19 +45,29 @@ PublisherServerList::~PublisherServerList() {
3845
void PublisherServerList::OnTimer(uint32_t timer_id) {
3946
if (timer_id == server_list_timer_id_) {
4047
server_list_timer_id_ = 0;
41-
Download([](const ledger::Result _){});
48+
Start([](const ledger::Result _){});
49+
}
50+
}
51+
52+
void PublisherServerList::Start(ledger::ResultCallback callback) {
53+
if (in_progress_) {
54+
BLOG(ledger_, ledger::LogLevel::LOG_INFO) << "Publisher list in progress";
55+
callback(ledger::Result::LEDGER_OK);
56+
return;
4257
}
58+
59+
in_progress_ = true;
60+
current_page_ = 1;
61+
62+
Download(callback);
4363
}
4464

45-
void PublisherServerList::Download(
46-
DownloadServerPublisherListCallback callback) {
65+
void PublisherServerList::Download(ledger::ResultCallback callback) {
4766
std::vector<std::string> headers;
4867
headers.push_back("Accept-Encoding: gzip");
4968

50-
const std::string url = braveledger_request_util::BuildUrl(
51-
GET_PUBLISHERS_LIST,
52-
"",
53-
braveledger_request_util::ServerTypes::PUBLISHER_DISTRO);
69+
const std::string url =
70+
braveledger_request_util::GetPublisherListUrl(current_page_);
5471

5572
const ledger::LoadURLCallback download_callback = std::bind(
5673
&PublisherServerList::OnDownload,
@@ -73,13 +90,20 @@ void PublisherServerList::OnDownload(
7390
int response_status_code,
7491
const std::string& response,
7592
const std::map<std::string, std::string>& headers,
76-
DownloadServerPublisherListCallback callback) {
93+
ledger::ResultCallback callback) {
7794
ledger_->LogResponse(
7895
__func__,
7996
response_status_code,
8097
"Publisher list",
8198
headers);
8299

100+
// we iterated through all pages
101+
if (response_status_code == net::HTTP_NO_CONTENT) {
102+
in_progress_ = false;
103+
OnParsePublisherList(ledger::Result::LEDGER_OK, callback);
104+
return;
105+
}
106+
83107
if (response_status_code == net::HTTP_OK && !response.empty()) {
84108
const auto parse_callback =
85109
std::bind(&PublisherServerList::OnParsePublisherList, this, _1, callback);
@@ -103,15 +127,22 @@ void PublisherServerList::OnDownload(
103127

104128
void PublisherServerList::OnParsePublisherList(
105129
const ledger::Result result,
106-
DownloadServerPublisherListCallback callback) {
130+
ledger::ResultCallback callback) {
131+
if (result == ledger::Result::CONTINUE && current_page_ < kHardLimit) {
132+
current_page_++;
133+
Download(callback);
134+
return;
135+
}
136+
107137
uint64_t new_time = 0ull;
108-
if (result == ledger::Result::LEDGER_OK) {
138+
if (result != ledger::Result::LEDGER_ERROR) {
109139
ledger_->ContributeUnverifiedPublishers();
110140
new_time = braveledger_time_util::GetCurrentTimeStamp();
111141
}
112142

113143
ledger_->SetUint64State(ledger::kStateServerPublisherListStamp, new_time);
114144

145+
in_progress_ = false;
115146
bool retry_after_error = result != ledger::Result::LEDGER_OK;
116147
SetTimer(retry_after_error);
117148

@@ -166,7 +197,7 @@ uint64_t PublisherServerList::GetTimerTime(
166197
? 0ull
167198
: now_seconds - last_download;
168199

169-
uint64_t interval =
200+
const uint64_t interval =
170201
ledger_->GetUint64Option(ledger::kOptionPublisherListRefreshInterval);
171202

172203
if (now_seconds == last_download) {
@@ -196,7 +227,7 @@ ledger::PublisherStatus PublisherServerList::ParsePublisherStatus(
196227

197228
void PublisherServerList::ParsePublisherList(
198229
const std::string& data,
199-
ParsePublisherListCallback callback) {
230+
ledger::ResultCallback callback) {
200231
auto list_publisher =
201232
std::make_shared<std::vector<ledger::ServerPublisherPartial>>();
202233
auto list_banner = std::make_shared<std::vector<ledger::PublisherBanner>>();
@@ -247,18 +278,29 @@ void PublisherServerList::ParsePublisherList(
247278
}
248279

249280
if (list_publisher->empty()) {
281+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Publisher list is empty";
250282
callback(ledger::Result::LEDGER_ERROR);
251283
return;
252284
}
253285

254-
auto clear_callback = std::bind(&PublisherServerList::SaveParsedData,
286+
// we need to clear table when we process first page, but only once
287+
if (current_page_ == 1) {
288+
auto clear_callback = std::bind(&PublisherServerList::SaveParsedData,
255289
this,
256290
_1,
257291
list_publisher,
258292
list_banner,
259293
callback);
260294

261-
ledger_->ClearServerPublisherList(clear_callback);
295+
ledger_->ClearServerPublisherList(clear_callback);
296+
return;
297+
}
298+
299+
SaveParsedData(
300+
ledger::Result::LEDGER_OK,
301+
list_publisher,
302+
list_banner,
303+
callback);
262304
}
263305

264306
void PublisherServerList::ParsePublisherBanner(
@@ -312,91 +354,63 @@ void PublisherServerList::SaveParsedData(
312354
const ledger::Result result,
313355
const SharedServerPublisherPartial& list_publisher,
314356
const SharedPublisherBanner& list_banner,
315-
ParsePublisherListCallback callback) {
357+
ledger::ResultCallback callback) {
316358
if (result != ledger::Result::LEDGER_OK) {
359+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "DB was not cleared";
317360
callback(result);
318361
return;
319362
}
320363

321-
if (list_publisher && !list_publisher->empty()) {
322-
SavePublishers(list_publisher, list_banner, callback);
364+
if (!list_publisher || list_publisher->empty()) {
365+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Publisher list is null";
366+
callback(ledger::Result::LEDGER_ERROR);
323367
return;
324368
}
325369

326-
if (list_banner && !list_banner->empty()) {
327-
SaveBanners(list_banner, callback);
328-
return;
329-
}
370+
auto save_callback = std::bind(&PublisherServerList::SaveBanners,
371+
this,
372+
_1,
373+
list_banner,
374+
callback);
330375

331-
callback(ledger::Result::LEDGER_OK);
376+
ledger_->InsertServerPublisherList(*list_publisher, save_callback);
332377
}
333378

334-
void PublisherServerList::SavePublishers(
335-
const SharedServerPublisherPartial& list_publisher,
379+
void PublisherServerList::SaveBanners(
380+
const ledger::Result result,
336381
const SharedPublisherBanner& list_banner,
337-
ParsePublisherListCallback callback) {
338-
if (!list_publisher) {
339-
callback(ledger::Result::LEDGER_OK);
382+
ledger::ResultCallback callback) {
383+
if (!list_banner || result != ledger::Result::LEDGER_OK) {
384+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) <<
385+
"Publisher list was not saved";
386+
callback(ledger::Result::LEDGER_ERROR);
340387
return;
341388
}
342389

343-
const int max_insert_records_ = 100000;
344-
345-
int32_t interval = max_insert_records_;
346-
const auto list_size = list_publisher->size();
347-
if (list_size < max_insert_records_) {
348-
interval = list_size;
390+
if (list_banner->empty()) {
391+
callback(ledger::Result::CONTINUE);
392+
return;
349393
}
350394

351-
std::vector<ledger::ServerPublisherPartial> save_list(
352-
list_publisher->begin(),
353-
list_publisher->begin() + interval);
354-
auto new_list_publisher =
355-
std::make_shared<std::vector<ledger::ServerPublisherPartial>>(
356-
list_publisher->begin() + interval,
357-
list_publisher->end());
358-
359-
auto save_callback = std::bind(&PublisherServerList::SaveParsedData,
395+
auto save_callback = std::bind(&PublisherServerList::BannerSaved,
360396
this,
361397
_1,
362-
new_list_publisher,
363-
list_banner,
364398
callback);
365399

366-
ledger_->InsertServerPublisherList(save_list, save_callback);
400+
ledger_->InsertPublisherBannerList(*list_banner, save_callback);
367401
}
368402

369-
void PublisherServerList::SaveBanners(
370-
const SharedPublisherBanner& list_banner,
371-
ParsePublisherListCallback callback) {
372-
if (!list_banner) {
373-
callback(ledger::Result::LEDGER_OK);
403+
void PublisherServerList::BannerSaved(
404+
const ledger::Result result,
405+
ledger::ResultCallback callback) {
406+
if (result == ledger::Result::LEDGER_OK) {
407+
callback(ledger::Result::CONTINUE);
374408
return;
375409
}
376410

377-
const int max_insert_records_ = 80000;
378-
379-
int32_t interval = max_insert_records_;
380-
const auto list_size = list_banner->size();
381-
if (list_size < max_insert_records_) {
382-
interval = list_size;
383-
}
384411

385-
std::vector<ledger::PublisherBanner> save_list(
386-
list_banner->begin(),
387-
list_banner->begin() + interval);
388-
auto new_list_banner = std::make_shared<std::vector<ledger::PublisherBanner>>(
389-
list_banner->begin() + interval,
390-
list_banner->end());
391-
392-
auto save_callback = std::bind(&PublisherServerList::SaveParsedData,
393-
this,
394-
_1,
395-
nullptr,
396-
new_list_banner,
397-
callback);
398-
399-
ledger_->InsertPublisherBannerList(save_list, save_callback);
412+
BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Banners were not saved";
413+
callback(result);
400414
}
401415

402416
void PublisherServerList::ClearTimer() {

0 commit comments

Comments
 (0)