From 57464ad4d127d01812c6fc7aab3728c2e3c8be74 Mon Sep 17 00:00:00 2001 From: NejcZdovc Date: Thu, 20 Aug 2020 08:41:23 +0200 Subject: [PATCH] Adds payment server handler Resolves https://github.com/brave/brave-browser/issues/11284 --- .../browser/ads_service_browsertest.cc | 2 - .../rewards_browsertest_network_util.cc | 10 - .../common/rewards_browsertest_network_util.h | 6 - .../common/rewards_browsertest_response.cc | 11 +- components/brave_rewards/test/BUILD.gn | 7 + vendor/bat-native-ledger/BUILD.gn | 22 +- .../contribution/contribution_anon_card.cc | 85 +----- .../contribution/contribution_anon_card.h | 5 +- .../credentials/credentials_common.cc | 51 ---- .../internal/credentials/credentials_common.h | 5 - .../internal/credentials/credentials_sku.cc | 90 ++---- .../internal/credentials/credentials_sku.h | 9 +- .../internal/credentials/credentials_util.cc | 32 -- .../internal/credentials/credentials_util.h | 2 - .../get_credentials/get_credentials.cc | 144 +++++++++ .../payment/get_credentials/get_credentials.h | 90 ++++++ .../get_credentials_unittest.cc | 218 ++++++++++++++ .../endpoint/payment/payment_server.cc | 51 ++++ .../endpoint/payment/payment_server.h | 56 ++++ .../internal/endpoint/payment/payment_util.cc | 39 +++ .../internal/endpoint/payment/payment_util.h | 21 ++ .../endpoint/payment/payment_util_unittest.cc | 41 +++ .../post_credentials/post_credentials.cc | 103 +++++++ .../post_credentials/post_credentials.h | 82 +++++ .../post_credentials_unittest.cc | 197 ++++++++++++ .../endpoint/payment/post_order/post_order.cc | 205 +++++++++++++ .../endpoint/payment/post_order/post_order.h | 104 +++++++ .../payment/post_order/post_order_unittest.cc | 215 ++++++++++++++ .../post_transaction_anon.cc | 140 +++++++++ .../post_transaction_anon.h | 90 ++++++ .../post_transaction_anon_unittest.cc | 216 ++++++++++++++ .../post_transaction_uphold.cc | 103 +++++++ .../post_transaction_uphold.h | 84 ++++++ .../post_transaction_uphold_unittest.cc | 203 +++++++++++++ .../endpoint/payment/post_votes/post_votes.cc | 109 +++++++ .../endpoint/payment/post_votes/post_votes.h | 76 +++++ .../payment/post_votes/post_votes_unittest.cc | 191 ++++++++++++ .../get_signed_creds/get_signed_creds.cc | 2 +- .../post_suggestions/post_suggestions.cc | 2 +- .../post_suggestions_claim.cc | 2 +- .../ledger/internal/request/request_sku.cc | 68 ----- .../bat/ledger/internal/request/request_sku.h | 29 -- .../ledger/internal/request/request_util.cc | 48 +-- .../ledger/internal/request/request_util.h | 9 - .../internal/response/response_credentials.cc | 114 ------- .../internal/response/response_credentials.h | 20 -- .../ledger/internal/response/response_sku.cc | 280 ------------------ .../ledger/internal/response/response_sku.h | 29 -- .../src/bat/ledger/internal/sku/sku_order.cc | 43 +-- .../src/bat/ledger/internal/sku/sku_order.h | 7 +- .../ledger/internal/sku/sku_transaction.cc | 47 ++- .../bat/ledger/internal/sku/sku_transaction.h | 5 +- .../src/bat/ledger/internal/sku/sku_util.cc | 16 - .../src/bat/ledger/internal/sku/sku_util.h | 3 - 54 files changed, 2888 insertions(+), 951 deletions(-) create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold_unittest.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.cc create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.h create mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes_unittest.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.h delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.cc delete mode 100644 vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.h diff --git a/components/brave_ads/browser/ads_service_browsertest.cc b/components/brave_ads/browser/ads_service_browsertest.cc index 480da8b08fee5..aa7ec9ffc8090 100644 --- a/components/brave_ads/browser/ads_service_browsertest.cc +++ b/components/brave_ads/browser/ads_service_browsertest.cc @@ -53,8 +53,6 @@ using ::testing::NiceMock; using ::testing::Return; -using braveledger_request_util::ServerTypes; - namespace { using RewardsNotificationType = diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc index 97ac03eba3031..05227c37837a5 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.cc @@ -12,16 +12,6 @@ namespace rewards_browsertest_util { -bool URLMatches( - const std::string& url, - const std::string& path, - const std::string& prefix, - const braveledger_request_util::ServerTypes server) { - const std::string target_url = - braveledger_request_util::BuildUrl(path, prefix, server); - return (url.find(target_url) == 0); -} - std::unique_ptr HandleRequest( const net::test_server::HttpRequest& request) { std::unique_ptr http_response( diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h index 967795752109c..f731ffe414ef2 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_network_util.h @@ -16,12 +16,6 @@ namespace rewards_browsertest_util { -bool URLMatches( - const std::string& url, - const std::string& path, - const std::string& prefix, - const braveledger_request_util::ServerTypes server); - std::unique_ptr HandleRequest( const net::test_server::HttpRequest& request); diff --git a/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc b/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc index a61ec65af0ab9..24d37d6647d30 100644 --- a/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc +++ b/components/brave_rewards/browser/test/common/rewards_browsertest_response.cc @@ -129,9 +129,6 @@ std::string GetPublisherChannelResponse( namespace rewards_browsertest { -using braveledger_request_util::ServerTypes; -using rewards_browsertest_util::URLMatches; - RewardsBrowserTestResponse::RewardsBrowserTestResponse() = default; RewardsBrowserTestResponse::~RewardsBrowserTestResponse() = default; @@ -244,7 +241,7 @@ void RewardsBrowserTestResponse::Get( return; } - if (url.find("v1/promotions?") != std::string::npos) { + if (url.find("/v1/promotions?") != std::string::npos) { if (empty_promotion_key_) { *response = promotion_empty_key_; } else { @@ -324,11 +321,7 @@ void RewardsBrowserTestResponse::Get( return; } - if (URLMatches( - url, - "/order", - PREFIX_V1, - ServerTypes::kPayments)) { + if (url.find("/v1/orders") != std::string::npos) { if (url.find("credentials") != std::string::npos) { if (method == 0) { #if defined(OFFICIAL_BUILD) diff --git a/components/brave_rewards/test/BUILD.gn b/components/brave_rewards/test/BUILD.gn index f898a470cd7d8..21e8bfda3aa3a 100644 --- a/components/brave_rewards/test/BUILD.gn +++ b/components/brave_rewards/test/BUILD.gn @@ -49,6 +49,13 @@ source_set("brave_rewards_unit_tests") { "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/api_util_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/private_cdn/get_publisher/get_publisher_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/private_cdn/private_cdn_util_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_available/get_available_unittest.cc", diff --git a/vendor/bat-native-ledger/BUILD.gn b/vendor/bat-native-ledger/BUILD.gn index 3323a00800ba7..1bbabf836c2bd 100644 --- a/vendor/bat-native-ledger/BUILD.gn +++ b/vendor/bat-native-ledger/BUILD.gn @@ -307,14 +307,8 @@ source_set("ledger") { "src/bat/ledger/internal/recovery/recovery_empty_balance.h", "src/bat/ledger/internal/report/report.cc", "src/bat/ledger/internal/report/report.h", - "src/bat/ledger/internal/request/request_sku.cc", - "src/bat/ledger/internal/request/request_sku.h", "src/bat/ledger/internal/request/request_util.cc", "src/bat/ledger/internal/request/request_util.h", - "src/bat/ledger/internal/response/response_credentials.cc", - "src/bat/ledger/internal/response/response_credentials.h", - "src/bat/ledger/internal/response/response_sku.cc", - "src/bat/ledger/internal/response/response_sku.h", "src/bat/ledger/internal/response/response_uphold.cc", "src/bat/ledger/internal/response/response_uphold.h", "src/bat/ledger/internal/endpoint/api/api_server.cc", @@ -323,6 +317,22 @@ source_set("ledger") { "src/bat/ledger/internal/endpoint/api/api_util.h", "src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.cc", "src/bat/ledger/internal/endpoint/api/get_parameters/get_parameters.h", + "src/bat/ledger/internal/endpoint/payment/payment_server.cc", + "src/bat/ledger/internal/endpoint/payment/payment_server.h", + "src/bat/ledger/internal/endpoint/payment/payment_util.cc", + "src/bat/ledger/internal/endpoint/payment/payment_util.h", + "src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.cc", + "src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h", + "src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.cc", + "src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h", + "src/bat/ledger/internal/endpoint/payment/post_order/post_order.cc", + "src/bat/ledger/internal/endpoint/payment/post_order/post_order.h", + "src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.cc", + "src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h", + "src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.cc", + "src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h", + "src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.cc", + "src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.h", "src/bat/ledger/internal/endpoint/private_cdn/get_publisher/get_publisher.cc", "src/bat/ledger/internal/endpoint/private_cdn/get_publisher/get_publisher.h", "src/bat/ledger/internal/endpoint/private_cdn/private_cdn_server.cc", diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.cc index aac829e36ef70..caffd9e88c343 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.cc @@ -12,73 +12,17 @@ #include "base/values.h" #include "bat/ledger/internal/contribution/contribution_anon_card.h" #include "bat/ledger/internal/ledger_impl.h" -#include "bat/ledger/internal/request/request_sku.h" -#include "bat/ledger/internal/request/request_util.h" -#include "bat/ledger/internal/response/response_sku.h" #include "bat/ledger/internal/sku/sku_util.h" using std::placeholders::_1; using std::placeholders::_2; using std::placeholders::_3; -namespace { - -std::string GetTransactionPayload( - const double amount, - const std::string& order_id, - const std::string& destination, - const std::string& payment_id, - const std::vector& seed) { - base::Value denomination(base::Value::Type::DICTIONARY); - denomination.SetStringKey("amount", base::StringPrintf("%g", amount)); - denomination.SetStringKey("currency", "BAT"); - - base::Value octets(base::Value::Type::DICTIONARY); - octets.SetKey("denomination", std::move(denomination)); - octets.SetStringKey("destination", destination); - - std::string octets_json; - base::JSONWriter::Write(octets, &octets_json); - - const auto sign_headers = braveledger_request_util::GetSignHeaders( - order_id, - octets_json, - "primary", - seed, - true); - - base::Value headers(base::Value::Type::DICTIONARY); - headers.SetStringKey("digest", sign_headers.at("digest")); - headers.SetStringKey("idempotency-key", order_id); - headers.SetStringKey("signature", sign_headers.at("signature")); - - base::Value transaction(base::Value::Type::DICTIONARY); - transaction.SetKey("headers", std::move(headers)); - transaction.SetStringKey("octets", octets_json); - - std::string transaction_json; - base::JSONWriter::Write(transaction, &transaction_json); - std::string transaction_base64; - base::Base64Encode(transaction_json, &transaction_base64); - - base::Value body(base::Value::Type::DICTIONARY); - body.SetStringKey("paymentId", payment_id); - body.SetStringKey("kind", braveledger_sku::ConvertTransactionTypeToString( - ledger::SKUTransactionType::ANONYMOUS_CARD)); - body.SetStringKey("transaction", transaction_base64); - - std::string body_json; - base::JSONWriter::Write(body, &body_json); - - return body_json; -} - -} // namespace - namespace braveledger_contribution { ContributionAnonCard::ContributionAnonCard(bat_ledger::LedgerImpl* ledger) : - ledger_(ledger) { + ledger_(ledger), + payment_server_(new ledger::endpoint::PaymentServer(ledger)) { DCHECK(ledger_); } @@ -89,38 +33,21 @@ void ContributionAnonCard::SendTransaction( const std::string& order_id, const std::string& destination, ledger::TransactionCallback callback) { - const std::string payload = GetTransactionPayload( - amount, - order_id, - destination, - ledger_->state()->GetPaymentId(), - ledger_->state()->GetRecoverySeed()); - auto url_callback = std::bind(&ContributionAnonCard::OnSendTransaction, this, _1, callback); - const std::string url = braveledger_request_util::GetCreateTransactionURL( + payment_server_->post_transaction_anon()->Request( + amount, order_id, - ledger::SKUTransactionType::ANONYMOUS_CARD); - - ledger_->LoadURL( - url, - {}, - payload, - "application/json; charset=utf-8", - ledger::UrlMethod::POST, + destination, url_callback); } void ContributionAnonCard::OnSendTransaction( - const ledger::UrlResponse& response, + const ledger::Result result, ledger::TransactionCallback callback) { - BLOG(6, ledger::UrlResponseToString(__func__, response)); - - const ledger::Result result = - braveledger_response_util::CheckSendExternalTransaction(response); if (result != ledger::Result::LEDGER_OK) { BLOG(0, "Problem sending transaction"); callback(ledger::Result::LEDGER_ERROR, ""); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.h b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.h index 17509395b295c..db2c928cef832 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_anon_card.h @@ -7,8 +7,10 @@ #define BRAVELEDGER_CONTRIBUTION_CONTRIBUTION_ANON_FUNDS_H_ #include +#include #include +#include "bat/ledger/internal/endpoint/payment/payment_server.h" #include "bat/ledger/ledger.h" namespace bat_ledger { @@ -31,10 +33,11 @@ class ContributionAnonCard { private: void OnSendTransaction( - const ledger::UrlResponse& response, + const ledger::Result result, ledger::TransactionCallback callback); bat_ledger::LedgerImpl* ledger_; // NOT OWNED + std::unique_ptr payment_server_; }; } // namespace braveledger_contribution diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc index 98f557e44fc9b..325e4a2e8f5f0 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc @@ -11,7 +11,6 @@ #include "bat/ledger/internal/credentials/credentials_common.h" #include "bat/ledger/internal/credentials/credentials_util.h" #include "bat/ledger/internal/ledger_impl.h" -#include "bat/ledger/internal/response/response_credentials.h" using std::placeholders::_1; using std::placeholders::_2; @@ -77,56 +76,6 @@ void CredentialsCommon::BlindedCredsSaved( callback(ledger::Result::LEDGER_OK); } -void CredentialsCommon::GetSignedCredsFromResponse( - const CredentialsTrigger& trigger, - const ledger::UrlResponse& response, - ledger::ResultCallback callback) { - base::Value parsed_response(base::Value::Type::DICTIONARY); - const ledger::Result result = - braveledger_response_util::ParseSignedCreds(response, &parsed_response); - - if (result == ledger::Result::RETRY_SHORT) { - callback(ledger::Result::RETRY_SHORT); - return; - } - - if (result != ledger::Result::LEDGER_OK || parsed_response.DictSize() != 3) { - BLOG(0, "Parsing failed"); - callback(ledger::Result::RETRY); - return; - } - - auto* signed_creds = parsed_response.FindListKey("signed_creds"); - if (!signed_creds || signed_creds->GetList().empty()) { - BLOG(0, "Failed to parse signed creds"); - callback(ledger::Result::RETRY); - return; - } - - auto* public_key = parsed_response.FindStringKey("public_key"); - if (!public_key || public_key->empty()) { - BLOG(0, "Public key is empty"); - callback(ledger::Result::RETRY); - return; - } - - auto* batch_proof = parsed_response.FindStringKey("batch_proof"); - if (!batch_proof || batch_proof->empty()) { - BLOG(0, "Batch proof is empty"); - callback(ledger::Result::RETRY); - return; - } - - auto creds_batch = ledger::CredsBatch::New(); - creds_batch->trigger_id = trigger.id; - creds_batch->trigger_type = trigger.type; - base::JSONWriter::Write(*signed_creds, &creds_batch->signed_creds); - creds_batch->public_key = *public_key; - creds_batch->batch_proof = *batch_proof; - - ledger_->database()->SaveSignedCreds(std::move(creds_batch), callback); -} - void CredentialsCommon::SaveUnblindedCreds( const uint64_t expires_at, const double token_value, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h index 14320cb74ede1..b85f774cfae21 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h @@ -30,11 +30,6 @@ class CredentialsCommon { const CredentialsTrigger& trigger, ledger::ResultCallback callback); - void GetSignedCredsFromResponse( - const CredentialsTrigger& trigger, - const ledger::UrlResponse& response, - ledger::ResultCallback callback); - void SaveUnblindedCreds( const uint64_t expires_at, const double token_value, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.cc index 7612aaaaa102b..c7d70899b3c5d 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.cc @@ -14,9 +14,6 @@ #include "bat/ledger/internal/credentials/credentials_sku.h" #include "bat/ledger/internal/credentials/credentials_util.h" #include "bat/ledger/internal/ledger_impl.h" -#include "bat/ledger/internal/request/request_sku.h" -#include "bat/ledger/internal/request/request_util.h" -#include "bat/ledger/internal/response/response_sku.h" #include "bat/ledger/internal/static_values.h" using std::placeholders::_1; @@ -76,7 +73,8 @@ namespace braveledger_credentials { CredentialsSKU::CredentialsSKU(bat_ledger::LedgerImpl* ledger) : ledger_(ledger), - common_(std::make_unique(ledger)) { + common_(std::make_unique(ledger)), + payment_server_(new ledger::endpoint::PaymentServer(ledger)) { DCHECK(ledger_ && common_); } @@ -229,44 +227,26 @@ void CredentialsSKU::Claim( return; } - DCHECK_EQ(trigger.data.size(), 2ul); - base::Value body(base::Value::Type::DICTIONARY); - body.SetStringKey("itemId", trigger.data[0]); - body.SetStringKey("type", ConvertItemTypeToString(trigger.data[1])); - body.SetKey("blindedCreds", base::Value(std::move(*blinded_creds))); - - std::string json; - base::JSONWriter::Write(body, &json); - - const std::string sign_url = base::StringPrintf( - "post /v1/orders/%s/credentials", - trigger.id.c_str()); - - const std::string url = - braveledger_request_util::GetOrderCredentialsURL(trigger.id); auto url_callback = std::bind(&CredentialsSKU::OnClaim, this, _1, trigger, callback); - ledger_->LoadURL( - url, - {}, - json, - "application/json; charset=utf-8", - ledger::UrlMethod::POST, + + DCHECK_EQ(trigger.data.size(), 2ul); + payment_server_->post_credentials()->Request( + trigger.id, + trigger.data[0], + ConvertItemTypeToString(trigger.data[1]), + std::move(blinded_creds), url_callback); } void CredentialsSKU::OnClaim( - const ledger::UrlResponse& response, + const ledger::Result result, const CredentialsTrigger& trigger, ledger::ResultCallback callback) { - BLOG(6, ledger::UrlResponseToString(__func__, response)); - - const ledger::Result result = - braveledger_response_util::CheckClaimSKUCreds(response); if (result != ledger::Result::LEDGER_OK) { BLOG(0, "Failed to claim SKU creds"); callback(ledger::Result::RETRY); @@ -291,7 +271,7 @@ void CredentialsSKU::ClaimStatusSaved( const CredentialsTrigger& trigger, ledger::ResultCallback callback) { if (result != ledger::Result::LEDGER_OK) { - BLOG(0, "Claim status not saved"); + BLOG(0, "Claim status not saved " << result); callback(ledger::Result::RETRY); return; } @@ -302,41 +282,45 @@ void CredentialsSKU::ClaimStatusSaved( void CredentialsSKU::FetchSignedCreds( const CredentialsTrigger& trigger, ledger::ResultCallback callback) { - const std::string url = braveledger_request_util::GetOrderCredentialsURL( - trigger.id, - trigger.data[0]); auto url_callback = std::bind(&CredentialsSKU::OnFetchSignedCreds, this, _1, + _2, trigger, callback); - ledger_->LoadURL(url, {}, "", "", ledger::UrlMethod::GET, url_callback); + payment_server_->get_credentials()->Request( + trigger.id, + trigger.data[0], + url_callback); } void CredentialsSKU::OnFetchSignedCreds( - const ledger::UrlResponse& response, + const ledger::Result result, + ledger::CredsBatchPtr batch, const CredentialsTrigger& trigger, ledger::ResultCallback callback) { - BLOG(6, ledger::UrlResponseToString(__func__, response)); + if (result != ledger::Result::LEDGER_OK) { + BLOG(0, "Couldn't fetch credentials: " << result); + callback(result); + return; + } + + batch->trigger_id = trigger.id; + batch->trigger_type = trigger.type; auto get_callback = std::bind(&CredentialsSKU::SignedCredsSaved, this, _1, trigger, callback); - common_->GetSignedCredsFromResponse(trigger, response, get_callback); + ledger_->database()->SaveSignedCreds(std::move(batch), get_callback); } void CredentialsSKU::SignedCredsSaved( const ledger::Result result, const CredentialsTrigger& trigger, ledger::ResultCallback callback) { - if (result == ledger::Result::RETRY_SHORT) { - callback(ledger::Result::RETRY_SHORT); - return; - } - if (result != ledger::Result::LEDGER_OK) { BLOG(0, "Signed creds were not saved"); callback(ledger::Result::RETRY); @@ -437,30 +421,16 @@ void CredentialsSKU::RedeemTokens( redeem, callback); - const std::string payload = GenerateRedeemTokensPayload(redeem); - const std::string url = - braveledger_request_util::GetRedeemSKUUrl(); - - ledger_->LoadURL( - url, - {}, - payload, - "application/json; charset=utf-8", - ledger::UrlMethod::POST, - url_callback); + payment_server_->post_votes()->Request(redeem, url_callback); } void CredentialsSKU::OnRedeemTokens( - const ledger::UrlResponse& response, + const ledger::Result result, const std::vector& token_id_list, const CredentialsRedeem& redeem, ledger::ResultCallback callback) { - BLOG(6, ledger::UrlResponseToString(__func__, response)); - - const ledger::Result result = - braveledger_response_util::CheckRedeemSKUTokens(response); if (result != ledger::Result::LEDGER_OK) { - BLOG(0, "Failed to parse redeem SKU tokens response"); + BLOG(0, "Failed to submit tokens"); callback(ledger::Result::LEDGER_ERROR); return; } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.h index db000c56b16a8..495911ea518c8 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku.h @@ -12,6 +12,7 @@ #include #include "bat/ledger/internal/credentials/credentials_common.h" +#include "bat/ledger/internal/endpoint/payment/payment_server.h" namespace braveledger_credentials { @@ -53,7 +54,7 @@ class CredentialsSKU : public Credentials { ledger::ResultCallback callback) override; void OnClaim( - const ledger::UrlResponse& response, + const ledger::Result result, const CredentialsTrigger& trigger, ledger::ResultCallback callback); @@ -67,7 +68,8 @@ class CredentialsSKU : public Credentials { ledger::ResultCallback callback); void OnFetchSignedCreds( - const ledger::UrlResponse& response, + const ledger::Result result, + ledger::CredsBatchPtr batch, const CredentialsTrigger& trigger, ledger::ResultCallback callback); @@ -87,13 +89,14 @@ class CredentialsSKU : public Credentials { ledger::ResultCallback callback) override; void OnRedeemTokens( - const ledger::UrlResponse& response, + const ledger::Result result, const std::vector& token_id_list, const CredentialsRedeem& redeem, ledger::ResultCallback callback); bat_ledger::LedgerImpl* ledger_; // NOT OWNED std::unique_ptr common_; + std::unique_ptr payment_server_; }; } // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc index 522ba554d664b..5ea0480e27f0d 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc @@ -272,36 +272,4 @@ bool GenerateSuggestionMock( return true; } -std::string GenerateRedeemTokensPayload(const CredentialsRedeem& redeem) { - base::Value data(base::Value::Type::DICTIONARY); - data.SetStringKey( - "type", - ConvertRewardTypeToString(redeem.type)); - if (!redeem.order_id.empty()) { - data.SetStringKey("orderId", redeem.order_id); - } - data.SetStringKey("channel", redeem.publisher_key); - - const bool is_sku = - redeem.processor == ledger::ContributionProcessor::UPHOLD || - redeem.processor == ledger::ContributionProcessor::BRAVE_USER_FUNDS; - - std::string data_json; - base::JSONWriter::Write(data, &data_json); - std::string data_encoded; - base::Base64Encode(data_json, &data_encoded); - - base::Value credentials(base::Value::Type::LIST); - GenerateCredentials(redeem.token_list, data_encoded, &credentials); - - const std::string data_key = is_sku ? "vote" : "suggestion"; - base::Value payload(base::Value::Type::DICTIONARY); - payload.SetStringKey(data_key, data_encoded); - payload.SetKey("credentials", std::move(credentials)); - - std::string json; - base::JSONWriter::Write(payload, &json); - return json; -} - } // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h index a0fb9410cc70c..e2a2f00b04585 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h @@ -60,8 +60,6 @@ namespace braveledger_credentials { const std::string& suggestion_encoded, base::Value* result); - std::string GenerateRedeemTokensPayload(const CredentialsRedeem& redeem); - } // namespace braveledger_credentials #endif // BRAVELEDGER_CREDENTIALS_CREDENTIALS_UTIL_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.cc new file mode 100644 index 0000000000000..01a67fdf85fbe --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.cc @@ -0,0 +1,144 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h" + +#include + +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; + +namespace ledger { +namespace endpoint { +namespace payment { + +GetCredentials::GetCredentials(bat_ledger::LedgerImpl* ledger): + ledger_(ledger) { + DCHECK(ledger_); +} + +GetCredentials::~GetCredentials() = default; + +std::string GetCredentials::GetUrl( + const std::string& order_id, + const std::string& item_id) { + const std::string path = base::StringPrintf( + "/v1/orders/%s/credentials/%s", + order_id.c_str(), + item_id.c_str()); + + return GetServerUrl(path); +} + +ledger::Result GetCredentials::CheckStatusCode(const int status_code) { + if (status_code == net::HTTP_ACCEPTED) { + return ledger::Result::RETRY_SHORT; + } + + if (status_code == net::HTTP_BAD_REQUEST) { + BLOG(0, "Invalid request"); + return ledger::Result::RETRY; + } + + if (status_code == net::HTTP_NOT_FOUND) { + BLOG(0, "Unrecognized claim id"); + return ledger::Result::RETRY; + } + + if (status_code == net::HTTP_INTERNAL_SERVER_ERROR) { + BLOG(0, "Internal server error"); + return ledger::Result::RETRY; + } + + if (status_code != net::HTTP_OK) { + return ledger::Result::RETRY; + } + + return ledger::Result::LEDGER_OK; +} + +ledger::Result GetCredentials::ParseBody( + const std::string& body, + ledger::CredsBatch* batch) { + DCHECK(batch); + base::Optional value = base::JSONReader::Read(body); + if (!value || !value->is_dict()) { + BLOG(0, "Invalid JSON"); + return ledger::Result::RETRY; + } + + base::DictionaryValue* dictionary = nullptr; + if (!value->GetAsDictionary(&dictionary)) { + BLOG(0, "Invalid JSON"); + return ledger::Result::RETRY; + } + + auto* batch_proof = dictionary->FindStringKey("batchProof"); + if (!batch_proof) { + BLOG(0, "Missing batch proof"); + return ledger::Result::RETRY; + } + + auto* signed_creds = dictionary->FindListKey("signedCreds"); + if (!signed_creds) { + BLOG(0, "Missing signed creds"); + return ledger::Result::RETRY; + } + + auto* public_key = dictionary->FindStringKey("publicKey"); + if (!public_key) { + BLOG(0, "Missing public key"); + return ledger::Result::RETRY; + } + + batch->public_key = *public_key; + batch->batch_proof = *batch_proof; + base::JSONWriter::Write(*signed_creds, &batch->signed_creds); + + return ledger::Result::LEDGER_OK; +} + +void GetCredentials::Request( + const std::string& order_id, + const std::string& item_id, + GetCredentialsCallback callback) { + auto url_callback = std::bind(&GetCredentials::OnRequest, + this, + _1, + callback); + ledger_->LoadURL( + GetUrl(order_id, item_id), + {}, + "", + "", + ledger::UrlMethod::GET, + url_callback); +} + +void GetCredentials::OnRequest( + const ledger::UrlResponse& response, + GetCredentialsCallback callback) { + ledger::LogUrlResponse(__func__, response); + + ledger::Result result = CheckStatusCode(response.status_code); + if (result != ledger::Result::LEDGER_OK) { + callback(result, nullptr); + return; + } + + auto batch = ledger::CredsBatch::New(); + result = ParseBody(response.body, batch.get()); + callback(result, std::move(batch)); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h new file mode 100644 index 0000000000000..24512f67c22cb --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_GET_CREDENTIALS_GET_CREDENTIALS_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_GET_CREDENTIALS_GET_CREDENTIALS_H_ + +#include +#include + +#include "bat/ledger/ledger.h" + +// GET /v1/promotions/{promotion_id}/claims/{claim_id} +// +// Success code: +// HTTP_OK (200) +// +// Error codes: +// HTTP_ACCEPTED (202) +// HTTP_BAD_REQUEST (400) +// HTTP_NOT_FOUND (404) +// HTTP_INTERNAL_SERVER_ERROR (500) +// +// Response body (success): +// { +// "id": "9c9aed7f-b349-452e-80a8-95faf2b1600d", +// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "issuerId": "138bf9ca-69fe-4540-9ac4-bc65baddc4a0", +// "signedCreds": [ +// "ijSZoLLG+EnRN916RUQcjiV6c4Wb6ItbnxXBFhz81EQ=", +// "dj6glCJ2roHYcTFcXF21IrKx1uT/ptM7SJEdiEE1fG8=", +// "nCF9a4KuASICVC0zrx2wGnllgIUxBMnylpu5SA+oBjI=" +// ], +// "batchProof": "zx0cdJhaB/OdYcUtnyXdi+lsoniN2vRTZ1w0U4D7Mgeu1I7RwB+tYKNgFU", +// "publicKey": "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I=" +// } +// +// Response body (error): +// { +// "message": "Claim has been accepted but is not ready", +// "code": 202, +// "data": {} +// } + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { +namespace payment { + +using GetCredentialsCallback = std::function; + +class GetCredentials { + public: + explicit GetCredentials(bat_ledger::LedgerImpl* ledger); + ~GetCredentials(); + + void Request( + const std::string& order_id, + const std::string& item_id, + GetCredentialsCallback callback); + + private: + std::string GetUrl( + const std::string& order_id, + const std::string& item_id); + + ledger::Result CheckStatusCode(const int status_code); + + ledger::Result ParseBody( + const std::string& body, + ledger::CredsBatch* batch); + + void OnRequest( + const ledger::UrlResponse& response, + GetCredentialsCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_GET_CREDENTIALS_GET_CREDENTIALS_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials_unittest.cc new file mode 100644 index 0000000000000..8025d5f9b5ee5 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/get_credentials/get_credentials_unittest.cc @@ -0,0 +1,218 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include +#include +#include + +#include "base/test/task_environment.h" +#include "bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h" +#include "bat/ledger/internal/ledger_client_mock.h" +#include "bat/ledger/internal/ledger_impl_mock.h" +#include "bat/ledger/ledger.h" +#include "net/http/http_status_code.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=GetCredentialsTest.* + +using ::testing::_; +using ::testing::Invoke; + +namespace ledger { +namespace endpoint { +namespace payment { + +class GetCredentialsTest : public testing::Test { + private: + base::test::TaskEnvironment scoped_task_environment_; + + protected: + std::unique_ptr mock_ledger_client_; + std::unique_ptr mock_ledger_impl_; + std::unique_ptr creds_; + + GetCredentialsTest() { + mock_ledger_client_ = std::make_unique(); + mock_ledger_impl_ = + std::make_unique(mock_ledger_client_.get()); + creds_ = std::make_unique(mock_ledger_impl_.get()); + } +}; + + + +TEST_F(GetCredentialsTest, ServerOK) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 200; + response.url = url; + response.body = R"({ + "id": "9c9aed7f-b349-452e-80a8-95faf2b1600d", + "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "issuerId": "138bf9ca-69fe-4540-9ac4-bc65baddc4a0", + "signedCreds": [ + "ijSZoLLG+EnRN916RUQcjiV6c4Wb6ItbnxXBFhz81EQ=", + "dj6glCJ2roHYcTFcXF21IrKx1uT/ptM7SJEdiEE1fG8=", + "nCF9a4KuASICVC0zrx2wGnllgIUxBMnylpu5SA+oBjI=" + ], + "batchProof": "zx0cdJhaB/OdYcUtnyXdi+lsoniN2KNgFU", + "publicKey": "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I=" + })"; + callback(response); + })); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + [](const ledger::Result result, ledger::CredsBatchPtr batch) { + ledger::CredsBatch expected_batch; + expected_batch.batch_proof = "zx0cdJhaB/OdYcUtnyXdi+lsoniN2KNgFU"; + expected_batch.public_key = + "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I="; + expected_batch.signed_creds = + R"(["ijSZoLLG+EnRN916RUQcjiV6c4Wb6ItbnxXBFhz81EQ=","dj6glCJ2roHYcTFcXF21IrKx1uT/ptM7SJEdiEE1fG8=","nCF9a4KuASICVC0zrx2wGnllgIUxBMnylpu5SA+oBjI="])"; // NOLINT + + EXPECT_EQ(result, ledger::Result::LEDGER_OK); + EXPECT_TRUE(expected_batch.Equals(*batch)); + }); +} + +TEST_F(GetCredentialsTest, ServerError202) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 202; + response.url = url; + response.body = ""; + callback(response); + })); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + [](const ledger::Result result, ledger::CredsBatchPtr batch) { + EXPECT_EQ(result, ledger::Result::RETRY_SHORT); + }); +} + +TEST_F(GetCredentialsTest, ServerError400) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 400; + response.url = url; + response.body = ""; + callback(response); + })); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + [](const ledger::Result result, ledger::CredsBatchPtr batch) { + EXPECT_EQ(result, ledger::Result::RETRY); + }); +} + +TEST_F(GetCredentialsTest, ServerError404) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 404; + response.url = url; + response.body = ""; + callback(response); + })); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + [](const ledger::Result result, ledger::CredsBatchPtr batch) { + EXPECT_EQ(result, ledger::Result::RETRY); + }); +} + +TEST_F(GetCredentialsTest, ServerError500) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 500; + response.url = url; + response.body = ""; + callback(response); + })); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + [](const ledger::Result result, ledger::CredsBatchPtr batch) { + EXPECT_EQ(result, ledger::Result::RETRY); + }); +} + +TEST_F(GetCredentialsTest, ServerErrorRandom) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 453; + response.url = url; + response.body = ""; + callback(response); + })); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + [](const ledger::Result result, ledger::CredsBatchPtr batch) { + EXPECT_EQ(result, ledger::Result::RETRY); + }); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.cc new file mode 100644 index 0000000000000..5d70708a6ec1c --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.cc @@ -0,0 +1,51 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/payment_server.h" + +#include "bat/ledger/internal/ledger_impl.h" + +namespace ledger { +namespace endpoint { + +PaymentServer::PaymentServer(bat_ledger::LedgerImpl* ledger): + ledger_(ledger), + post_order_(new payment::PostOrder(ledger)), + post_credentials_(new payment::PostCredentials(ledger)), + get_credentials_(new payment::GetCredentials(ledger)), + post_votes_(new payment::PostVotes(ledger)), + post_transaction_uphold_(new payment::PostTransactionUphold(ledger)), + post_transaction_anon_(new payment::PostTransactionAnon(ledger)) { + DCHECK(ledger_); +} + +PaymentServer::~PaymentServer() = default; + +payment::PostOrder* PaymentServer::post_order() const { + return post_order_.get(); +} + +payment::PostCredentials* PaymentServer::post_credentials() const { + return post_credentials_.get(); +} + +payment::GetCredentials* PaymentServer::get_credentials() const { + return get_credentials_.get(); +} + +payment::PostVotes* PaymentServer::post_votes() const { + return post_votes_.get(); +} + +payment::PostTransactionUphold* PaymentServer::post_transaction_uphold() const { + return post_transaction_uphold_.get(); +} + +payment::PostTransactionAnon* PaymentServer::post_transaction_anon() const { + return post_transaction_anon_.get(); +} + +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.h new file mode 100644 index 0000000000000..3bdd8fc41baa3 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_server.h @@ -0,0 +1,56 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_PAYMENT_SERVER_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_PAYMENT_SERVER_H_ + +#include + +#include "bat/ledger/internal/endpoint/payment/get_credentials/get_credentials.h" +#include "bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h" +#include "bat/ledger/internal/endpoint/payment/post_order/post_order.h" +#include "bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h" +#include "bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h" +#include "bat/ledger/internal/endpoint/payment/post_votes/post_votes.h" +#include "bat/ledger/ledger.h" + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { + +class PaymentServer { + public: + explicit PaymentServer(bat_ledger::LedgerImpl* ledger); + ~PaymentServer(); + + payment::PostOrder* post_order() const; + + payment::PostCredentials* post_credentials() const; + + payment::GetCredentials* get_credentials() const; + + payment::PostVotes* post_votes() const; + + payment::PostTransactionUphold* post_transaction_uphold() const; + + payment::PostTransactionAnon* post_transaction_anon() const; + + private: + bat_ledger::LedgerImpl* ledger_; // NOT OWNED + std::unique_ptr post_order_; + std::unique_ptr post_credentials_; + std::unique_ptr get_credentials_; + std::unique_ptr post_votes_; + std::unique_ptr post_transaction_uphold_; + std::unique_ptr post_transaction_anon_; +}; + +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_PAYMENT_SERVER_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.cc new file mode 100644 index 0000000000000..ae2b15f7dd338 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.cc @@ -0,0 +1,39 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/payment_util.h" + +#include "bat/ledger/ledger.h" + +namespace ledger { +namespace endpoint { +namespace payment { + +const char kDevelopment[] = "https://payment.rewards.brave.software"; +const char kStaging[] = "https://payment.rewards.bravesoftware.com"; +const char kProduction[] = "https://payment.rewards.brave.com"; + +std::string GetServerUrl(const std::string& path) { + DCHECK(!path.empty()); + + std::string url; + switch (ledger::_environment) { + case ledger::Environment::DEVELOPMENT: + url = kDevelopment; + break; + case ledger::Environment::STAGING: + url = kStaging; + break; + case ledger::Environment::PRODUCTION: + url = kProduction; + break; + } + + return url + path; +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.h new file mode 100644 index 0000000000000..84106d0d7c057 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util.h @@ -0,0 +1,21 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_PAYMENT_UTIL_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_PAYMENT_UTIL_H_ + +#include + +namespace ledger { +namespace endpoint { +namespace payment { + +std::string GetServerUrl(const std::string& path); + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_PAYMENT_UTIL_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util_unittest.cc new file mode 100644 index 0000000000000..544a8bda9bca4 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/payment_util_unittest.cc @@ -0,0 +1,41 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/global_constants.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/ledger.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=PaymentUtilTest.* + +namespace ledger { +namespace endpoint { +namespace payment { + +class PaymentUtilTest : public testing::Test { +}; + +TEST(PaymentUtilTest, GetServerUrlDevelopment) { + ledger::_environment = ledger::Environment::DEVELOPMENT; + const std::string url = GetServerUrl("/test"); + const std::string expected_url = ""; + ASSERT_EQ(url, "https://payment.rewards.brave.software/test"); +} + +TEST(PaymentUtilTest, GetServerUrlStaging) { + ledger::_environment = ledger::Environment::STAGING; + const std::string url = GetServerUrl("/test"); + ASSERT_EQ(url, "https://payment.rewards.bravesoftware.com/test"); +} + +TEST(PaymentUtilTest, GetServerUrlProduction) { + ledger::_environment = ledger::Environment::PRODUCTION; + const std::string url = GetServerUrl("/test"); + ASSERT_EQ(url, "https://payment.rewards.brave.com/test"); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.cc new file mode 100644 index 0000000000000..0fa9d5caee40d --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.cc @@ -0,0 +1,103 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h" + +#include + +#include "base/json/json_writer.h" +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; + +namespace ledger { +namespace endpoint { +namespace payment { + +PostCredentials::PostCredentials(bat_ledger::LedgerImpl* ledger): + ledger_(ledger) { + DCHECK(ledger_); +} + +PostCredentials::~PostCredentials() = default; + +std::string PostCredentials::GetUrl(const std::string& order_id) { + const std::string path = base::StringPrintf( + "/v1/orders/%s/credentials", + order_id.c_str()); + + return GetServerUrl(path); +} + +std::string PostCredentials::GeneratePayload( + const std::string& item_id, + const std::string& type, + std::unique_ptr blinded_creds) { + base::Value body(base::Value::Type::DICTIONARY); + body.SetStringKey("itemId", item_id); + body.SetStringKey("type", type); + body.SetKey("blindedCreds", base::Value(std::move(*blinded_creds))); + + std::string json; + base::JSONWriter::Write(body, &json); + + return json; +} + +ledger::Result PostCredentials::CheckStatusCode(const int status_code) { + if (status_code == net::HTTP_BAD_REQUEST) { + BLOG(0, "Invalid request"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code == net::HTTP_CONFLICT) { + BLOG(0, "Credentials already exist for this order"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code == net::HTTP_INTERNAL_SERVER_ERROR) { + BLOG(0, "Internal server error"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code != net::HTTP_OK) { + return ledger::Result::LEDGER_ERROR; + } + + return ledger::Result::LEDGER_OK; +} + +void PostCredentials::Request( + const std::string& order_id, + const std::string& item_id, + const std::string& type, + std::unique_ptr blinded_creds, + PostCredentialsCallback callback) { + auto url_callback = std::bind(&PostCredentials::OnRequest, + this, + _1, + callback); + ledger_->LoadURL( + GetUrl(order_id), + {}, + GeneratePayload(item_id, type, std::move(blinded_creds)), + "application/json; charset=utf-8", + ledger::UrlMethod::POST, + url_callback); +} + +void PostCredentials::OnRequest( + const ledger::UrlResponse& response, + PostCredentialsCallback callback) { + ledger::LogUrlResponse(__func__, response); + callback(CheckStatusCode(response.status_code)); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h new file mode 100644 index 0000000000000..af8413666ccb1 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h @@ -0,0 +1,82 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_POST_CREDENTIALS_POST_CREDENTIALS_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_POST_CREDENTIALS_POST_CREDENTIALS_H_ + +#include +#include + +#include "base/values.h" +#include "bat/ledger/ledger.h" + +// POST /v1/orders/{order_id}/credentials +// +// Request body: +// { +// "itemId": "ff50981d-47de-4210-848d-995e186901a1", +// "type": "single-use", +// "blindedCreds": [ +// "wqto9FnferrKUM0lcp2B0lecMQwArvUq3hWGCYlXiQo=", +// "ZiSXpF61aZ/tL2MxkKzI5Vnw2aLJE2ln2FMHAtKc9Co=" +// ] +// } +// +// Success code: +// HTTP_OK (200) +// +// Error codes: +// HTTP_BAD_REQUEST (400) +// HTTP_CONFLICT (409) +// HTTP_INTERNAL_SERVER_ERROR (500) +// +// Response body: +// {Empty} + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { +namespace payment { + +using PostCredentialsCallback = std::function; + +class PostCredentials { + public: + explicit PostCredentials(bat_ledger::LedgerImpl* ledger); + ~PostCredentials(); + + void Request( + const std::string& order_id, + const std::string& item_id, + const std::string& type, + std::unique_ptr blinded_creds, + PostCredentialsCallback callback); + + private: + std::string GetUrl(const std::string& order_id); + + std::string GeneratePayload( + const std::string& item_id, + const std::string& type, + std::unique_ptr blinded_creds); + + ledger::Result CheckStatusCode(const int status_code); + + void OnRequest( + const ledger::UrlResponse& response, + PostCredentialsCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_POST_CREDENTIALS_POST_CREDENTIALS_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials_unittest.cc new file mode 100644 index 0000000000000..f98d19a19310d --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_credentials/post_credentials_unittest.cc @@ -0,0 +1,197 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include +#include +#include + +#include "base/test/task_environment.h" +#include "bat/ledger/internal/endpoint/payment/post_credentials/post_credentials.h" +#include "bat/ledger/internal/ledger_client_mock.h" +#include "bat/ledger/internal/ledger_impl_mock.h" +#include "bat/ledger/ledger.h" +#include "net/http/http_status_code.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=PostCredentialsTest.* + +using ::testing::_; +using ::testing::Invoke; + +namespace ledger { +namespace endpoint { +namespace payment { + +class PostCredentialsTest : public testing::Test { + private: + base::test::TaskEnvironment scoped_task_environment_; + + protected: + std::unique_ptr mock_ledger_client_; + std::unique_ptr mock_ledger_impl_; + std::unique_ptr creds_; + + PostCredentialsTest() { + mock_ledger_client_ = std::make_unique(); + mock_ledger_impl_ = + std::make_unique(mock_ledger_client_.get()); + creds_ = std::make_unique(mock_ledger_impl_.get()); + } +}; + +TEST_F(PostCredentialsTest, ServerOK) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 200; + response.url = url; + response.body = R"({})"; + callback(response); + })); + + auto blinded = std::make_unique(); + blinded->Append(base::Value("asfeq4gerg34gl3g34lg34g")); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + "single-use", + std::move(blinded), + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_OK); + }); +} + +TEST_F(PostCredentialsTest, ServerError400) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 400; + response.url = url; + response.body = ""; + callback(response); + })); + + auto blinded = std::make_unique(); + blinded->Append(base::Value("asfeq4gerg34gl3g34lg34g")); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + "single-use", + std::move(blinded), + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostCredentialsTest, ServerError409) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 409; + response.url = url; + response.body = ""; + callback(response); + })); + + auto blinded = std::make_unique(); + blinded->Append(base::Value("asfeq4gerg34gl3g34lg34g")); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + "single-use", + std::move(blinded), + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostCredentialsTest, ServerError500) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 500; + response.url = url; + response.body = ""; + callback(response); + })); + + auto blinded = std::make_unique(); + blinded->Append(base::Value("asfeq4gerg34gl3g34lg34g")); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + "single-use", + std::move(blinded), + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostCredentialsTest, ServerErrorRandom) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 453; + response.url = url; + response.body = ""; + callback(response); + })); + + auto blinded = std::make_unique(); + blinded->Append(base::Value("asfeq4gerg34gl3g34lg34g")); + + creds_->Request( + "pl2okf23-f2f02kf2fm2-msdkfsodkfds", + "ff50981d-47de-4210-848d-995e186901a1", + "single-use", + std::move(blinded), + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.cc new file mode 100644 index 0000000000000..92afe41f3da4b --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.cc @@ -0,0 +1,205 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/post_order/post_order.h" + +#include + +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; + +namespace ledger { +namespace endpoint { +namespace payment { + +PostOrder::PostOrder(bat_ledger::LedgerImpl* ledger): + ledger_(ledger) { + DCHECK(ledger_); +} + +PostOrder::~PostOrder() = default; + +std::string PostOrder::GetUrl() { + return GetServerUrl("/v1/orders"); +} + +std::string PostOrder::GeneratePayload( + const std::vector& items) { + base::Value order_items(base::Value::Type::LIST); + for (const auto& item : items) { + base::Value order_item(base::Value::Type::DICTIONARY); + order_item.SetStringKey("sku", item.sku); + order_item.SetIntKey("quantity", item.quantity); + order_items.Append(std::move(order_item)); + } + + base::Value body(base::Value::Type::DICTIONARY); + body.SetKey("items", std::move(order_items)); + + std::string json; + base::JSONWriter::Write(body, &json); + + return json; +} + +ledger::Result PostOrder::CheckStatusCode(const int status_code) { + if (status_code == net::HTTP_BAD_REQUEST) { + BLOG(0, "Invalid request"); + return ledger::Result::RETRY_SHORT; + } + + if (status_code == net::HTTP_INTERNAL_SERVER_ERROR) { + BLOG(0, "Internal server error"); + return ledger::Result::RETRY_SHORT; + } + + if (status_code != net::HTTP_CREATED) { + return ledger::Result::LEDGER_ERROR; + } + + return ledger::Result::LEDGER_OK; +} + +ledger::Result PostOrder::ParseBody( + const std::string& body, + const std::vector& order_items, + ledger::SKUOrder* order) { + DCHECK(order); + + base::Optional dictionary = base::JSONReader::Read(body); + if (!dictionary || !dictionary->is_dict()) { + BLOG(0, "Invalid JSON"); + return ledger::Result::LEDGER_ERROR; + } + + const auto* id = dictionary->FindStringKey("id"); + if (id) { + order->order_id = *id; + } + + if (order->order_id.empty()) { + BLOG(0, "Order id empty"); + return ledger::Result::LEDGER_ERROR; + } + + const auto* total_amount = dictionary->FindStringKey("totalPrice"); + if (total_amount) { + const bool success = + base::StringToDouble(*total_amount, &order->total_amount); + if (!success) { + order->total_amount = 0.0; + } + } + + const auto* merchant_id = dictionary->FindStringKey("merchantId"); + if (merchant_id) { + order->merchant_id = *merchant_id; + } + + const auto* location = dictionary->FindStringKey("location"); + if (location) { + order->location = *location; + } + + order->status = ledger::SKUOrderStatus::PENDING; + + auto* items = dictionary->FindListKey("items"); + if (!items) { + return ledger::Result::LEDGER_OK; + } + + if (items->GetList().size() != order_items.size()) { + BLOG(0, "Invalid JSON"); + return ledger::Result::LEDGER_ERROR; + } + + int count = 0; + for (auto& item : items->GetList()) { + auto order_item = ledger::SKUOrderItem::New(); + order_item->order_id = order->order_id; + order_item->sku = order_items[count].sku; + order_item->type = order_items[count].type; + + const auto* id = item.FindStringKey("id"); + if (id) { + order_item->order_item_id = *id; + } + + const auto quantity = item.FindIntKey("quantity"); + if (quantity) { + order_item->quantity = *quantity; + } + + const auto* price = item.FindStringKey("price"); + if (price) { + const bool success = base::StringToDouble(*price, &order_item->price); + if (!success) { + order_item->price = 0.0; + } + } + + const auto* name = item.FindStringKey("name"); + if (name) { + order_item->name = *name; + } + + const auto* description = item.FindStringKey("description"); + if (description) { + order_item->description = *description; + } + + order->items.push_back(std::move(order_item)); + + count++; + } + + return ledger::Result::LEDGER_OK; +} + +void PostOrder::Request( + const std::vector& items, + PostOrderCallback callback) { + auto url_callback = std::bind(&PostOrder::OnRequest, + this, + _1, + items, + callback); + ledger_->LoadURL( + GetUrl(), + {}, + GeneratePayload(items), + "application/json; charset=utf-8", + ledger::UrlMethod::POST, + url_callback); +} + +void PostOrder::OnRequest( + const ledger::UrlResponse& response, + const std::vector& items, + PostOrderCallback callback) { + ledger::LogUrlResponse(__func__, response); + + ledger::Result result = CheckStatusCode(response.status_code); + + if (result != ledger::Result::LEDGER_OK) { + callback(result, nullptr); + return; + } + + auto order = ledger::SKUOrder::New(); + result = ParseBody(response.body, items, order.get()); + callback(result, std::move(order)); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.h new file mode 100644 index 0000000000000..ff5061cbd95d3 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order.h @@ -0,0 +1,104 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_POST_ORDER_POST_ORDER_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_POST_ORDER_POST_ORDER_H_ + +#include +#include + +#include "bat/ledger/ledger.h" + +// POST /v1/orders +// +// Request body: +// { +// "items": [ +// { +// "sku": "okasofkasofdkasofkoasdkf", +// "quantity": 5 +// } +// ] +// } +// +// Success code: +// HTTP_CREATED (201) +// +// Error codes: +// HTTP_BAD_REQUEST (400) +// HTTP_INTERNAL_SERVER_ERROR (500) +// +// Response body: +// { +// "id": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "createdAt": "2020-06-10T18:58:21.378752Z", +// "currency": "BAT", +// "updatedAt": "2020-06-10T18:58:21.378752Z", +// "totalPrice": "1", +// "location": "brave.com", +// "status": "pending", +// "items": [ +// { +// "id": "9c9aed7f-b349-452e-80a8-95faf2b1600d", +// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "sku": "user-wallet-vote", +// "createdAt": "2020-06-10T18:58:21.378752Z", +// "updatedAt": "2020-06-10T18:58:21.378752Z", +// "currency": "BAT", +// "quantity": 4, +// "price": "0.25", +// "subtotal": "1", +// "location": "brave.com", +// "description": "" +// } +// ] +// } + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { +namespace payment { + +using PostOrderCallback = std::function; + +class PostOrder { + public: + explicit PostOrder(bat_ledger::LedgerImpl* ledger); + ~PostOrder(); + + void Request( + const std::vector& items, + PostOrderCallback callback); + + private: + std::string GetUrl(); + + std::string GeneratePayload(const std::vector& items); + + ledger::Result CheckStatusCode(const int status_code); + + ledger::Result ParseBody( + const std::string& body, + const std::vector& order_items, + ledger::SKUOrder* order); + + void OnRequest( + const ledger::UrlResponse& response, + const std::vector& items, + PostOrderCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_POST_ORDER_POST_ORDER_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order_unittest.cc new file mode 100644 index 0000000000000..0ed4bf35c4616 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order_unittest.cc @@ -0,0 +1,215 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include +#include +#include + +#include "base/test/task_environment.h" +#include "bat/ledger/internal/endpoint/payment/post_order/post_order.h" +#include "bat/ledger/internal/ledger_client_mock.h" +#include "bat/ledger/internal/ledger_impl_mock.h" +#include "bat/ledger/ledger.h" +#include "net/http/http_status_code.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=PostOrderTest.* + +using ::testing::_; +using ::testing::Invoke; + +namespace ledger { +namespace endpoint { +namespace payment { + +class PostOrderTest : public testing::Test { + private: + base::test::TaskEnvironment scoped_task_environment_; + + protected: + std::unique_ptr mock_ledger_client_; + std::unique_ptr mock_ledger_impl_; + std::unique_ptr order_; + + PostOrderTest() { + mock_ledger_client_ = std::make_unique(); + mock_ledger_impl_ = + std::make_unique(mock_ledger_client_.get()); + order_ = std::make_unique(mock_ledger_impl_.get()); + } +}; + +TEST_F(PostOrderTest, ServerOK) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 201; + response.url = url; + response.body = R"({ + "id": "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "createdAt": "2020-06-10T18:58:21.378752Z", + "currency": "BAT", + "updatedAt": "2020-06-10T18:58:21.378752Z", + "totalPrice": "1", + "merchantId": "", + "location": "brave.com", + "status": "pending", + "items": [ + { + "id": "9c9aed7f-b349-452e-80a8-95faf2b1600d", + "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "sku": "user-wallet-vote", + "createdAt": "2020-06-10T18:58:21.378752Z", + "updatedAt": "2020-06-10T18:58:21.378752Z", + "currency": "BAT", + "quantity": 4, + "price": "0.25", + "subtotal": "1", + "location": "brave.com", + "description": "" + } + ] + })"; + callback(response); + })); + + ledger::SKUOrderItem item; + item.quantity = 4; + item.sku = "asdfasfasfdsdf"; + item.type = ledger::SKUOrderItemType::SINGLE_USE; + std::vector items; + items.push_back(item); + + order_->Request( + items, + [](const ledger::Result result, ledger::SKUOrderPtr order) { + auto expected_order_item = ledger::SKUOrderItem::New(); + expected_order_item->order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + expected_order_item->sku = "asdfasfasfdsdf"; + expected_order_item->type = ledger::SKUOrderItemType::SINGLE_USE; + expected_order_item->order_item_id = + "9c9aed7f-b349-452e-80a8-95faf2b1600d"; + expected_order_item->quantity = 4; + expected_order_item->price = 0.25; + + ledger::SKUOrder expected_order; + expected_order.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + expected_order.total_amount = 1; + expected_order.location = "brave.com"; + expected_order.status = ledger::SKUOrderStatus::PENDING; + expected_order.items.push_back(std::move(expected_order_item)); + + EXPECT_EQ(result, ledger::Result::LEDGER_OK); + EXPECT_TRUE(expected_order.Equals(*order)); + }); +} + +TEST_F(PostOrderTest, ServerError400) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 400; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUOrderItem item; + item.quantity = 4; + item.sku = "asdfasfasfdsdf"; + item.type = ledger::SKUOrderItemType::SINGLE_USE; + std::vector items; + items.push_back(item); + + order_->Request( + items, + [](const ledger::Result result, ledger::SKUOrderPtr order) { + EXPECT_EQ(result, ledger::Result::RETRY_SHORT); + EXPECT_TRUE(!order); + }); +} + +TEST_F(PostOrderTest, ServerError500) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 500; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUOrderItem item; + item.quantity = 4; + item.sku = "asdfasfasfdsdf"; + item.type = ledger::SKUOrderItemType::SINGLE_USE; + std::vector items; + items.push_back(item); + + order_->Request( + items, + [](const ledger::Result result, ledger::SKUOrderPtr order) { + EXPECT_EQ(result, ledger::Result::RETRY_SHORT); + EXPECT_TRUE(!order); + }); +} + +TEST_F(PostOrderTest, ServerErrorRandom) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 453; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUOrderItem item; + item.quantity = 4; + item.sku = "asdfasfasfdsdf"; + item.type = ledger::SKUOrderItemType::SINGLE_USE; + std::vector items; + items.push_back(item); + + order_->Request( + items, + [](const ledger::Result result, ledger::SKUOrderPtr order) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + EXPECT_TRUE(!order); + }); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.cc new file mode 100644 index 0000000000000..18a75d6e62a14 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.cc @@ -0,0 +1,140 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h" + +#include + +#include "base/base64.h" +#include "base/json/json_writer.h" +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "bat/ledger/internal/request/request_util.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; + +namespace ledger { +namespace endpoint { +namespace payment { + +PostTransactionAnon::PostTransactionAnon(bat_ledger::LedgerImpl* ledger): + ledger_(ledger) { + DCHECK(ledger_); +} + +PostTransactionAnon::~PostTransactionAnon() = default; + +std::string PostTransactionAnon::GetUrl(const std::string& order_id) { + const std::string path = base::StringPrintf( + "/v1/orders/%s/transactions/anonymousCard", + order_id.c_str()); + + return GetServerUrl(path); +} + +std::string PostTransactionAnon::GeneratePayload( + const double amount, + const std::string& order_id, + const std::string& destination) { + base::Value denomination(base::Value::Type::DICTIONARY); + denomination.SetStringKey("amount", base::StringPrintf("%g", amount)); + denomination.SetStringKey("currency", "BAT"); + + base::Value octets(base::Value::Type::DICTIONARY); + octets.SetKey("denomination", std::move(denomination)); + octets.SetStringKey("destination", destination); + + std::string octets_json; + base::JSONWriter::Write(octets, &octets_json); + + const auto sign_headers = braveledger_request_util::GetSignHeaders( + order_id, + octets_json, + "primary", + ledger_->state()->GetRecoverySeed(), + true); + + base::Value headers(base::Value::Type::DICTIONARY); + headers.SetStringKey("digest", sign_headers.at("digest")); + headers.SetStringKey("idempotency-key", order_id); + headers.SetStringKey("signature", sign_headers.at("signature")); + + base::Value transaction(base::Value::Type::DICTIONARY); + transaction.SetKey("headers", std::move(headers)); + transaction.SetStringKey("octets", octets_json); + + std::string transaction_json; + base::JSONWriter::Write(transaction, &transaction_json); + std::string transaction_base64; + base::Base64Encode(transaction_json, &transaction_base64); + + base::Value body(base::Value::Type::DICTIONARY); + body.SetStringKey("paymentId", ledger_->state()->GetPaymentId()); + body.SetStringKey("kind", "anonymous-card"); + body.SetStringKey("transaction", transaction_base64); + + std::string json; + base::JSONWriter::Write(body, &json); + return json; +} + +ledger::Result PostTransactionAnon::CheckStatusCode(const int status_code) { + if (status_code == net::HTTP_BAD_REQUEST) { + BLOG(0, "Invalid request"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code == net::HTTP_NOT_FOUND) { + BLOG(0, "Unrecognized transaction suffix"); + return ledger::Result::NOT_FOUND; + } + + if (status_code == net::HTTP_CONFLICT) { + BLOG(0, "External transaction id already submitted"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code == net::HTTP_INTERNAL_SERVER_ERROR) { + BLOG(0, "Internal server error"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code != net::HTTP_CREATED) { + return ledger::Result::LEDGER_ERROR; + } + + return ledger::Result::LEDGER_OK; +} + +void PostTransactionAnon::Request( + const double amount, + const std::string& order_id, + const std::string& destination, + PostTransactionAnonCallback callback) { + auto url_callback = std::bind(&PostTransactionAnon::OnRequest, + this, + _1, + callback); + ledger_->LoadURL( + GetUrl(order_id), + {}, + GeneratePayload(amount, order_id, destination), + "application/json; charset=utf-8", + ledger::UrlMethod::POST, + url_callback); +} + +void PostTransactionAnon::OnRequest( + const ledger::UrlResponse& response, + PostTransactionAnonCallback callback) { + ledger::LogUrlResponse(__func__, response); + callback(CheckStatusCode(response.status_code)); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h new file mode 100644 index 0000000000000..aa5f5a9c7357d --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_POST_TRANSACTION_ANON_\ +POST_TRANSACTION_ANON_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_POST_TRANSACTION_ANON_\ +POST_TRANSACTION_ANON_H_ + +#include + +#include "bat/ledger/ledger.h" + +// POST /v1/orders/{order_id}/transactions/anonymousCard +// +// Request body: +// { +// "paymentId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "kind": "anonymous-card", +// "transaction": "base64_string" +// } +// +// Success code: +// HTTP_CREATED (201) +// +// Error codes: +// HTTP_BAD_REQUEST (400) +// HTTP_NOT_FOUND (404) +// HTTP_CONFLICT (409) +// HTTP_INTERNAL_SERVER_ERROR (500) +// +// Response body: +// { +// "id": "80740e9c-08c3-43ed-92aa-2a7be8352000", +// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "createdAt": "2020-06-10T18:58:22.817675Z", +// "updatedAt": "2020-06-10T18:58:22.817675Z", +// "external_transaction_id": "d382d3ae-8462-4b2c-9b60-b669539f41b2", +// "status": "completed", +// "currency": "BAT", +// "kind": "uphold", +// "amount": "1" +// } + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { +namespace payment { + +using PostTransactionAnonCallback = std::function; + +class PostTransactionAnon { + public: + explicit PostTransactionAnon(bat_ledger::LedgerImpl* ledger); + ~PostTransactionAnon(); + + void Request( + const double amount, + const std::string& order_id, + const std::string& destination, + PostTransactionAnonCallback callback); + + private: + std::string GetUrl(const std::string& order_id); + + std::string GeneratePayload( + const double amount, + const std::string& order_id, + const std::string& destination); + + ledger::Result CheckStatusCode(const int status_code); + + void OnRequest( + const ledger::UrlResponse& response, + PostTransactionAnonCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_POST_TRANSACTION_ANON_\ +// POST_TRANSACTION_ANON_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon_unittest.cc new file mode 100644 index 0000000000000..34edf0bda144b --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_anon/post_transaction_anon_unittest.cc @@ -0,0 +1,216 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include +#include +#include + +#include "base/test/task_environment.h" +#include "bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h" +#include "bat/ledger/internal/ledger_client_mock.h" +#include "bat/ledger/internal/ledger_impl_mock.h" +#include "bat/ledger/internal/state/state_keys.h" +#include "bat/ledger/ledger.h" +#include "net/http/http_status_code.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=PostTransactionAnonTest.* + +using ::testing::_; +using ::testing::Invoke; + +namespace ledger { +namespace endpoint { +namespace payment { + +class PostTransactionAnonTest : public testing::Test { + private: + base::test::TaskEnvironment scoped_task_environment_; + + protected: + std::unique_ptr mock_ledger_client_; + std::unique_ptr mock_ledger_impl_; + std::unique_ptr transaction_; + + PostTransactionAnonTest() { + mock_ledger_client_ = std::make_unique(); + mock_ledger_impl_ = + std::make_unique(mock_ledger_client_.get()); + transaction_ = + std::make_unique(mock_ledger_impl_.get()); + } + + void SetUp() override { + const std::string payment_id = "this_is_id"; + ON_CALL(*mock_ledger_client_, GetStringState(ledger::kStatePaymentId)) + .WillByDefault(testing::Return(payment_id)); + + const std::string wallet_passphrase = + "AN6DLuI2iZzzDxpzywf+IKmK1nzFRarNswbaIDI3pQg="; + ON_CALL(*mock_ledger_client_, GetStringState(ledger::kStateRecoverySeed)) + .WillByDefault(testing::Return(wallet_passphrase)); + } +}; + +TEST_F(PostTransactionAnonTest, ServerOK) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 201; + response.url = url; + response.body = R"({})"; + callback(response); + })); + + transaction_->Request( + 20.0, + "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "d382d3ae-8462-4b2c-9b60-b669539f41b2", + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_OK); + }); +} + +TEST_F(PostTransactionAnonTest, ServerError400) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 400; + response.url = url; + response.body = ""; + callback(response); + })); + + transaction_->Request( + 20.0, + "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "d382d3ae-8462-4b2c-9b60-b669539f41b2", + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostTransactionAnonTest, ServerError404) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 404; + response.url = url; + response.body = ""; + callback(response); + })); + + transaction_->Request( + 20.0, + "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "d382d3ae-8462-4b2c-9b60-b669539f41b2", + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::NOT_FOUND); + }); +} + +TEST_F(PostTransactionAnonTest, ServerError409) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 409; + response.url = url; + response.body = ""; + callback(response); + })); + + transaction_->Request( + 20.0, + "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "d382d3ae-8462-4b2c-9b60-b669539f41b2", + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostTransactionAnonTest, ServerError500) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 500; + response.url = url; + response.body = ""; + callback(response); + })); + + transaction_->Request( + 20.0, + "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "d382d3ae-8462-4b2c-9b60-b669539f41b2", + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostTransactionAnonTest, ServerErrorRandom) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 453; + response.url = url; + response.body = ""; + callback(response); + })); + + transaction_->Request( + 20.0, + "f2e6494e-fb21-44d1-90e9-b5408799acd8", + "d382d3ae-8462-4b2c-9b60-b669539f41b2", + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.cc new file mode 100644 index 0000000000000..cf244c47c5fb1 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.cc @@ -0,0 +1,103 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h" + +#include + +#include "base/json/json_writer.h" +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; + +namespace ledger { +namespace endpoint { +namespace payment { + +PostTransactionUphold::PostTransactionUphold(bat_ledger::LedgerImpl* ledger): + ledger_(ledger) { + DCHECK(ledger_); +} + +PostTransactionUphold::~PostTransactionUphold() = default; + +std::string PostTransactionUphold::GetUrl(const std::string& order_id) { + const std::string path = base::StringPrintf( + "/v1/orders/%s/transactions/uphold", + order_id.c_str()); + + return GetServerUrl(path); +} + +std::string PostTransactionUphold::GeneratePayload( + const ledger::SKUTransaction& transaction) { + base::Value body(base::Value::Type::DICTIONARY); + body.SetStringKey( + "externalTransactionId", + transaction.external_transaction_id); + body.SetStringKey("kind", "uphold"); + + std::string json; + base::JSONWriter::Write(body, &json); + return json; +} + +ledger::Result PostTransactionUphold::CheckStatusCode(const int status_code) { + if (status_code == net::HTTP_BAD_REQUEST) { + BLOG(0, "Invalid request"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code == net::HTTP_NOT_FOUND) { + BLOG(0, "Unrecognized transaction suffix"); + return ledger::Result::NOT_FOUND; + } + + if (status_code == net::HTTP_CONFLICT) { + BLOG(0, "External transaction id already submitted"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code == net::HTTP_INTERNAL_SERVER_ERROR) { + BLOG(0, "Internal server error"); + return ledger::Result::LEDGER_ERROR; + } + + if (status_code != net::HTTP_CREATED) { + return ledger::Result::LEDGER_ERROR; + } + + return ledger::Result::LEDGER_OK; +} + +void PostTransactionUphold::Request( + const ledger::SKUTransaction& transaction, + PostTransactionUpholdCallback callback) { + auto url_callback = std::bind(&PostTransactionUphold::OnRequest, + this, + _1, + callback); + ledger_->LoadURL( + GetUrl(transaction.order_id), + {}, + GeneratePayload(transaction), + "application/json; charset=utf-8", + ledger::UrlMethod::POST, + url_callback); +} + +void PostTransactionUphold::OnRequest( + const ledger::UrlResponse& response, + PostTransactionUpholdCallback callback) { + ledger::LogUrlResponse(__func__, response); + callback(CheckStatusCode(response.status_code)); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h new file mode 100644 index 0000000000000..75ad91dbbc537 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h @@ -0,0 +1,84 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_POST_TRANSACTION_UPHOLD_\ +POST_TRANSACTION_UPHOLD_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_POST_TRANSACTION_UPHOLD_\ +POST_TRANSACTION_UPHOLD_H_ + +#include + +#include "bat/ledger/ledger.h" + +// POST /v1/orders/{order_id}/transactions/uphold +// +// Request body: +// { +// "externalTransactionId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "kind": "uphold" +// } +// +// Success code: +// HTTP_CREATED (201) +// +// Error codes: +// HTTP_BAD_REQUEST (400) +// HTTP_NOT_FOUND (404) +// HTTP_CONFLICT (409) +// HTTP_INTERNAL_SERVER_ERROR (500) +// +// Response body: +// { +// "id": "80740e9c-08c3-43ed-92aa-2a7be8352000", +// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", +// "createdAt": "2020-06-10T18:58:22.817675Z", +// "updatedAt": "2020-06-10T18:58:22.817675Z", +// "external_transaction_id": "d382d3ae-8462-4b2c-9b60-b669539f41b2", +// "status": "completed", +// "currency": "BAT", +// "kind": "uphold", +// "amount": "1" +// } + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { +namespace payment { + +using PostTransactionUpholdCallback = std::function; + +class PostTransactionUphold { + public: + explicit PostTransactionUphold(bat_ledger::LedgerImpl* ledger); + ~PostTransactionUphold(); + + void Request( + const ledger::SKUTransaction& transaction, + PostTransactionUpholdCallback callback); + + private: + std::string GetUrl(const std::string& order_id); + + std::string GeneratePayload(const ledger::SKUTransaction& transaction); + + ledger::Result CheckStatusCode(const int status_code); + + void OnRequest( + const ledger::UrlResponse& response, + PostTransactionUpholdCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_POST_TRANSACTION_UPHOLD_\ +// POST_TRANSACTION_UPHOLD_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold_unittest.cc new file mode 100644 index 0000000000000..d323dc119cb26 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold_unittest.cc @@ -0,0 +1,203 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include +#include +#include + +#include "base/test/task_environment.h" +#include "bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold.h" +#include "bat/ledger/internal/ledger_client_mock.h" +#include "bat/ledger/internal/ledger_impl_mock.h" +#include "bat/ledger/ledger.h" +#include "net/http/http_status_code.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=PostTransactionUpholdTest.* + +using ::testing::_; +using ::testing::Invoke; + +namespace ledger { +namespace endpoint { +namespace payment { + +class PostTransactionUpholdTest : public testing::Test { + private: + base::test::TaskEnvironment scoped_task_environment_; + + protected: + std::unique_ptr mock_ledger_client_; + std::unique_ptr mock_ledger_impl_; + std::unique_ptr order_; + + PostTransactionUpholdTest() { + mock_ledger_client_ = std::make_unique(); + mock_ledger_impl_ = + std::make_unique(mock_ledger_client_.get()); + order_ = std::make_unique(mock_ledger_impl_.get()); + } +}; + +TEST_F(PostTransactionUpholdTest, ServerOK) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 201; + response.url = url; + response.body = R"({})"; + callback(response); + })); + + ledger::SKUTransaction transaction; + transaction.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + transaction.external_transaction_id = "d382d3ae-8462-4b2c-9b60-b669539f41b2"; + + order_->Request(transaction, [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_OK); + }); +} + +TEST_F(PostTransactionUpholdTest, ServerError400) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 400; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUTransaction transaction; + transaction.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + transaction.external_transaction_id = "d382d3ae-8462-4b2c-9b60-b669539f41b2"; + + order_->Request(transaction, [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostTransactionUpholdTest, ServerError404) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 404; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUTransaction transaction; + transaction.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + transaction.external_transaction_id = "d382d3ae-8462-4b2c-9b60-b669539f41b2"; + + order_->Request(transaction, [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::NOT_FOUND); + }); +} + +TEST_F(PostTransactionUpholdTest, ServerError409) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 409; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUTransaction transaction; + transaction.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + transaction.external_transaction_id = "d382d3ae-8462-4b2c-9b60-b669539f41b2"; + + order_->Request(transaction, [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostTransactionUpholdTest, ServerError500) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 500; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUTransaction transaction; + transaction.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + transaction.external_transaction_id = "d382d3ae-8462-4b2c-9b60-b669539f41b2"; + + order_->Request(transaction, [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +TEST_F(PostTransactionUpholdTest, ServerErrorRandom) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 453; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::SKUTransaction transaction; + transaction.order_id = "f2e6494e-fb21-44d1-90e9-b5408799acd8"; + transaction.external_transaction_id = "d382d3ae-8462-4b2c-9b60-b669539f41b2"; + + order_->Request(transaction, [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.cc new file mode 100644 index 0000000000000..51918ce7e1710 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.cc @@ -0,0 +1,109 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/endpoint/payment/post_votes/post_votes.h" + +#include + +#include "base/base64.h" +#include "base/json/json_writer.h" +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/credentials/credentials_util.h" +#include "bat/ledger/internal/endpoint/payment/payment_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; + +namespace ledger { +namespace endpoint { +namespace payment { + +PostVotes::PostVotes(bat_ledger::LedgerImpl* ledger): + ledger_(ledger) { + DCHECK(ledger_); +} + +PostVotes::~PostVotes() = default; + +std::string PostVotes::GetUrl() { + return GetServerUrl("/v1/votes"); +} + +std::string PostVotes::GeneratePayload( + const braveledger_credentials::CredentialsRedeem& redeem) { + base::Value data(base::Value::Type::DICTIONARY); + data.SetStringKey( + "type", + braveledger_credentials::ConvertRewardTypeToString(redeem.type)); + if (!redeem.order_id.empty()) { + data.SetStringKey("orderId", redeem.order_id); + } + data.SetStringKey("channel", redeem.publisher_key); + + std::string data_json; + base::JSONWriter::Write(data, &data_json); + std::string data_encoded; + base::Base64Encode(data_json, &data_encoded); + + base::Value credentials(base::Value::Type::LIST); + braveledger_credentials::GenerateCredentials( + redeem.token_list, + data_encoded, + &credentials); + + base::Value payload(base::Value::Type::DICTIONARY); + payload.SetStringKey("vote", data_encoded); + payload.SetKey("credentials", std::move(credentials)); + + std::string json; + base::JSONWriter::Write(payload, &json); + return json; +} + +ledger::Result PostVotes::CheckStatusCode(const int status_code) { + if (status_code == net::HTTP_BAD_REQUEST) { + BLOG(0, "Invalid request"); + return ledger::Result::RETRY_SHORT; + } + + if (status_code == net::HTTP_INTERNAL_SERVER_ERROR) { + BLOG(0, "Internal server error"); + return ledger::Result::RETRY_SHORT; + } + + if (status_code != net::HTTP_OK) { + return ledger::Result::LEDGER_ERROR; + } + + return ledger::Result::LEDGER_OK; +} + +void PostVotes::Request( + const braveledger_credentials::CredentialsRedeem& redeem, + PostVotesCallback callback) { + auto url_callback = std::bind(&PostVotes::OnRequest, + this, + _1, + callback); + ledger_->LoadURL( + GetUrl(), + {}, + GeneratePayload(redeem), + "application/json; charset=utf-8", + ledger::UrlMethod::POST, + url_callback); +} + +void PostVotes::OnRequest( + const ledger::UrlResponse& response, + PostVotesCallback callback) { + ledger::LogUrlResponse(__func__, response); + callback(CheckStatusCode(response.status_code)); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.h b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.h new file mode 100644 index 0000000000000..5fb2dd4acc7b1 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes.h @@ -0,0 +1,76 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_ENDPOINT_PAYMENT_POST_VOTES_POST_VOTES_H_ +#define BRAVELEDGER_ENDPOINT_PAYMENT_POST_VOTES_POST_VOTES_H_ + +#include + +#include "bat/ledger/internal/credentials/credentials_redeem.h" +#include "bat/ledger/ledger.h" + +// POST /v1/votes +// +// Request body: +// { +// "credentials": [ +// { +// "t": "", +// "publicKey": "", +// "signature": "" +// } +// ], +// "vote": "base64_string" +// } +// +// Success code: +// HTTP_CREATED (200) +// +// Error codes: +// HTTP_BAD_REQUEST (400) +// HTTP_INTERNAL_SERVER_ERROR (500) +// +// Response body: +// {Empty} + +namespace bat_ledger { +class LedgerImpl; +} + +namespace ledger { +namespace endpoint { +namespace payment { + +using PostVotesCallback = std::function; + +class PostVotes { + public: + explicit PostVotes(bat_ledger::LedgerImpl* ledger); + ~PostVotes(); + + void Request( + const braveledger_credentials::CredentialsRedeem& redeem, + PostVotesCallback callback); + + private: + std::string GetUrl(); + + std::string GeneratePayload( + const braveledger_credentials::CredentialsRedeem& redeem); + + ledger::Result CheckStatusCode(const int status_code); + + void OnRequest( + const ledger::UrlResponse& response, + PostVotesCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace payment +} // namespace endpoint +} // namespace ledger + +#endif // BRAVELEDGER_ENDPOINT_PAYMENT_POST_VOTES_POST_VOTES_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes_unittest.cc new file mode 100644 index 0000000000000..fcf2a874f5094 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes_unittest.cc @@ -0,0 +1,191 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include +#include +#include +#include + +#include "base/test/task_environment.h" +#include "bat/ledger/internal/endpoint/payment/post_votes/post_votes.h" +#include "bat/ledger/internal/ledger_client_mock.h" +#include "bat/ledger/internal/ledger_impl_mock.h" +#include "bat/ledger/ledger.h" +#include "net/http/http_status_code.h" +#include "testing/gtest/include/gtest/gtest.h" + +// npm run test -- brave_unit_tests --filter=PostVotesTest.* + +using ::testing::_; +using ::testing::Invoke; + +namespace ledger { +namespace endpoint { +namespace payment { + +class PostVotesTest : public testing::Test { + private: + base::test::TaskEnvironment scoped_task_environment_; + + protected: + std::unique_ptr mock_ledger_client_; + std::unique_ptr mock_ledger_impl_; + std::unique_ptr votes_; + + PostVotesTest() { + mock_ledger_client_ = std::make_unique(); + mock_ledger_impl_ = + std::make_unique(mock_ledger_client_.get()); + votes_ = std::make_unique(mock_ledger_impl_.get()); + } +}; + +TEST_F(PostVotesTest, ServerOK) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 200; + response.url = url; + response.body = R"({})"; + callback(response); + })); + + ledger::UnblindedToken token; + token.token_value = "s1OrSZUvo/33u3Y866mQaG/b6d94TqMThLal4+DSX4UrR4jT+GtTErim+FtEyZ7nebNGRoUDxObiUni9u8BB0DIT2aya6rYWko64IrXJWpbf0SVHnQFVYNyX64NjW9R6"; // NOLINT + token.public_key = "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I="; + + braveledger_credentials::CredentialsRedeem redeem; + redeem.publisher_key = "brave.com"; + redeem.type = ledger::RewardsType::ONE_TIME_TIP; + redeem.processor = ledger::ContributionProcessor::UPHOLD; + redeem.token_list = {token}; + redeem.order_id = "c4645786-052f-402f-8593-56af2f7a21ce"; + redeem.contribution_id = "83b3b77b-e7c3-455b-adda-e476fa0656d2"; + + votes_->Request( + redeem, + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_OK); + }); +} + +TEST_F(PostVotesTest, ServerError400) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 400; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::UnblindedToken token; + token.token_value = "s1OrSZUvo/33u3Y866mQaG/b6d94TqMThLal4+DSX4UrR4jT+GtTErim+FtEyZ7nebNGRoUDxObiUni9u8BB0DIT2aya6rYWko64IrXJWpbf0SVHnQFVYNyX64NjW9R6"; // NOLINT + token.public_key = "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I="; + + braveledger_credentials::CredentialsRedeem redeem; + redeem.publisher_key = "brave.com"; + redeem.type = ledger::RewardsType::ONE_TIME_TIP; + redeem.processor = ledger::ContributionProcessor::UPHOLD; + redeem.token_list = {token}; + redeem.order_id = "c4645786-052f-402f-8593-56af2f7a21ce"; + redeem.contribution_id = "83b3b77b-e7c3-455b-adda-e476fa0656d2"; + + votes_->Request( + redeem, + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::RETRY_SHORT); + }); +} + +TEST_F(PostVotesTest, ServerError500) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 500; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::UnblindedToken token; + token.token_value = "s1OrSZUvo/33u3Y866mQaG/b6d94TqMThLal4+DSX4UrR4jT+GtTErim+FtEyZ7nebNGRoUDxObiUni9u8BB0DIT2aya6rYWko64IrXJWpbf0SVHnQFVYNyX64NjW9R6"; // NOLINT + token.public_key = "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I="; + + braveledger_credentials::CredentialsRedeem redeem; + redeem.publisher_key = "brave.com"; + redeem.type = ledger::RewardsType::ONE_TIME_TIP; + redeem.processor = ledger::ContributionProcessor::UPHOLD; + redeem.token_list = {token}; + redeem.order_id = "c4645786-052f-402f-8593-56af2f7a21ce"; + redeem.contribution_id = "83b3b77b-e7c3-455b-adda-e476fa0656d2"; + + votes_->Request( + redeem, + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::RETRY_SHORT); + }); +} + +TEST_F(PostVotesTest, ServerErrorRandom) { + ON_CALL(*mock_ledger_client_, LoadURL(_, _, _, _, _, _)) + .WillByDefault( + Invoke([]( + const std::string& url, + const std::vector& headers, + const std::string& content, + const std::string& contentType, + const ledger::UrlMethod method, + ledger::LoadURLCallback callback) { + ledger::UrlResponse response; + response.status_code = 453; + response.url = url; + response.body = ""; + callback(response); + })); + + ledger::UnblindedToken token; + token.token_value = "s1OrSZUvo/33u3Y866mQaG/b6d94TqMThLal4+DSX4UrR4jT+GtTErim+FtEyZ7nebNGRoUDxObiUni9u8BB0DIT2aya6rYWko64IrXJWpbf0SVHnQFVYNyX64NjW9R6"; // NOLINT + token.public_key = "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I="; + + braveledger_credentials::CredentialsRedeem redeem; + redeem.publisher_key = "brave.com"; + redeem.type = ledger::RewardsType::ONE_TIME_TIP; + redeem.processor = ledger::ContributionProcessor::UPHOLD; + redeem.token_list = {token}; + redeem.order_id = "c4645786-052f-402f-8593-56af2f7a21ce"; + redeem.contribution_id = "83b3b77b-e7c3-455b-adda-e476fa0656d2"; + + votes_->Request( + redeem, + [](const ledger::Result result) { + EXPECT_EQ(result, ledger::Result::LEDGER_ERROR); + }); +} + +} // namespace payment +} // namespace endpoint +} // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_signed_creds/get_signed_creds.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_signed_creds/get_signed_creds.cc index a4056f5af711e..56d0f3c199ca5 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_signed_creds/get_signed_creds.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_signed_creds/get_signed_creds.cc @@ -34,7 +34,7 @@ using std::placeholders::_1; // "signedCreds": [ // "ijSZoLLG+EnRN916RUQcjiV6c4Wb6ItbnxXBFhz81EQ=", // "dj6glCJ2roHYcTFcXF21IrKx1uT/ptM7SJEdiEE1fG8=", -// "nCF9a4KuASICVC0zrx2wGnllgIUxBMnylpu5SA+oBjI=", +// "nCF9a4KuASICVC0zrx2wGnllgIUxBMnylpu5SA+oBjI=" // ], // "batchProof": "zx0cdJhaB/OdYcUtnyXdi+lsoniN2vRTZ1w0U4D7Mgeu1I7RwB+tYKNgFU", // "publicKey": "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I=" diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions/post_suggestions.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions/post_suggestions.cc index 83979b1787b20..2a8e3b4e57b3f 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions/post_suggestions.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions/post_suggestions.cc @@ -20,7 +20,7 @@ using std::placeholders::_1; // // Request body: // { -// "credentials": credentials": [ +// "credentials": [ // { // "t": "", // "publicKey": "", diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions_claim/post_suggestions_claim.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions_claim/post_suggestions_claim.cc index 180d49ad5e0a6..f4a2c3a1a371d 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions_claim/post_suggestions_claim.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions_claim/post_suggestions_claim.cc @@ -21,7 +21,7 @@ using std::placeholders::_1; // // Request body: // { -// "credentials": credentials": [ +// "credentials": [ // { // "t": "", // "publicKey": "", diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.cc deleted file mode 100644 index dc7704d9aa8b5..0000000000000 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.cc +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "base/strings/stringprintf.h" -#include "bat/ledger/internal/static_values.h" -#include "bat/ledger/internal/request/request_sku.h" -#include "bat/ledger/internal/request/request_util.h" - -namespace { - -std::string GetTransactionSuffix(const ledger::SKUTransactionType type) { - switch (type) { - case ledger::SKUTransactionType::NONE: - case ledger::SKUTransactionType::TOKENS: { - return ""; - } - case ledger::SKUTransactionType::UPHOLD: { - return "uphold"; - } - case ledger::SKUTransactionType::ANONYMOUS_CARD: { - return "anonymousCard"; - } - } -} - -} // namespace - -namespace braveledger_request_util { - -std::string GetCreateOrderURL() { - return BuildUrl("/orders", PREFIX_V1, ServerTypes::kPayments); -} - -std::string GetOrderCredentialsURL( - const std::string& order_id, - const std::string& item_id) { - std::string item_path = ""; - if (!item_id.empty()) { - item_path = base::StringPrintf("/%s", item_id.c_str()); - } - - const std::string path = base::StringPrintf( - "/orders/%s/credentials%s", - order_id.c_str(), - item_path.c_str()); - - return BuildUrl(path, PREFIX_V1, ServerTypes::kPayments); -} - -std::string GetCreateTransactionURL( - const std::string& order_id, - const ledger::SKUTransactionType type) { - const std::string suffix = GetTransactionSuffix(type); - const std::string path = base::StringPrintf( - "/orders/%s/transactions/%s", - order_id.c_str(), - suffix.c_str()); - - return BuildUrl(path, PREFIX_V1, ServerTypes::kPayments); -} - -std::string GetRedeemSKUUrl() { - return BuildUrl("/votes", PREFIX_V1, ServerTypes::kPayments); -} - -} // namespace braveledger_request_util diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.h b/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.h deleted file mode 100644 index 7232535594e99..0000000000000 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_sku.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef BRAVELEDGER_COMMON_REQUEST_SKU_H_ -#define BRAVELEDGER_COMMON_REQUEST_SKU_H_ - -#include - -#include "bat/ledger/mojom_structs.h" - -namespace braveledger_request_util { - -std::string GetCreateOrderURL(); - -std::string GetOrderCredentialsURL( - const std::string& order_id, - const std::string& item_id = ""); - -std::string GetCreateTransactionURL( - const std::string& order_id, - const ledger::SKUTransactionType type); - -std::string GetRedeemSKUUrl(); - -} // namespace braveledger_request_util - -#endif // BRAVELEDGER_COMMON_REQUEST_SKU_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.cc index de630a8933afc..306075e5f2ade 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.cc @@ -2,59 +2,15 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include + +#include "bat/ledger/internal/request/request_util.h" #include "base/strings/stringprintf.h" #include "bat/ledger/ledger.h" -#include "bat/ledger/internal/static_values.h" -#include "bat/ledger/internal/request/request_util.h" #include "bat/ledger/internal/common/security_helper.h" namespace braveledger_request_util { -namespace payment { -const char kDevelopment[] = "https://payment.rewards.brave.software"; -const char kStaging[] = "http://payment.rewards.bravesoftware.com"; -const char kProduction[] = "http://payment.rewards.brave.com"; -} // namespace payment - -std::string BuildPaymentsUrl() { - std::string url; - switch (ledger::_environment) { - case ledger::Environment::DEVELOPMENT: - url = payment::kDevelopment; - break; - case ledger::Environment::STAGING: - url = payment::kStaging; - break; - case ledger::Environment::PRODUCTION: - url = payment::kProduction; - break; - } - - return url; -} - -std::string BuildUrl( - const std::string& path, - const std::string& prefix, - const ServerTypes& server) { - std::string url; - switch (server) { - case ServerTypes::kPayments: { - url = BuildPaymentsUrl(); - break; - } - } - - if (url.empty()) { - NOTREACHED(); - return ""; - } - - return url + prefix + path; -} - std::string SignatureHeaderValue( const std::string& data, const std::string& body, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.h b/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.h index bfb345b428a25..247f608356531 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/request/request_util.h @@ -12,15 +12,6 @@ namespace braveledger_request_util { -enum class ServerTypes { - kPayments -}; - -std::string BuildUrl( - const std::string& path, - const std::string& prefix, - const ServerTypes& server); - std::map GetSignHeaders( const std::string& url, const std::string& body, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.cc deleted file mode 100644 index b280243333c3d..0000000000000 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "bat/ledger/internal/response/response_credentials.h" - -#include - -#include "base/json/json_reader.h" -#include "bat/ledger/internal/logging/logging.h" -#include "net/http/http_status_code.h" - -namespace braveledger_response_util { - -// Request Url: -// GET /v1/promotions/{promotion_id}/claims/{claim_id} -// GET /v1/orders/{order_id}/credentials -// GET /v1/orders/{order_id}/credentials/{item_path} -// -// Success: -// OK (200) -// -// Response Format (success): -// { -// "id": "9c9aed7f-b349-452e-80a8-95faf2b1600d", -// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", -// "issuerId": "138bf9ca-69fe-4540-9ac4-bc65baddc4a0", -// "signedCreds": [ -// "ijSZoLLG+EnRN916RUQcjiV6c4Wb6ItbnxXBFhz81EQ=", -// "dj6glCJ2roHYcTFcXF21IrKx1uT/ptM7SJEdiEE1fG8=", -// "nCF9a4KuASICVC0zrx2wGnllgIUxBMnylpu5SA+oBjI=", -// ], -// "batchProof": "zx0cdJhaB/OdYcUtnyXdi+lsoniN2vRTZ1w0U4D7Mgeu1I7RwB+tYKNgFU", -// "publicKey": "dvpysTSiJdZUPihius7pvGOfngRWfDiIbrowykgMi1I=" -// } -// -// Response Format (error): -// { -// "message": "Claim has been accepted but is not ready", -// "code": 202, -// "data": {} -// } - -ledger::Result ParseSignedCreds( - const ledger::UrlResponse& response, - base::Value* result) { - DCHECK(result); - - // Accepted (202) - if (response.status_code == net::HTTP_ACCEPTED) { - return ledger::Result::RETRY_SHORT; - } - - // Bad Request (400) - if (response.status_code == net::HTTP_BAD_REQUEST) { - BLOG(0, "Invalid request"); - return ledger::Result::LEDGER_ERROR; - } - - // Not Found (404) - if (response.status_code == net::HTTP_NOT_FOUND) { - BLOG(0, "Unrecognized claim id"); - return ledger::Result::NOT_FOUND; - } - - // Internal Server Error (500) - if (response.status_code == net::HTTP_INTERNAL_SERVER_ERROR) { - BLOG(0, "Internal server error"); - return ledger::Result::LEDGER_ERROR; - } - - if (response.status_code != net::HTTP_OK) { - return ledger::Result::LEDGER_ERROR; - } - - base::Optional value = base::JSONReader::Read(response.body); - if (!value || !value->is_dict()) { - BLOG(0, "Invalid JSON"); - return ledger::Result::LEDGER_ERROR; - } - - base::DictionaryValue* dictionary = nullptr; - if (!value->GetAsDictionary(&dictionary)) { - BLOG(0, "Invalid JSON"); - return ledger::Result::LEDGER_ERROR; - } - - auto* batch_proof = dictionary->FindStringKey("batchProof"); - if (!batch_proof) { - BLOG(0, "Missing batch proof"); - return ledger::Result::LEDGER_ERROR; - } - - auto* signed_creds = dictionary->FindListKey("signedCreds"); - if (!signed_creds) { - BLOG(0, "Missing signed creds"); - return ledger::Result::LEDGER_ERROR; - } - - auto* public_key = dictionary->FindStringKey("publicKey"); - if (!public_key) { - BLOG(0, "Missing public key"); - return ledger::Result::LEDGER_ERROR; - } - - result->SetStringKey("batch_proof", *batch_proof); - result->SetStringKey("public_key", *public_key); - result->SetKey("signed_creds", base::Value(signed_creds->GetList())); - - return ledger::Result::LEDGER_OK; -} - -} // namespace braveledger_response_util diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.h b/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.h deleted file mode 100644 index 9834ce5e671d2..0000000000000 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_credentials.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef BRAVELEDGER_RESPONSE_RESPONSE_CREDENTIALS_H_ -#define BRAVELEDGER_RESPONSE_RESPONSE_CREDENTIALS_H_ - -#include "base/values.h" -#include "bat/ledger/mojom_structs.h" - -namespace braveledger_response_util { - -ledger::Result ParseSignedCreds( - const ledger::UrlResponse& response, - base::Value* result); - -} // namespace braveledger_response_util - -#endif // BRAVELEDGER_RESPONSE_RESPONSE_CREDENTIALS_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.cc deleted file mode 100644 index 87174f049adbd..0000000000000 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.cc +++ /dev/null @@ -1,280 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "bat/ledger/internal/response/response_sku.h" - -#include - -#include "base/json/json_reader.h" -#include "base/strings/string_number_conversions.h" -#include "base/values.h" -#include "bat/ledger/internal/logging/logging.h" -#include "net/http/http_status_code.h" - -namespace braveledger_response_util { - -// Request Url: -// POST /v1/orders/{order_id}/transactions/{transaction_suffix} -// -// Success: -// Created (201) -// -// Response Format: -// { -// "id": "80740e9c-08c3-43ed-92aa-2a7be8352000", -// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", -// "createdAt": "2020-06-10T18:58:22.817675Z", -// "updatedAt": "2020-06-10T18:58:22.817675Z", -// "external_transaction_id": "d382d3ae-8462-4b2c-9b60-b669539f41b2", -// "status": "completed", -// "currency": "BAT", -// "kind": "uphold", -// "amount": "1" -// } - -ledger::Result CheckSendExternalTransaction( - const ledger::UrlResponse& response) { - // Bad Request (400) - if (response.status_code == net::HTTP_BAD_REQUEST) { - BLOG(0, "Invalid request"); - return ledger::Result::LEDGER_ERROR; - } - - // Not Found (404) - if (response.status_code == net::HTTP_NOT_FOUND) { - BLOG(0, "Unrecognized transaction suffix"); - return ledger::Result::NOT_FOUND; - } - - // Conflict (409) - if (response.status_code == net::HTTP_CONFLICT) { - BLOG(0, "External transaction id already submitted"); - return ledger::Result::LEDGER_ERROR; - } - - // Internal Server Error (500) - if (response.status_code == net::HTTP_INTERNAL_SERVER_ERROR) { - BLOG(0, "Internal server error"); - return ledger::Result::LEDGER_ERROR; - } - - // Created (201) - if (response.status_code != net::HTTP_CREATED) { - return ledger::Result::LEDGER_ERROR; - } - - return ledger::Result::LEDGER_OK; -} - -// Request Url: -// POST /v1/orders -// -// Success: -// Created (201) -// -// Response Format: -// { -// "id": "f2e6494e-fb21-44d1-90e9-b5408799acd8", -// "createdAt": "2020-06-10T18:58:21.378752Z", -// "currency": "BAT", -// "updatedAt": "2020-06-10T18:58:21.378752Z", -// "totalPrice": "1", -// "location": "brave.com", -// "status": "pending", -// "items": [ -// { -// "id": "9c9aed7f-b349-452e-80a8-95faf2b1600d", -// "orderId": "f2e6494e-fb21-44d1-90e9-b5408799acd8", -// "sku": "user-wallet-vote", -// "createdAt": "2020-06-10T18:58:21.378752Z", -// "updatedAt": "2020-06-10T18:58:21.378752Z", -// "currency": "BAT", -// "quantity": 4, -// "price": "0.25", -// "subtotal": "1", -// "location": "brave.com", -// "description": "" -// } -// ] -// } - -ledger::SKUOrderPtr ParseOrderCreate( - const ledger::UrlResponse& response, - const std::vector& order_items) { - // Bad Request (400) - if (response.status_code == net::HTTP_BAD_REQUEST) { - BLOG(0, "Invalid request"); - return nullptr; - } - - // Internal Server Error (500) - if (response.status_code == net::HTTP_INTERNAL_SERVER_ERROR) { - BLOG(0, "Internal server error"); - return nullptr; - } - - // Created (201) - if (response.status_code != net::HTTP_CREATED) { - return nullptr; - } - - base::Optional dictionary = - base::JSONReader::Read(response.body); - if (!dictionary || !dictionary->is_dict()) { - BLOG(0, "Invalid JSON"); - return nullptr; - } - - auto order = ledger::SKUOrder::New(); - - const auto* id = dictionary->FindStringKey("id"); - if (id) { - order->order_id = *id; - } - - if (order->order_id.empty()) { - return nullptr; - } - - const auto* total_amount = dictionary->FindStringKey("totalPrice"); - if (total_amount) { - const bool success = - base::StringToDouble(*total_amount, &order->total_amount); - if (!success) { - order->total_amount = 0.0; - } - } - - const auto* merchant_id = dictionary->FindStringKey("merchantId"); - if (merchant_id) { - order->merchant_id = *merchant_id; - } - - const auto* location = dictionary->FindStringKey("location"); - if (location) { - order->location = *location; - } - - order->status = ledger::SKUOrderStatus::PENDING; - - auto* items = dictionary->FindListKey("items"); - if (!items) { - return order; - } - - if (items->GetList().size() != order_items.size()) { - BLOG(0, "Invalid JSON"); - return nullptr; - } - - int count = 0; - for (auto& item : items->GetList()) { - auto order_item = ledger::SKUOrderItem::New(); - order_item->order_id = order->order_id; - order_item->sku = order_items[count].sku; - order_item->type = order_items[count].type; - - const auto* id = item.FindStringKey("id"); - if (id) { - order_item->order_item_id = *id; - } - - const auto quantity = item.FindIntKey("quantity"); - if (quantity) { - order_item->quantity = *quantity; - } - - const auto* price = item.FindStringKey("price"); - if (price) { - const bool success = base::StringToDouble(*price, &order_item->price); - if (!success) { - order_item->price = 0.0; - } - } - - const auto* name = item.FindStringKey("name"); - if (name) { - order_item->name = *name; - } - - const auto* description = item.FindStringKey("description"); - if (description) { - order_item->description = *description; - } - - order->items.push_back(std::move(order_item)); - - count++; - } - - return order; -} - -// Request Url: -// POST /v1/orders/{order_id}/credentials -// POST /v1/orders/{order_id}/credentials/{item_id} -// -// Success: -// OK (200) -// -// Response Format: -// {Empty body} - -ledger::Result CheckClaimSKUCreds(const ledger::UrlResponse& response) { - // Bad Request (400) - if (response.status_code == net::HTTP_BAD_REQUEST) { - BLOG(0, "Invalid request"); - return ledger::Result::LEDGER_ERROR; - } - - // Conflict (409) - if (response.status_code == net::HTTP_CONFLICT) { - BLOG(0, "Credentials already exist for this order"); - return ledger::Result::LEDGER_ERROR; - } - - // Internal Server Error (500) - if (response.status_code == net::HTTP_INTERNAL_SERVER_ERROR) { - BLOG(0, "Internal server error"); - return ledger::Result::LEDGER_ERROR; - } - - if (response.status_code != net::HTTP_OK) { - return ledger::Result::LEDGER_ERROR; - } - - return ledger::Result::LEDGER_OK; -} - -// Request Url: -// POST /v1/votes -// -// Success: -// OK (200) -// -// Response Format: -// {Empty body} - -ledger::Result CheckRedeemSKUTokens(const ledger::UrlResponse& response) { - // Bad Request (400) - if (response.status_code == net::HTTP_BAD_REQUEST) { - BLOG(0, "Invalid request"); - return ledger::Result::LEDGER_ERROR; - } - - // Internal Server Error (500) - if (response.status_code == net::HTTP_INTERNAL_SERVER_ERROR) { - BLOG(0, "Internal server error"); - return ledger::Result::LEDGER_ERROR; - } - - if (response.status_code != net::HTTP_OK) { - return ledger::Result::LEDGER_ERROR; - } - - return ledger::Result::LEDGER_OK; -} - -} // namespace braveledger_response_util diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.h b/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.h deleted file mode 100644 index 4a7d4f56a3fbd..0000000000000 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/response/response_sku.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef BRAVELEDGER_RESPONSE_RESPONSE_SKU_H_ -#define BRAVELEDGER_RESPONSE_RESPONSE_SKU_H_ - -#include - -#include "bat/ledger/mojom_structs.h" - -namespace braveledger_response_util { - -ledger::Result CheckSendExternalTransaction( - const ledger::UrlResponse& response); - -ledger::SKUOrderPtr ParseOrderCreate( - const ledger::UrlResponse& response, - const std::vector& order_items); - -ledger::Result CheckClaimSKUCreds(const ledger::UrlResponse& response); - -ledger::Result CheckRedeemSKUTokens( - const ledger::UrlResponse& response); - -} // namespace braveledger_response_util - -#endif // BRAVELEDGER_RESPONSE_RESPONSE_SKU_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.cc index 16b7eb4c787ae..da6554f86f2eb 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.cc @@ -8,8 +8,6 @@ #include "base/json/json_writer.h" #include "base/values.h" #include "bat/ledger/internal/ledger_impl.h" -#include "bat/ledger/internal/request/request_sku.h" -#include "bat/ledger/internal/response/response_sku.h" #include "bat/ledger/internal/sku/sku_order.h" #include "bat/ledger/internal/sku/sku_util.h" @@ -19,7 +17,9 @@ using std::placeholders::_3; namespace braveledger_sku { -SKUOrder::SKUOrder(bat_ledger::LedgerImpl* ledger) : ledger_(ledger) { +SKUOrder::SKUOrder(bat_ledger::LedgerImpl* ledger) : + ledger_(ledger), + payment_server_(new ledger::endpoint::PaymentServer(ledger)) { DCHECK(ledger_); } @@ -34,47 +34,20 @@ void SKUOrder::Create( return; } - base::Value order_items(base::Value::Type::LIST); - for (const auto& item : items) { - base::Value order_item(base::Value::Type::DICTIONARY); - order_item.SetStringKey("sku", item.sku); - order_item.SetIntKey("quantity", item.quantity); - order_items.Append(std::move(order_item)); - } - - base::Value body(base::Value::Type::DICTIONARY); - body.SetKey("items", std::move(order_items)); - - std::string json; - base::JSONWriter::Write(body, &json); - auto url_callback = std::bind(&SKUOrder::OnCreate, this, _1, - items, + _2, callback); - const std::string url = braveledger_request_util::GetCreateOrderURL(); - - ledger_->LoadURL( - url, - {}, - json, - "application/json; charset=utf-8", - ledger::UrlMethod::POST, - url_callback); + payment_server_->post_order()->Request(items, url_callback); } void SKUOrder::OnCreate( - const ledger::UrlResponse& response, - const std::vector& order_items, + const ledger::Result result, + ledger::SKUOrderPtr order, ledger::SKUOrderCallback callback) { - BLOG(6, ledger::UrlResponseToString(__func__, response)); - - auto order = - braveledger_response_util::ParseOrderCreate(response, order_items); - - if (!order) { + if (result != ledger::Result::LEDGER_OK) { BLOG(0, "Order response could not be parsed"); callback(ledger::Result::LEDGER_ERROR, ""); return; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.h b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.h index a7f9a9b1c20bc..1b04d35627c36 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order.h @@ -7,9 +7,11 @@ #define BRAVELEDGER_SKU_ORDER_H_ #include +#include #include #include +#include "bat/ledger/internal/endpoint/payment/payment_server.h" #include "bat/ledger/ledger.h" namespace bat_ledger { @@ -29,8 +31,8 @@ class SKUOrder { private: void OnCreate( - const ledger::UrlResponse& response, - const std::vector& order_items, + const ledger::Result result, + ledger::SKUOrderPtr order, ledger::SKUOrderCallback callback); void OnCreateSave( @@ -39,6 +41,7 @@ class SKUOrder { ledger::SKUOrderCallback callback); bat_ledger::LedgerImpl* ledger_; // NOT OWNED + std::unique_ptr payment_server_; }; } // namespace braveledger_sku diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.cc index 103abe48db9bd..acff0de8e8856 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.cc @@ -10,8 +10,6 @@ #include "base/values.h" #include "bat/ledger/global_constants.h" #include "bat/ledger/internal/ledger_impl.h" -#include "bat/ledger/internal/request/request_sku.h" -#include "bat/ledger/internal/response/response_sku.h" #include "bat/ledger/internal/sku/sku_transaction.h" #include "bat/ledger/internal/sku/sku_util.h" @@ -44,7 +42,8 @@ ledger::SKUTransactionType GetTransactionTypeFromWalletType( namespace braveledger_sku { SKUTransaction::SKUTransaction(bat_ledger::LedgerImpl* ledger) : - ledger_(ledger) { + ledger_(ledger), + payment_server_(new ledger::endpoint::PaymentServer(ledger)) { DCHECK(ledger_); } @@ -178,42 +177,30 @@ void SKUTransaction::SendExternalTransaction( return; } - base::Value body(base::Value::Type::DICTIONARY); - body.SetStringKey( - "externalTransactionId", - transaction.external_transaction_id); - body.SetStringKey( - "kind", - ConvertTransactionTypeToString(transaction.type)); - - std::string json; - base::JSONWriter::Write(body, &json); - auto url_callback = std::bind(&SKUTransaction::OnSendExternalTransaction, this, _1, callback); - const std::string url = braveledger_request_util::GetCreateTransactionURL( - transaction.order_id, - transaction.type); - - ledger_->LoadURL( - url, - {}, - json, - "application/json; charset=utf-8", - ledger::UrlMethod::POST, - url_callback); + switch (transaction.type) { + case ledger::SKUTransactionType::NONE: + case ledger::SKUTransactionType::TOKENS: + case ledger::SKUTransactionType::ANONYMOUS_CARD: { + NOTREACHED(); + return; + } + case ledger::SKUTransactionType::UPHOLD: { + payment_server_->post_transaction_uphold()->Request( + transaction, + url_callback); + return; + } + } } void SKUTransaction::OnSendExternalTransaction( - const ledger::UrlResponse& response, + const ledger::Result result, ledger::ResultCallback callback) { - BLOG(6, ledger::UrlResponseToString(__func__, response)); - - const ledger::Result result = - braveledger_response_util::CheckSendExternalTransaction(response); if (result != ledger::Result::LEDGER_OK) { BLOG(0, "External transaction not sent"); callback(ledger::Result::RETRY); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.h b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.h index 021f0274afbff..3e3b5064490c1 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction.h @@ -7,8 +7,10 @@ #define BRAVELEDGER_SKU_TRANSACTION_H_ #include +#include #include +#include "bat/ledger/internal/endpoint/payment/payment_server.h" #include "bat/ledger/ledger.h" namespace bat_ledger { @@ -53,10 +55,11 @@ class SKUTransaction { ledger::ResultCallback callback); void OnSendExternalTransaction( - const ledger::UrlResponse& response, + const ledger::Result result, ledger::ResultCallback callback); bat_ledger::LedgerImpl* ledger_; // NOT OWNED + std::unique_ptr payment_server_; }; } // namespace braveledger_sku diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.cc index 35c50f8e5aed8..d1f52a8b0e07e 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.cc @@ -25,22 +25,6 @@ const char kUpholdDestinationStaging[] = const char kUpholdDestinationProduction[] = "5d4be2ad-1c65-4802-bea1-e0f3a3a487cb"; -std::string ConvertTransactionTypeToString( - const ledger::SKUTransactionType type) { - switch (type) { - case ledger::SKUTransactionType::UPHOLD: { - return "uphold"; - } - case ledger::SKUTransactionType::ANONYMOUS_CARD: { - return "anonymous-card"; - } - case ledger::SKUTransactionType::NONE: - case ledger::SKUTransactionType::TOKENS: { - return ""; - } - } -} - std::string GetBraveDestination(const std::string& wallet_type) { if (wallet_type == ledger::kWalletUphold) { return GetUpholdDestination(); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.h b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.h index 0ad0b6a21392b..53387d4ee5265 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_util.h @@ -13,9 +13,6 @@ namespace braveledger_sku { -std::string ConvertTransactionTypeToString( - const ledger::SKUTransactionType type); - std::string GetBraveDestination(const std::string& wallet_type); std::string GetAnonCardDestination();