From 0156052e2a3dabd0c32ceba13c195876d66c9e32 Mon Sep 17 00:00:00 2001 From: Nejc Zdovc Date: Mon, 13 Jan 2020 10:55:42 -0800 Subject: [PATCH] Adds delays for suggestion api Resolves brave/brave-browser#7709 Resolves brave/brave-browser#6940 --- .../database/database_contribution_info.cc | 106 +++++++++- .../database/database_contribution_info.h | 14 ++ .../database/publisher_info_database.cc | 26 +++ .../database/publisher_info_database.h | 11 + .../browser/rewards_service_impl.cc | 98 +++++++++ .../browser/rewards_service_impl.h | 21 ++ .../bat_ledger_client_mojo_proxy.cc | 45 ++++ .../bat_ledger/bat_ledger_client_mojo_proxy.h | 13 ++ .../public/cpp/ledger_client_mojo_proxy.cc | 74 +++++++ .../public/cpp/ledger_client_mojo_proxy.h | 25 +++ .../public/interfaces/bat_ledger.mojom | 5 + .../include/bat/ledger/ledger_client.h | 19 ++ .../include/bat/ledger/mojom_structs.h | 3 + .../bat/ledger/public/interfaces/ledger.mojom | 11 +- .../internal/contribution/contribution.cc | 174 +++++++++++++--- .../internal/contribution/contribution.h | 19 ++ .../contribution/contribution_unblinded.cc | 194 +++++++++++++----- .../contribution/contribution_unblinded.h | 7 + .../bat/ledger/internal/ledger_client_mock.h | 3 + .../src/bat/ledger/internal/ledger_impl.cc | 43 ++++ .../src/bat/ledger/internal/ledger_impl.h | 20 ++ 21 files changed, 833 insertions(+), 98 deletions(-) diff --git a/components/brave_rewards/browser/database/database_contribution_info.cc b/components/brave_rewards/browser/database/database_contribution_info.cc index 5c69f6655fda..5c04caa745e9 100644 --- a/components/brave_rewards/browser/database/database_contribution_info.cc +++ b/components/brave_rewards/browser/database/database_contribution_info.cc @@ -345,17 +345,18 @@ bool DatabaseContributionInfo::GetOneTimeTips( return false; } - const std::string query = + const std::string query = base::StringPrintf( "SELECT pi.publisher_id, pi.name, pi.url, pi.favIcon, " "ci.amount, ci.created_at, spi.status, pi.provider " - "FROM contribution_info as ci " + "FROM %s as ci " "INNER JOIN contribution_info_publishers AS cp " "ON cp.contribution_id = ci.contribution_id " "INNER JOIN publisher_info AS pi ON cp.publisher_key = pi.publisher_id " "LEFT JOIN server_publisher_info AS spi " "ON spi.publisher_key = pi.publisher_id " "WHERE strftime('%m', datetime(ci.created_at, 'unixepoch')) = ? AND " - "strftime('%Y', datetime(ci.created_at, 'unixepoch')) = ? AND ci.type = ?"; + "strftime('%%Y', datetime(ci.created_at, 'unixepoch')) = ? AND ci.type = ?", + table_name_); sql::Statement statement(db->GetUniqueStatement(query.c_str())); @@ -394,11 +395,12 @@ bool DatabaseContributionInfo::GetContributionReport( return false; } - const std::string query = + const std::string query = base::StringPrintf( "SELECT ci.contribution_id, ci.amount, ci.type, ci.created_at " - "FROM contribution_info as ci " + "FROM %s as ci " "WHERE strftime('%m', datetime(ci.created_at, 'unixepoch')) = ? AND " - "strftime('%Y', datetime(ci.created_at, 'unixepoch')) = ?"; + "strftime('%%Y', datetime(ci.created_at, 'unixepoch')) = ?", + table_name_); sql::Statement statement(db->GetUniqueStatement(query.c_str())); @@ -423,4 +425,96 @@ bool DatabaseContributionInfo::GetContributionReport( return true; } +bool DatabaseContributionInfo::GetNotCompletedRecords( + sql::Database* db, + ledger::ContributionInfoList* list) { + DCHECK(list); + if (!list) { + return false; + } + + const std::string query = base::StringPrintf( + "SELECT ci.contribution_id, ci.amount, ci.type, ci.step, ci.retry_count " + "FROM %s as ci " + "WHERE ci.step > 0", + table_name_); + + sql::Statement statement(db->GetUniqueStatement(query.c_str())); + + while (statement.Step()) { + auto info = ledger::ContributionInfo::New(); + info->contribution_id = statement.ColumnString(0); + info->amount = statement.ColumnDouble(1); + info->type = static_cast(statement.ColumnInt64(2)); + info->step = statement.ColumnInt(3); + info->retry_count = statement.ColumnInt(4); + publishers_->GetRecords( + db, + info->contribution_id, + &info->publishers); + + list->push_back(std::move(info)); + } + + return true; +} + +ledger::ContributionInfoPtr DatabaseContributionInfo::GetRecord( + sql::Database* db, + const std::string& contribution_id) { + if (!db || contribution_id.empty()) { + return nullptr; + } + + const std::string query = base::StringPrintf( + "SELECT ci.contribution_id, ci.amount, ci.type, ci.step, ci.retry_count " + "FROM %s as ci " + "WHERE ci.contribution_id = ?", + table_name_); + + sql::Statement statement(db->GetUniqueStatement(query.c_str())); + + statement.BindString(0, contribution_id); + + if (!statement.Step()) { + return nullptr; + } + + auto info = ledger::ContributionInfo::New(); + info->contribution_id = statement.ColumnString(0); + info->amount = statement.ColumnDouble(1); + info->type = static_cast(statement.ColumnInt64(2)); + info->step = statement.ColumnInt(3); + info->retry_count = statement.ColumnInt(4); + publishers_->GetRecords( + db, + info->contribution_id, + &info->publishers); + + return info; +} + +bool DatabaseContributionInfo::UpdateStepAndCount( + sql::Database* db, + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count) { + if (!db || contribution_id.empty()) { + return false; + } + + const std::string query = base::StringPrintf( + "UPDATE %s SET step=?, retry_count=? WHERE contribution_id = ?;", + table_name_); + + sql::Statement statement( + db->GetCachedStatement(SQL_FROM_HERE, query.c_str())); + + statement.BindInt(0, static_cast(step)); + statement.BindInt(1, retry_count); + statement.BindString(2, contribution_id); + + return statement.Run(); +} + } // namespace brave_rewards diff --git a/components/brave_rewards/browser/database/database_contribution_info.h b/components/brave_rewards/browser/database/database_contribution_info.h index 86035f720e16..0db98a96fc16 100644 --- a/components/brave_rewards/browser/database/database_contribution_info.h +++ b/components/brave_rewards/browser/database/database_contribution_info.h @@ -38,6 +38,20 @@ class DatabaseContributionInfo: public DatabaseTable { const ledger::ActivityMonth month, const int year); + bool GetNotCompletedRecords( + sql::Database* db, + ledger::ContributionInfoList* list); + + ledger::ContributionInfoPtr GetRecord( + sql::Database* db, + const std::string& contribution_id); + + bool UpdateStepAndCount( + sql::Database* db, + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count); + private: bool CreateTableV2(sql::Database* db); diff --git a/components/brave_rewards/browser/database/publisher_info_database.cc b/components/brave_rewards/browser/database/publisher_info_database.cc index 83bd7d85a5f7..32010ba8b89f 100644 --- a/components/brave_rewards/browser/database/publisher_info_database.cc +++ b/components/brave_rewards/browser/database/publisher_info_database.cc @@ -164,6 +164,32 @@ void PublisherInfoDatabase::GetContributionReport( contribution_info_->GetContributionReport(&GetDB(), list, month, year); } +void PublisherInfoDatabase::GetNotCompletedContributions( + ledger::ContributionInfoList* list) { + DCHECK(list); + if (!IsInitialized() || !list) { + return; + } + + contribution_info_->GetNotCompletedRecords(&GetDB(), list); +} + +ledger::ContributionInfoPtr PublisherInfoDatabase::GetContributionInfo( + const std::string& contribution_id) { + return contribution_info_->GetRecord(&GetDB(), contribution_id); +} + +bool PublisherInfoDatabase::UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count) { + return contribution_info_->UpdateStepAndCount( + &GetDB(), + contribution_id, + step, + retry_count); +} + /** * * PUBLISHER INFO diff --git a/components/brave_rewards/browser/database/publisher_info_database.h b/components/brave_rewards/browser/database/publisher_info_database.h index d8161d4116a6..0a16fb13dbd9 100644 --- a/components/brave_rewards/browser/database/publisher_info_database.h +++ b/components/brave_rewards/browser/database/publisher_info_database.h @@ -147,6 +147,17 @@ class PublisherInfoDatabase { const ledger::ActivityMonth month, const int year); + void GetNotCompletedContributions( + ledger::ContributionInfoList* list); + + ledger::ContributionInfoPtr GetContributionInfo( + const std::string& contribution_id); + + bool UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count); + // Vacuums the database. This will cause sqlite to defragment and collect // unused space in the file. It can be VERY SLOW. void Vacuum(); diff --git a/components/brave_rewards/browser/rewards_service_impl.cc b/components/brave_rewards/browser/rewards_service_impl.cc index 79a3af40afcf..700af97f398b 100644 --- a/components/brave_rewards/browser/rewards_service_impl.cc +++ b/components/brave_rewards/browser/rewards_service_impl.cc @@ -4574,4 +4574,102 @@ void RewardsServiceImpl::OnGetContributionReport( callback(std::move(list)); } + + +ledger::ContributionInfoList GetNotCompletedContributionsOnFileTaskRunner( + PublisherInfoDatabase* backend) { + DCHECK(backend); + if (!backend) { + return {}; + } + + ledger::ContributionInfoList list; + backend->GetNotCompletedContributions(&list); + return list; +} + +void RewardsServiceImpl::GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback) { + base::PostTaskAndReplyWithResult( + file_task_runner_.get(), + FROM_HERE, + base::BindOnce(&GetNotCompletedContributionsOnFileTaskRunner, + publisher_info_backend_.get()), + base::BindOnce(&RewardsServiceImpl::OnGetNotCompletedContributions, + AsWeakPtr(), + callback)); +} + +void RewardsServiceImpl::OnGetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback, + ledger::ContributionInfoList list) { + callback(std::move(list)); +} + +ledger::ContributionInfoPtr GetContributionInfoOnFileTaskRunner( + PublisherInfoDatabase* backend, + const std::string& contribution_id) { + DCHECK(backend); + if (!backend) { + return {}; + } + + return backend->GetContributionInfo(contribution_id); +} + +void RewardsServiceImpl::GetContributionInfo( + const std::string& contribution_id, + ledger::GetContributionInfoCallback callback) { + base::PostTaskAndReplyWithResult( + file_task_runner_.get(), + FROM_HERE, + base::BindOnce(&GetContributionInfoOnFileTaskRunner, + publisher_info_backend_.get(), + contribution_id), + base::BindOnce(&RewardsServiceImpl::OnGetContributionInfo, + AsWeakPtr(), + callback)); +} + +void RewardsServiceImpl::OnGetContributionInfo( + ledger::GetContributionInfoCallback callback, + ledger::ContributionInfoPtr info) { + callback(std::move(info)); +} + +ledger::Result UpdateContributionInfoStepAndCountOnFileTaskRunner( + PublisherInfoDatabase* backend, + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count) { + DCHECK(backend); + if (!backend) { + return {}; + } + + const bool success = backend->UpdateContributionInfoStepAndCount( + contribution_id, + step, + retry_count); + return success ? ledger::Result::LEDGER_OK : ledger::Result::LEDGER_ERROR; +} + +void RewardsServiceImpl::UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ledger::ResultCallback callback) { + base::PostTaskAndReplyWithResult( + file_task_runner_.get(), + FROM_HERE, + base::BindOnce(&UpdateContributionInfoStepAndCountOnFileTaskRunner, + publisher_info_backend_.get(), + contribution_id, + step, + retry_count), + base::BindOnce(&RewardsServiceImpl::OnResult, + AsWeakPtr(), + callback)); +} + } // namespace brave_rewards diff --git a/components/brave_rewards/browser/rewards_service_impl.h b/components/brave_rewards/browser/rewards_service_impl.h index 910b2d374a5b..cbceaec6753b 100644 --- a/components/brave_rewards/browser/rewards_service_impl.h +++ b/components/brave_rewards/browser/rewards_service_impl.h @@ -752,6 +752,19 @@ class RewardsServiceImpl : public RewardsService, const int year, ledger::GetContributionReportCallback callback) override; + void GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback) override; + + void GetContributionInfo( + const std::string& contribution_id, + ledger::GetContributionInfoCallback callback) override; + + void UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ledger::ResultCallback callback) override; + // end ledger::LedgerClient // Mojo Proxy methods @@ -842,6 +855,14 @@ class RewardsServiceImpl : public RewardsService, ledger::GetContributionReportCallback callback, ledger::ContributionReportInfoList list); + void OnGetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback, + ledger::ContributionInfoList list); + + void OnGetContributionInfo( + ledger::GetContributionInfoCallback callback, + ledger::ContributionInfoPtr info); + #if defined(OS_ANDROID) ledger::Environment GetServerEnvironmentForAndroid(); void CreateWalletAttestationResult( diff --git a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc index ba377ccbad88..984ae3f55503 100644 --- a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc +++ b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc @@ -1072,4 +1072,49 @@ void BatLedgerClientMojoProxy::GetContributionReport( base::BindOnce(&OnGetContributionReport, std::move(callback))); } +void OnGetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback, + ledger::ContributionInfoList list) { + callback(std::move(list)); +} + +void BatLedgerClientMojoProxy::GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback) { + bat_ledger_client_->GetNotCompletedContributions( + base::BindOnce(&OnGetNotCompletedContributions, std::move(callback))); +} + +void OnGetContributionInfo( + ledger::GetContributionInfoCallback callback, + ledger::ContributionInfoPtr info) { + callback(std::move(info)); +} + +void BatLedgerClientMojoProxy::GetContributionInfo( + const std::string& contribution_id, + ledger::GetContributionInfoCallback callback) { + bat_ledger_client_->GetContributionInfo( + contribution_id, + base::BindOnce(&OnGetContributionInfo, std::move(callback))); +} + +void OnUpdateContributionInfoStepAndCount( + ledger::ResultCallback callback, + const ledger::Result result) { + callback(result); +} + +void BatLedgerClientMojoProxy::UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ledger::ResultCallback callback) { + bat_ledger_client_->UpdateContributionInfoStepAndCount( + contribution_id, + step, + retry_count, + base::BindOnce(&OnUpdateContributionInfoStepAndCount, + std::move(callback))); +} + } // namespace bat_ledger diff --git a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h index ae9e686ae141..0cc88b86b0d5 100644 --- a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h +++ b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h @@ -244,6 +244,19 @@ class BatLedgerClientMojoProxy : public ledger::LedgerClient, const int year, ledger::GetContributionReportCallback callback) override; + void GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback) override; + + void GetContributionInfo( + const std::string& contribution_id, + ledger::GetContributionInfoCallback callback) override; + + void UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ledger::ResultCallback callback) override; + private: bool Connected() const; diff --git a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc index d20c9189c7db..02d609253426 100644 --- a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc +++ b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc @@ -1261,4 +1261,78 @@ void LedgerClientMojoProxy::GetContributionReport( _1)); } +// static +void LedgerClientMojoProxy::OnGetNotCompletedContributions( + CallbackHolder* holder, + ledger::ContributionInfoList list) { + DCHECK(holder); + if (holder->is_valid()) { + std::move(holder->get()).Run(std::move(list)); + } + delete holder; +} + +void LedgerClientMojoProxy::GetNotCompletedContributions( + GetNotCompletedContributionsCallback callback) { + auto* holder = new CallbackHolder( + AsWeakPtr(), + std::move(callback)); + ledger_client_->GetNotCompletedContributions( + std::bind(LedgerClientMojoProxy::OnGetNotCompletedContributions, + holder, + _1)); +} + +// static +void LedgerClientMojoProxy::OnGetContributionInfo( + CallbackHolder* holder, + ledger::ContributionInfoPtr info) { + DCHECK(holder); + if (holder->is_valid()) { + std::move(holder->get()).Run(std::move(info)); + } + delete holder; +} + +void LedgerClientMojoProxy::GetContributionInfo( + const std::string& contribution_id, + GetContributionInfoCallback callback) { + auto* holder = new CallbackHolder( + AsWeakPtr(), + std::move(callback)); + ledger_client_->GetContributionInfo( + contribution_id, + std::bind(LedgerClientMojoProxy::OnGetContributionInfo, + holder, + _1)); +} + +// static +void LedgerClientMojoProxy::OnUpdateContributionInfoStepAndCount( + CallbackHolder* holder, + const ledger::Result result) { + DCHECK(holder); + if (holder->is_valid()) { + std::move(holder->get()).Run(result); + } + delete holder; +} + +void LedgerClientMojoProxy::UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + UpdateContributionInfoStepAndCountCallback callback) { + auto* holder = new CallbackHolder( + AsWeakPtr(), + std::move(callback)); + ledger_client_->UpdateContributionInfoStepAndCount( + contribution_id, + step, + retry_count, + std::bind(LedgerClientMojoProxy::OnUpdateContributionInfoStepAndCount, + holder, + _1)); +} + } // namespace bat_ledger diff --git a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h index e9651ec060ae..d4f963fae61c 100644 --- a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h +++ b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h @@ -264,6 +264,19 @@ class LedgerClientMojoProxy : public mojom::BatLedgerClient, const int year, GetContributionReportCallback callback) override; + void GetNotCompletedContributions( + GetNotCompletedContributionsCallback callback) override; + + void GetContributionInfo( + const std::string& contribution_id, + GetContributionInfoCallback callback) override; + + void UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + UpdateContributionInfoStepAndCountCallback callback) override; + private: // workaround to pass base::OnceCallback into std::bind // also serves as a wrapper for passing ledger::LedgerCallbackHandler* @@ -484,6 +497,18 @@ class LedgerClientMojoProxy : public mojom::BatLedgerClient, CallbackHolder* holder, ledger::ContributionReportInfoList list); + static void OnGetNotCompletedContributions( + CallbackHolder* holder, + ledger::ContributionInfoList list); + + static void OnGetContributionInfo( + CallbackHolder* holder, + ledger::ContributionInfoPtr info); + + static void OnUpdateContributionInfoStepAndCount( + CallbackHolder* holder, + const ledger::Result result); + ledger::LedgerClient* ledger_client_; DISALLOW_COPY_AND_ASSIGN(LedgerClientMojoProxy); diff --git a/components/services/bat_ledger/public/interfaces/bat_ledger.mojom b/components/services/bat_ledger/public/interfaces/bat_ledger.mojom index 4055fbcf1673..109d8ea0ca9f 100644 --- a/components/services/bat_ledger/public/interfaces/bat_ledger.mojom +++ b/components/services/bat_ledger/public/interfaces/bat_ledger.mojom @@ -299,4 +299,9 @@ interface BatLedgerClient { GetContributionReport(ledger.mojom.ActivityMonth month, int32 year) => (array list); + GetNotCompletedContributions() => (array list); + + GetContributionInfo(string contribution_id) => (ledger.mojom.ContributionInfo info); + + UpdateContributionInfoStepAndCount(string contribution_id, ledger.mojom.ContributionStep step, int32 retry_count) => (ledger.mojom.Result result); }; diff --git a/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h b/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h index cb3459c8ff7e..5937c288c5a3 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h +++ b/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h @@ -82,6 +82,12 @@ using GetTransactionReportCallback = using GetContributionReportCallback = std::function; +using GetNotCompletedContributionsCallback = + std::function; + +using GetContributionInfoCallback = + std::function; + class LEDGER_EXPORT LedgerClient { public: virtual ~LedgerClient() = default; @@ -335,6 +341,19 @@ class LEDGER_EXPORT LedgerClient { const ledger::ActivityMonth month, const int year, ledger::GetContributionReportCallback callback) = 0; + + virtual void GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback) = 0; + + virtual void GetContributionInfo( + const std::string& contribution_id, + GetContributionInfoCallback callback) = 0; + + virtual void UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ResultCallback callback) = 0; }; } // namespace ledger diff --git a/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h b/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h index 150e88270b8b..9a0f3cadf057 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h +++ b/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h @@ -36,6 +36,7 @@ using ClientInfoPtr = mojom::ClientInfoPtr; using ContributionInfo = mojom::ContributionInfo; using ContributionInfoPtr = mojom::ContributionInfoPtr; +using ContributionInfoList = std::vector; using ContributionPublisher = mojom::ContributionPublisher; using ContributionPublisherPtr = mojom::ContributionPublisherPtr; @@ -58,6 +59,8 @@ using ContributionQueuePublisherList = using ContributionRetry = mojom::ContributionRetry; +using ContributionStep = mojom::ContributionStep; + using Environment = ledger::mojom::Environment; using ExcludeFilter = mojom::ExcludeFilter; diff --git a/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom b/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom index a41390603e3b..6f2cc942f124 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom +++ b/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom @@ -173,6 +173,15 @@ enum ContributionRetry { STEP_FINAL = 10 // Phase 2 }; +enum ContributionStep { + STEP_AC_TABLE_EMPTY = -4 + STEP_NOT_ENOUGH_FUNDS = -3 + STEP_FAILED = -2 + STEP_COMPLETED = -1, + STEP_NO = 0, + STEP_SUGGESTIONS = 1 +}; + struct ReconcileInfo { string viewing_id; string amount; @@ -400,4 +409,4 @@ struct ContributionReportInfo { ReportType type; array publishers; uint64 created_at; -}; \ No newline at end of file +}; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc index 4f6b8daa837d..3966a1436894 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc @@ -32,6 +32,26 @@ using std::placeholders::_1; using std::placeholders::_2; using std::placeholders::_3; +namespace { + ledger::ContributionStep ConvertResultIntoContributionStep( + const ledger::Result result) { + switch (result) { + case ledger::Result::LEDGER_OK: { + return ledger::ContributionStep::STEP_COMPLETED; + } + case ledger::Result::AC_TABLE_EMPTY: { + return ledger::ContributionStep::STEP_AC_TABLE_EMPTY; + } + case ledger::Result::NOT_ENOUGH_FUNDS: { + return ledger::ContributionStep::STEP_NOT_ENOUGH_FUNDS; + } + default: { + return ledger::ContributionStep::STEP_FAILED; + } + } + } +} // namespace + namespace braveledger_contribution { Contribution::Contribution(bat_ledger::LedgerImpl* ledger) : @@ -51,6 +71,7 @@ Contribution::~Contribution() { void Contribution::Initialize() { phase_two_->Initialize(); uphold_->Initialize(); + unblinded_->Initialize(); // Resume in progress contributions ledger::CurrentReconciles currentReconciles = ledger_->GetCurrentReconciles(); @@ -364,6 +385,7 @@ void Contribution::OnTimer(uint32_t timer_id) { ProcessContributionQueue(); } + // DEPRECATED for (std::pair const& value : retry_timers_) { if (value.second == timer_id) { std::string viewing_id = value.first; @@ -371,6 +393,14 @@ void Contribution::OnTimer(uint32_t timer_id) { retry_timers_[viewing_id] = 0u; } } + + for (std::pair const& value : retry_timers_) { + if (value.second == timer_id) { + std::string contribution_id = value.first; + CheckStep(contribution_id); + retry_timers_[contribution_id] = 0u; + } + } } void Contribution::SetReconcileTimer() { @@ -394,12 +424,13 @@ void Contribution::SetTimer(uint32_t* timer_id, uint64_t start_timer_in) { } BLOG(ledger_, ledger::LogLevel::LOG_INFO) - << "Starts in " + << "Timer will start in " << start_timer_in; ledger_->SetTimer(start_timer_in, timer_id); } +// DEPRECATED void Contribution::ReconcileSuccess( const std::string& viewing_id, const double amount, @@ -439,6 +470,27 @@ void Contribution::ReconcileSuccess( } } +void Contribution::ContributionCompleted( + const std::string& contribution_id, + const ledger::RewardsType type, + const double amount, + const ledger::Result result) { + if (result == ledger::Result::LEDGER_OK) { + ledger_->SetBalanceReportItem( + braveledger_time_util::GetCurrentMonth(), + braveledger_time_util::GetCurrentYear(), + GetReportTypeFromRewardsType(type), + amount); + } + + ledger_->UpdateContributionInfoStepAndCount( + contribution_id, + ConvertResultIntoContributionStep(result), + -1, + [](const ledger::Result _){}); +} + +// DEPRECATED void Contribution::AddRetry( ledger::ContributionRetry step, const std::string& viewing_id, @@ -476,6 +528,28 @@ void Contribution::AddRetry( SetTimer(&retry_timers_[viewing_id], start_timer_in); } +void Contribution::UpdateContributionStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count) { + const std::string log = base::StringPrintF( + "Re-trying contribution(%s) for step %s and count %d", + contribution_id, + step, + retry_count); + BLOG(ledger_, ledger::LogLevel::LOG_WARNING) << log; + + ledger_->UpdateContributionStepAndCount( + contribution_id, + step, + retry_count, + [](const ledger::Result){}); + + retry_timers_[contribution_id] = 0u; + SetTimer(&retry_timers_[contribution_id]); +} + +// DEPRECATED uint64_t Contribution::GetRetryTimer( ledger::ContributionRetry step, const std::string& viewing_id, @@ -525,6 +599,7 @@ uint64_t Contribution::GetRetryTimer( return 0; } +// DEPRECATED int Contribution::GetRetryPhase(ledger::ContributionRetry step) { int phase = 0; @@ -552,6 +627,7 @@ int Contribution::GetRetryPhase(ledger::ContributionRetry step) { return phase; } +// DEPRECATED void Contribution::DoRetry(const std::string& viewing_id) { auto reconcile = ledger_->GetReconcileById(viewing_id); @@ -598,6 +674,28 @@ void Contribution::DoRetry(const std::string& viewing_id) { } } +void Contribution::CheckStep(const std::string& contribution_id) { + auto callback = std::bind(&Contribution::OnCheckStep, + this, + _1); + ledger_->GetContributionInfo(contribution_id, callback); +} + +void Contribution::OnCheckStep(ledger::ContributionInfoPtr info) { + // TODO(https://github.com/brave/brave-browser/issues/7722) for now we only + // handle unblided here, but we will need to handle other payment + // flows as well like uphold + bool check_again = unblinded_->DoRetry(info->Clone()); + + if (check_again) { + UpdateContributionStepAndCount( + info->contribution_id, + info->step, + info->retry_count); + return; + } +} + void Contribution::ContributeUnverifiedPublishers() { unverified_->Contribute(); } @@ -750,19 +848,6 @@ bool Contribution::ProcessReconcileUnblindedTokens( return false; } - auto reconcile = ledger::CurrentReconcileProperties(); - reconcile.viewing_id = ledger_->GenerateGUID(); - reconcile.fee = *fee; - reconcile.directions = directions; - reconcile.type = type; - - if (ledger_->ReconcileExists(reconcile.viewing_id)) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) - << "Unable to reconcile with the same viewing id: " - << reconcile.viewing_id; - return false; - } - const double balance = braveledger_wallet::Balance::GetPerWalletBalance( ledger::kWalletUnBlinded, @@ -771,28 +856,49 @@ bool Contribution::ProcessReconcileUnblindedTokens( return false; } - if (balance >= *fee) { - ledger_->AddReconcile(reconcile.viewing_id, reconcile); - unblinded_->Start(reconcile.viewing_id); - return true; - } + const std::string contribution_id = ledger_->GenerateGUID(); - *fee = *fee - balance; - reconcile.fee = balance; + const uint64_t now = static_cast(base::Time::Now().ToDoubleT()); + auto info = ledger::ContributionInfo::New(); + info->contribution_id = contribution_id; + info->amount = *fee; + info->type = type; + info->step = -1; + info->retry_count = -1; + info->created_at = now; - if (type == ledger::RewardsType::RECURRING_TIP || - type == ledger::RewardsType::ONE_TIME_TIP) { - ledger::ReconcileDirections new_directions; - AdjustTipsAmounts(directions, - &new_directions, - leftovers, - balance); - reconcile.directions = new_directions; + ledger::ReconcileDirections new_directions; + const bool full_amount = true; + if (balance < *fee) { + info->amount = *fee - balance; + full_amount = false; + + if (type == ledger::RewardsType::RECURRING_TIP || + type == ledger::RewardsType::ONE_TIME_TIP) { + AdjustTipsAmounts( + directions, + &new_directions, + leftovers, + balance); + } + } else { + new_directions = directions; } - ledger_->AddReconcile(reconcile.viewing_id, reconcile); - unblinded_->Start(reconcile.viewing_id); - return false; + for (auto& item : new_directions) { + auto publisher = ledger::ContributionPublisher::New(); + publisher->contribution_id = contribution_id; + publisher->publisher_key = item.publisher_key; + publisher->total_amount = (item.amount_percent * info->amount) / 100; + publisher->contributed_amount = 0; + publisher_list.push_back(std::move(publisher)); + } + + info->publishers = std::move(publisher_list); + ledger_->SaveContributionInfo(std::move(info), [](const ledger::Result _){}); + unblinded_->Start(contribution_id); + + return full_amount; } bool Contribution::ProcessReconcileAnonize( @@ -937,12 +1043,12 @@ void Contribution::AdjustTipsAmounts( } if (item.amount_percent > reduce_fee_for) { - // anon wallet + // primary wallet const auto original_weight = item.amount_percent; item.amount_percent = reduce_fee_for; primary_directions->push_back(item); - // rest to normal wallet + // second wallet item.amount_percent = original_weight - reduce_fee_for; rest_directions->push_back(item); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.h b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.h index e38cdc358974..8e6e19b5ed63 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.h @@ -137,11 +137,19 @@ class Contribution { // Does final stage in contribution // Sets reports and contribution info + // DEPRECATED void ReconcileSuccess( const std::string& viewing_id, const double amount, const bool delete_reconcile); + // Does final stage in contribution + // Sets reports and contribution info + void ContributionCompleted( + const std::string& contribution_id, + const ledger::RewardsType type, + const double amount); + void HasSufficientBalance( ledger::HasSufficientBalanceToReconcileCallback callback); @@ -154,11 +162,17 @@ class Contribution { void SetTimer(uint32_t* timer_id, uint64_t start_timer_in = 0); + // DEPRECATED void AddRetry( ledger::ContributionRetry step, const std::string& viewing_id, ledger::CurrentReconcileProperties reconcile = {}); + void UpdateContributionStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count); + // Resets reconcile stamps void ResetReconcileStamp(); @@ -204,14 +218,19 @@ class Contribution { const ledger::Result result, ledger::BalancePtr info); + // DEPRECATED uint64_t GetRetryTimer(ledger::ContributionRetry step, const std::string& viewing_id, ledger::CurrentReconcileProperties* reconcile); + // DEPRECATED int GetRetryPhase(ledger::ContributionRetry step); + // DEPRECATED void DoRetry(const std::string& viewing_id); + void CheckStep(const std::string& contribution_id); + void OnHasSufficientBalance( const ledger::PublisherInfoList& publisher_list, const uint32_t record, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc index a905d886df3c..f2989e420259 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc @@ -25,12 +25,7 @@ using challenge_bypass_ristretto::UnblindedToken; using challenge_bypass_ristretto::VerificationKey; using challenge_bypass_ristretto::VerificationSignature; -namespace braveledger_contribution { - -Unblinded::Unblinded(bat_ledger::LedgerImpl* ledger) : ledger_(ledger) { -} - -Unblinded::~Unblinded() = default; +namespace { std::string ConvertTypeToString(const ledger::RewardsType type) { switch (static_cast(type)) { @@ -131,23 +126,60 @@ std::string GenerateTokenPayload( return json; } -void Unblinded::Start(const std::string& viewing_id) { - ledger_->GetAllUnblindedTokens( +} // namespace + +namespace braveledger_contribution { + +Unblinded::Unblinded(bat_ledger::LedgerImpl* ledger) : ledger_(ledger) { +} + +Unblinded::~Unblinded() = default; + +void Unblinded::Initialize() { + auto callback = std::bind(&Unblinded::OnGetNotCompletedContributions, + this, + _1); + ledger_->GetNotCompletedContributions(callback); +} + +void Unblinded::OnGetNotCompletedContributions( + ledger::ContributionInfoList list) { + if (list.size() == 0) { + return; + } +} + +void Unblinded::Start(const std::string& contribution_id) { + ledger_->GetAllUnblindedTokens( std::bind(&Unblinded::OnUnblindedTokens, this, - viewing_id, + contribution_id, _1)); } void Unblinded::OnUnblindedTokens( - const std::string& viewing_id, + const std::string& contribution_id, ledger::UnblindedTokenList list) { if (list.empty()) { - ContributionCompleted(ledger::Result::NOT_ENOUGH_FUNDS, viewing_id); + ContributionCompleted(ledger::Result::NOT_ENOUGH_FUNDS, contribution_id); + return; + } + + ledger_->GetContributionInfo(contribution_id, + std::bind(&Unblinded::OnUnblindedTokens, + this, + _1, + std::move(list))); +} + +void Unblinded::OnUnblindedTokens( + ledger::ContributionInfoPtr contribution, + ledger::UnblindedTokenList list) { + if (!contribution) { + ContributionCompleted(ledger::Result::LEDGER_ERROR, contribution_id); return; } - const auto reconcile = ledger_->GetReconcileById(viewing_id); double current_amount = 0.0; ledger::UnblindedTokenList token_list; std::vector delete_list; @@ -157,7 +189,7 @@ void Unblinded::OnUnblindedTokens( continue; } - if (current_amount >= reconcile.fee) { + if (current_amount >= contribution->amount) { break; } @@ -169,49 +201,69 @@ void Unblinded::OnUnblindedTokens( ledger_->DeleteUnblindedTokens(delete_list, [](const ledger::Result _){}); } - if (current_amount < reconcile.fee) { - ContributionCompleted(ledger::Result::NOT_ENOUGH_FUNDS, viewing_id); + if (current_amount < contribution->amount) { + ContributionCompleted(ledger::Result::NOT_ENOUGH_FUNDS, contribution_id); return; } - MakeContribution(viewing_id, std::move(token_list)); + MakeContribution( + contribution_id, + std::move(token_list), + std::move(contribution)); } void Unblinded::MakeContribution( - const std::string& viewing_id, - ledger::UnblindedTokenList list) { - const auto reconcile = ledger_->GetReconcileById(viewing_id); - - if (reconcile.type == ledger::RewardsType::ONE_TIME_TIP || - reconcile.type == ledger::RewardsType::RECURRING_TIP) { - const auto callback = std::bind(&Unblinded::ContributionCompleted, + const std::string& contribution_id, + ledger::UnblindedTokenList list, + ledger::ContributionInfoPtr contribution) { + if (contribution->type == ledger::RewardsType::ONE_TIME_TIP || + contribution->type == ledger::RewardsType::RECURRING_TIP) { + const auto callback = std::bind(&Unblinded::TipContributionCompleted, this, _1, - viewing_id); + contribution_id); SendTokens( - reconcile.directions.front().publisher_key, - reconcile.type, + contribution->publishers.front().publisher_key, + contribution->type, std::move(list), callback); + + ledger_->UpdateContributionInfoStepAndCount( + contribution_id, + ledger::ContributionStep::STEP_SUGGESTIONS, + 0); return; } - if (reconcile.type == ledger::RewardsType::AUTO_CONTRIBUTE) { - PrepareAutoContribution(viewing_id, std::move(list)); + if (contribution->type == ledger::RewardsType::AUTO_CONTRIBUTE) { + PrepareAutoContribution( + contribution_id, + std::move(list), + std::move(contribution)); + } +} + +void Unblinded::TipContributionCompleted( + const ledger::Result result, + const std::string& contribution_id) { + if (result != ledger::Result::LEDGER_OK) { + return; } + ContributionCompleted(ledger::Result::LEDGER_OK, contribution_id); } bool Unblinded::GetStatisticalVotingWinner( double dart, - const ledger::ReconcileDirections& directions, + const double amount, + ledger::ContributionPublisherList* list, Winners* winners) const { if (!winners) { return false; } double upper = 0.0; - for (const auto& item : directions) { - upper += item.amount_percent / 100.0; + for (const auto item : *list) { + upper += / 100.0; if (upper < dart) { continue; } @@ -234,59 +286,67 @@ bool Unblinded::GetStatisticalVotingWinner( void Unblinded::GetStatisticalVotingWinners( uint32_t total_votes, - const ledger::ReconcileDirections& directions, + const double amount, + ledger::ContributionPublisherList list, Winners* winners) const { while (total_votes > 0) { double dart = brave_base::random::Uniform_01(); - if (GetStatisticalVotingWinner(dart, directions, winners)) { + if (GetStatisticalVotingWinner(dart, amount, list.get(), winners)) { --total_votes; } } } void Unblinded::PrepareAutoContribution( - const std::string& viewing_id, - ledger::UnblindedTokenList list) { + const std::string& contribution_id, + ledger::UnblindedTokenList list, + ledger::ContributionInfoPtr contribution) { if (list.size() == 0) { - ContributionCompleted(ledger::Result::AC_TABLE_EMPTY, viewing_id); + ContributionCompleted(ledger::Result::AC_TABLE_EMPTY, contribution_id); return; } - auto reconcile = ledger_->GetReconcileById(viewing_id); const double total_votes = static_cast(list.size()); Winners winners; - GetStatisticalVotingWinners(total_votes, reconcile.directions, &winners); + GetStatisticalVotingWinners( + total_votes, + contribution->amount, + contribution->publishers, + &winners); - ledger::ReconcileDirections new_directions; + ledger::ContributionPublisherList publisher_list; uint32_t current_position = 0; for (auto & winner : winners) { if (winner.second == 0) { continue; } - ledger::ReconcileDirectionProperties direction; - direction.publisher_key = winner.first; - direction.amount_percent = (winner.second / total_votes) * 100; - new_directions.push_back(direction); + const std::string publisher_key = winner.first + auto publisher = ledger::ContributionPublisher::New(); + publisher.publisher_key = publisher_key; + direction.total_amount = + (winner.second / total_votes) * contribution->amount; + direction.contributed_amount = 0; + publisher_list.push_back(std::move(publisher)); const uint32_t new_position = current_position + winner.second; - ledger::UnblindedTokenList new_list; + ledger::UnblindedTokenList token_list; for (size_t i = current_position; i < new_position; i++) { - new_list.push_back(std::move(list[i])); + token_list.push_back(std::move(list[i])); } current_position = new_position; SendTokens( - winner.first, + publisher_key, ledger::RewardsType::AUTO_CONTRIBUTE, - std::move(new_list), + std::move(token_list), [](const ledger::Result _){}); } - reconcile.directions = new_directions; - ledger_->UpdateReconcile(reconcile); - - ContributionCompleted(ledger::Result::LEDGER_OK, viewing_id); + contribution.publishers = std::move(publisher_list); + ledger_->SaveContributionInfo( + std::move(contribution), + [](const ledger::Result _){}); } void Unblinded::SendTokens( @@ -340,19 +400,39 @@ void Unblinded::OnSendTokens( return; } + // TODO we need to update publisher value in contribution_info_publishers + ledger_->DeleteUnblindedTokens(token_id_list, [](const ledger::Result _){}); callback(ledger::Result::LEDGER_OK); } void Unblinded::ContributionCompleted( const ledger::Result result, - const std::string& viewing_id) { - const auto reconcile = ledger_->GetReconcileById(viewing_id); - ledger_->ReconcileComplete( + const std::string& contribution_id) { + + // fetch contribution info + ledger_->ContributionCompleted( result, - reconcile.fee, - viewing_id, - reconcile.type); + amount, + contribution_id, + type); +} + +bool Unblinded::DoRetry(ledger::ContributionInfoPtr info) { + if (!info) { + return false; + } + + if (info->step == ledger::ContributionStep::STEP_SUGGESTIONS) { + // TODO go through all publisher + // if all publishers contributed + ContributionCompleted( + ledger::ContributionStep::STEP_STEP_COMPLETED, + info->amount, + contribution_id); + } + + return true; } } // namespace braveledger_contribution diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h index 793e25f6f3b0..0fdf9da1d795 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h @@ -31,9 +31,16 @@ class Unblinded { explicit Unblinded(bat_ledger::LedgerImpl* ledger); ~Unblinded(); + void Initialize(); + void Start(const std::string& viewing_id); + bool DoRetry(ledger::ContributionInfoPtr info); + private: + void OnGetNotCompletedContributions( + ledger::ContributionInfoList list); + void OnUnblindedTokens( const std::string& viewing_id, ledger::UnblindedTokenList list); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h index ce5891d95241..38c4fad2caf9 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h @@ -382,6 +382,9 @@ class MockLedgerClient : public LedgerClient { const ledger::ActivityMonth month, const int year, ledger::GetContributionReportCallback callback)); + + MOCK_METHOD1(GetNotCompletedContributions, void( + ledger::GetNotCompletedContributionsCallback callback)); }; } // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc index a9af03171832..b38f3aa54774 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc @@ -661,6 +661,26 @@ void LedgerImpl::ReconcileComplete( type); } +void LedgerImpl::ContributionCompleted( + const ledger::Result result, + const double amount, + const std::string& contribution_id, + const ledger::RewardsType type) { + bat_contribution_->ContributionCompleted( + contribution_id, + type, + amount, + result); + + // TODO(https://github.com/brave/brave-browser/issues/7717) + // rename to ContributionCompleted + ledger_client_->OnReconcileComplete( + result, + contribution_id, + amount, + type); +} + void LedgerImpl::OnWalletProperties( ledger::Result result, const ledger::WalletProperties& properties) { @@ -1606,4 +1626,27 @@ void LedgerImpl::GetContributionReport( ledger_client_->GetContributionReport(month, year, callback); } +void LedgerImpl::GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback) { + ledger_client_->GetNotCompletedContributions(callback); +} + +void LedgerImpl::GetContributionInfo( + const std::string& contribution_id, + ledger::GetContributionInfoCallback callback) { + ledger_client_->GetContributionInfo(contribution_id, callback); +} + +void LedgerImpl::UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ledger::ResultCallback callback) { + ledger_client_->UpdateContributionInfoStepAndCount( + contribution_id, + step, + retry_count, + callback); +} + } // namespace bat_ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h index 761edad919e3..645e2aea1df5 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h @@ -215,6 +215,7 @@ class LedgerImpl : public ledger::Ledger, const ledger::UrlMethod method, ledger::LoadURLCallback callback); + // DEPRECATED virtual void ReconcileComplete( const ledger::Result result, const double amount, @@ -222,6 +223,12 @@ class LedgerImpl : public ledger::Ledger, const ledger::RewardsType type, const bool delete_reconcile = true); + virtual void ContributionCompleted( + const ledger::Result result, + const double amount, + const std::string& contribution_id, + const ledger::RewardsType type); + std::string URIEncode(const std::string& value) override; void SaveMediaVisit(const std::string& publisher_id, @@ -609,6 +616,19 @@ class LedgerImpl : public ledger::Ledger, const int year, ledger::GetContributionReportCallback callback) override; + void GetNotCompletedContributions( + ledger::GetNotCompletedContributionsCallback callback); + + void GetContributionInfo( + const std::string& contribution_id, + ledger::GetContributionInfoCallback callback); + + void UpdateContributionInfoStepAndCount( + const std::string& contribution_id, + const ledger::ContributionStep step, + const int32_t retry_count, + ledger::ResultCallback callback); + private: void InitializeConfirmations( ledger::InitializeCallback callback);