diff options
author | Arsentiy Milchakov <milcars@mapswithme.com> | 2019-05-22 16:08:03 +0300 |
---|---|---|
committer | mpimenov <mpimenov@users.noreply.github.com> | 2019-05-22 21:13:05 +0300 |
commit | 8feb8457c6b43cb0807085e13c78b247d0a20db9 (patch) | |
tree | d9c35522cfe55a5d8d8ff9a356206e53d84c951f /partners_api | |
parent | 7f550f91f8521e3848d140f813fa681c12e51654 (diff) |
[core] review fixes + cross_reference is renamed to promo
Diffstat (limited to 'partners_api')
-rw-r--r-- | partners_api/CMakeLists.txt | 4 | ||||
-rw-r--r-- | partners_api/cross_reference_api.cpp | 227 | ||||
-rw-r--r-- | partners_api/partners_api_tests/CMakeLists.txt | 2 | ||||
-rw-r--r-- | partners_api/partners_api_tests/promo_tests.cpp (renamed from partners_api/partners_api_tests/cross_reference_tests.cpp) | 40 | ||||
-rw-r--r-- | partners_api/promo_api.cpp | 221 | ||||
-rw-r--r-- | partners_api/promo_api.hpp (renamed from partners_api/cross_reference_api.hpp) | 24 |
6 files changed, 256 insertions, 262 deletions
diff --git a/partners_api/CMakeLists.txt b/partners_api/CMakeLists.txt index 11f2d00fb9..f7fed45e97 100644 --- a/partners_api/CMakeLists.txt +++ b/partners_api/CMakeLists.txt @@ -16,8 +16,8 @@ set( booking_block_params.cpp booking_block_params.hpp booking_params_base.hpp - cross_reference_api.cpp - cross_reference_api.hpp + promo_api.cpp + promo_api.hpp facebook_ads.cpp facebook_ads.hpp google_ads.cpp diff --git a/partners_api/cross_reference_api.cpp b/partners_api/cross_reference_api.cpp deleted file mode 100644 index b488774cf6..0000000000 --- a/partners_api/cross_reference_api.cpp +++ /dev/null @@ -1,227 +0,0 @@ -#include "cross_reference_api.hpp" - -#include "metrics/eye.hpp" - -#include "platform/http_client.hpp" -#include "platform/platform.hpp" -#include "platform/preferred_languages.hpp" -#include "platform/settings.hpp" - -#include "base/assert.hpp" - -#include <algorithm> -#include <chrono> -#include <utility> - -#include "3party/jansson/myjansson.hpp" - -using namespace cross_reference; - -using namespace std::chrono; - -namespace -{ -constexpr minutes kMinMinutesCountAfterBooking = minutes(5); -constexpr minutes kMaxMinutesCountAfterBooking = minutes(60); -constexpr hours kShowCrossReferenceNotRaterThan = hours(24); - -std::array<std::string, 9> const kSupportedBookingTypes = {{"tourism-hotel", "tourism-apartment", - "tourism-camp_site", "tourism-chalet", - "tourism-guest_house", "tourism-hostel", - "tourism-motel", "tourism-resort", - "sponsored-booking"}}; - -bool NeedToShowImpl(eye::Eye::InfoType const & eyeInfo) -{ - auto const timeSinceLastShown = - eye::Clock::now() - eyeInfo->m_crossReferences.m_lastTimeShownAfterBooking; - auto const timeSinceLastTransitionToBooking = - eye::Clock::now() - eyeInfo->m_crossReferences.m_transitionToBookingTime; - - return timeSinceLastTransitionToBooking >= kMinMinutesCountAfterBooking || - timeSinceLastTransitionToBooking <= kMaxMinutesCountAfterBooking || - timeSinceLastShown > kShowCrossReferenceNotRaterThan; -} - -void ParseCityGallery(std::string const & src, cross_reference::CityGallery & result) -{ - base::Json root(src.c_str()); - auto const dataArray = json_object_get(root.get(), "data"); - - auto const size = json_array_size(dataArray); - - result.reserve(size); - for (size_t i = 0; i < size; ++i) - { - cross_reference::CityGalleryItem item; - auto const obj = json_array_get(dataArray, i); - FromJSONObject(obj, "name", item.m_name); - FromJSONObject(obj, "url", item.m_url); - - auto const imageUrlObj = json_object_get(obj, "image_url"); - if (!json_is_null(imageUrlObj)) - FromJSON(imageUrlObj, item.m_imageUrl); - - FromJSONObject(obj, "access", item.m_access); - - auto const tierObj = json_object_get(obj, "tier"); - if (!json_is_null(tierObj)) - FromJSON(tierObj, item.m_tier); - - auto const authorObj = json_object_get(obj, "author"); - FromJSONObject(authorObj, "key_id", item.m_author.m_id); - FromJSONObject(authorObj, "name", item.m_author.m_name); - - auto const luxCategoryObj = json_object_get(obj, "lux_category"); - - auto const luxCategoryNameobj = json_object_get(luxCategoryObj, "name"); - if (!json_is_null(luxCategoryNameobj)) - FromJSON(luxCategoryNameobj, item.m_luxCategory.m_name); - - FromJSONObject(luxCategoryObj, "color", item.m_luxCategory.m_color); - - result.emplace_back(std::move(item)); - } -} - -std::string MakeCityGalleryUrl(std::string const & baseUrl, std::string const & osmId, - std::string const & lang) -{ - return baseUrl + osmId + "/?lang=" + lang; -} - -void GetCrossReferenceCityGalleryImpl(std::string const & baseUrl, std::string const & osmId, - CityGalleryCallback const & cb) -{ - if (osmId.empty()) - { - GetPlatform().RunTask(Platform::Thread::Gui, [cb]() { cb({}); }); - return; - } - - CityGallery result; - std::string httpResult; - if (!WebApi::GetCityGalleryByOsmId(baseUrl, osmId, languages::GetCurrentNorm(), httpResult)) - { - GetPlatform().RunTask(Platform::Thread::Gui, [cb]() { cb({}); }); - return; - } - - try - { - ParseCityGallery(httpResult, result); - } - catch (base::Json::Exception const & e) - { - LOG(LERROR, (e.Msg())); - result.clear(); - } - - GetPlatform().RunTask(Platform::Thread::Gui, [ cb, result = move(result) ]() { cb(result); }); -} -} // namespace - -namespace cross_reference -{ -// static -bool WebApi::GetCityGalleryByOsmId(std::string const & baseUrl, std::string const & osmId, - std::string const & lang, std::string & result) -{ - platform::HttpClient request(MakeCityGalleryUrl(baseUrl, osmId, lang)); - return request.RunHttpRequest(result); -} - -Api::Api(std::string const & baseUrl /* = "https://routes.maps.me/gallery/v1/city/" */) - : m_baseUrl(baseUrl) -{ -} - -void Api::SetDelegate(std::unique_ptr<Delegate> delegate) -{ - m_delegate = std::move(delegate); -} - -void Api::OnEnterForeground() -{ - m_bookingCrossReferenceAwaitingForId.clear(); - settings::TryGet("BookingCrossReferenceAwaitingForId", m_bookingCrossReferenceAwaitingForId); - - if (m_bookingCrossReferenceAwaitingForId.empty()) - return; - - auto const eyeInfo = eye::Eye::Instance().GetInfo(); - auto const timeSinceLastTransitionToBooking = - eye::Clock::now() - eyeInfo->m_crossReferences.m_transitionToBookingTime; - - if (timeSinceLastTransitionToBooking < kMinMinutesCountAfterBooking || - timeSinceLastTransitionToBooking > kMaxMinutesCountAfterBooking) - { - settings::Delete("BookingCrossReferenceAwaitingForId"); - m_bookingCrossReferenceAwaitingForId.clear(); - } -} - -bool Api::NeedToShow() const -{ - if (m_bookingCrossReferenceAwaitingForId.empty()) - return false; - - return NeedToShowImpl(eye::Eye::Instance().GetInfo()); -} - -std::string Api::GetCrossReferenceLinkAfterBooking() const -{ - auto const eyeInfo = eye::Eye::Instance().GetInfo(); - - if (m_bookingCrossReferenceAwaitingForId.empty() || !NeedToShowImpl(eyeInfo)) - return ""; - - return MakeCityGalleryUrl(m_baseUrl, m_bookingCrossReferenceAwaitingForId, - languages::GetCurrentNorm()); -} - -void Api::GetCrossReferenceCityGallery(std::string const & osmId, - CityGalleryCallback const & cb) const -{ - GetCrossReferenceCityGalleryImpl(m_baseUrl, osmId, cb); -} - -void Api::GetCrossReferenceCityGallery(m2::PointD const & point, - CityGalleryCallback const & cb) const -{ - CHECK(m_delegate, ()); - - GetCrossReferenceCityGalleryImpl(m_baseUrl, m_delegate->GetCityOsmId(point), cb); -} - -void Api::OnMapObjectEvent(eye::MapObject const & mapObject) -{ - CHECK(!mapObject.GetEvents().empty(), ()); - - auto const typeIt = std::find(kSupportedBookingTypes.cbegin(), kSupportedBookingTypes.cend(), - mapObject.GetBestType()); - - if (typeIt == kSupportedBookingTypes.cend()) - return; - - m2::PointD pos; - bool found = false; - switch (mapObject.GetEvents().back().m_type) - { - case eye::MapObject::Event::Type::BookingBook: - case eye::MapObject::Event::Type::BookingMore: - case eye::MapObject::Event::Type::BookingReviews: - case eye::MapObject::Event::Type::BookingDetails: - { - pos = mapObject.GetPos(); - found = true; - } - default: /* do nothing */; - } - - auto const osmId = found ? m_delegate->GetCityOsmId(pos) : ""; - - if (!osmId.empty()) - settings::Set("BookingCrossReferenceAwaitingForId", osmId); -} -} // namespace cross_reference diff --git a/partners_api/partners_api_tests/CMakeLists.txt b/partners_api/partners_api_tests/CMakeLists.txt index 5916607e7c..c9710dab6f 100644 --- a/partners_api/partners_api_tests/CMakeLists.txt +++ b/partners_api/partners_api_tests/CMakeLists.txt @@ -6,7 +6,7 @@ set( SRC ads_engine_tests.cpp booking_tests.cpp - cross_reference_tests.cpp + promo_tests.cpp facebook_tests.cpp google_tests.cpp maxim_tests.cpp diff --git a/partners_api/partners_api_tests/cross_reference_tests.cpp b/partners_api/partners_api_tests/promo_tests.cpp index 8b12c62aab..39758eff8a 100644 --- a/partners_api/partners_api_tests/cross_reference_tests.cpp +++ b/partners_api/partners_api_tests/promo_tests.cpp @@ -1,6 +1,6 @@ #include "testing/testing.hpp" -#include "partners_api/cross_reference_api.hpp" +#include "partners_api/promo_api.hpp" #include "platform/settings.hpp" @@ -16,7 +16,7 @@ using namespace platform::tests_support; namespace { -std::string const kTestOsmId = "TestOsmId"; +std::string const kTestId = "TestId"; class ScopedEyeWithAsyncGuiThread : public AsyncGuiThread { @@ -32,16 +32,16 @@ public: } }; -class DelegateForTesting : public cross_reference::Api::Delegate +class DelegateForTesting : public promo::Api::Delegate { public: - std::string GetCityOsmId(m2::PointD const &) override { return kTestOsmId; } + std::string GetCityId(m2::PointD const &) override { return kTestId; } }; } // namespace -UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) +UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_NeedToShowAfterBooking) { - cross_reference::Api api; + promo::Api api; Info info; { MapObject poi; @@ -69,9 +69,9 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) } EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId); + settings::Set("BookingPromoAwaitingForId", kTestId); api.OnEnterForeground(); - TEST_EQUAL(api.NeedToShow(), false, ()); + TEST_EQUAL(api.NeedToShowAfterBooking(), false, ()); { MapObject poi; @@ -92,11 +92,11 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) info.m_mapObjects.Add(poi); } - info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2); + info.m_promo.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2); EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId); + settings::Set("BookingPromoAwaitingForId", kTestId); api.OnEnterForeground(); - TEST_EQUAL(api.NeedToShow(), false, ()); + TEST_EQUAL(api.NeedToShowAfterBooking(), false, ()); { MapObject poi; @@ -127,21 +127,21 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) info.m_mapObjects.Add(poi); } - info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::minutes(6); + info.m_promo.m_transitionToBookingTime = Clock::now() - std::chrono::minutes(6); EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId); + settings::Set("BookingPromoAwaitingForId", kTestId); api.OnEnterForeground(); - TEST_EQUAL(api.NeedToShow(), true, ()); + TEST_EQUAL(api.NeedToShowAfterBooking(), true, ()); } -UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_GetCrossReferenceCityGallery) +UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_GetCityGallery) { - cross_reference::Api api("http://localhost:34568/gallery/city/"); + promo::Api api("http://localhost:34568/gallery/city/"); api.SetDelegate(std::make_unique<DelegateForTesting>()); { - cross_reference::CityGallery result{}; - api.GetCrossReferenceCityGallery(kTestOsmId, [&result](cross_reference::CityGallery const & gallery) + promo::CityGallery result{}; + api.GetCityGallery(kTestId, [&result](promo::CityGallery const & gallery) { result = gallery; testing::Notify(); @@ -151,9 +151,9 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_GetCrossReferenceCit TEST_EQUAL(result.size(), 2, ()); } { - cross_reference::CityGallery result{}; + promo::CityGallery result{}; m2::PointD pt; - api.GetCrossReferenceCityGallery(pt, [&result](cross_reference::CityGallery const & gallery) + api.GetCityGallery(pt, [&result](promo::CityGallery const & gallery) { result = gallery; testing::Notify(); diff --git a/partners_api/promo_api.cpp b/partners_api/promo_api.cpp new file mode 100644 index 0000000000..3d9ceea9ac --- /dev/null +++ b/partners_api/promo_api.cpp @@ -0,0 +1,221 @@ +#include "partners_api/promo_api.hpp" + +#include "indexer/classificator.hpp" +#include "indexer/ftypes_matcher.hpp" + +#include "platform/http_client.hpp" +#include "platform/platform.hpp" +#include "platform/preferred_languages.hpp" +#include "platform/settings.hpp" + +#include "base/assert.hpp" + +#include <algorithm> +#include <chrono> +#include <utility> + +#include "3party/jansson/myjansson.hpp" + +using namespace std::chrono; + +namespace promo +{ +namespace +{ +constexpr minutes kMinMinutesAfterBooking = minutes(5); +constexpr minutes kMaxMinutesAfterBooking = minutes(60); +constexpr hours kShowPromoNotRaterThan = hours(24); + +bool NeedToShowImpl(eye::Eye::InfoType const & eyeInfo) +{ + auto const timeSinceLastShown = eye::Clock::now() - eyeInfo->m_promo.m_lastTimeShownAfterBooking; + auto const timeSinceLastTransitionToBooking = + eye::Clock::now() - eyeInfo->m_promo.m_transitionToBookingTime; + + return timeSinceLastTransitionToBooking >= kMinMinutesAfterBooking && + timeSinceLastTransitionToBooking <= kMaxMinutesAfterBooking && + timeSinceLastShown > kShowPromoNotRaterThan; +} + +void ParseCityGallery(std::string const & src, promo::CityGallery & result) +{ + base::Json root(src.c_str()); + auto const dataArray = json_object_get(root.get(), "data"); + + auto const size = json_array_size(dataArray); + + result.reserve(size); + for (size_t i = 0; i < size; ++i) + { + promo::CityGalleryItem item; + auto const obj = json_array_get(dataArray, i); + FromJSONObject(obj, "name", item.m_name); + FromJSONObject(obj, "url", item.m_url); + + auto const imageUrlObj = json_object_get(obj, "image_url"); + if (!json_is_null(imageUrlObj)) + FromJSON(imageUrlObj, item.m_imageUrl); + + FromJSONObject(obj, "access", item.m_access); + + auto const tierObj = json_object_get(obj, "tier"); + if (!json_is_null(tierObj)) + FromJSON(tierObj, item.m_tier); + + auto const authorObj = json_object_get(obj, "author"); + FromJSONObject(authorObj, "key_id", item.m_author.m_id); + FromJSONObject(authorObj, "name", item.m_author.m_name); + + auto const luxCategoryObj = json_object_get(obj, "lux_category"); + + auto const luxCategoryNameobj = json_object_get(luxCategoryObj, "name"); + if (!json_is_null(luxCategoryNameobj)) + FromJSON(luxCategoryNameobj, item.m_luxCategory.m_name); + + FromJSONObject(luxCategoryObj, "color", item.m_luxCategory.m_color); + + result.emplace_back(std::move(item)); + } +} + +std::string MakeCityGalleryUrl(std::string const & baseUrl, std::string const & id, + std::string const & lang) +{ + return baseUrl + id + "/?lang=" + lang; +} + +void GetPromoCityGalleryImpl(std::string const & baseUrl, std::string const & id, + CityGalleryCallback const & cb) +{ + ASSERT(!baseUrl.empty(), ()); + ASSERT_EQUAL(baseUrl.back(), '/', ()); + + if (id.empty()) + { + GetPlatform().RunTask(Platform::Thread::Gui, [cb]() { cb({}); }); + return; + } + + CityGallery result; + std::string httpResult; + if (!WebApi::GetCityGalleryById(baseUrl, id, languages::GetCurrentNorm(), httpResult)) + { + GetPlatform().RunTask(Platform::Thread::Gui, [cb]() { cb({}); }); + return; + } + + try + { + ParseCityGallery(httpResult, result); + } + catch (base::Json::Exception const & e) + { + LOG(LERROR, (e.Msg())); + result.clear(); + } + + GetPlatform().RunTask(Platform::Thread::Gui, [ cb, result = move(result) ]() { cb(result); }); +} +} // namespace + +// static +bool WebApi::GetCityGalleryById(std::string const & baseUrl, std::string const & id, + std::string const & lang, std::string & result) +{ + platform::HttpClient request(MakeCityGalleryUrl(baseUrl, id, lang)); + return request.RunHttpRequest(result); +} + +Api::Api(std::string const & baseUrl /* = "https://routes.maps.me/gallery/v1/city/" */) + : m_baseUrl(baseUrl) +{ +} + +void Api::SetDelegate(std::unique_ptr<Delegate> delegate) +{ + m_delegate = std::move(delegate); +} + +void Api::OnEnterForeground() +{ + m_bookingPromoAwaitingForId.clear(); + settings::TryGet("BookingPromoAwaitingForId", m_bookingPromoAwaitingForId); + + if (m_bookingPromoAwaitingForId.empty()) + return; + + auto const eyeInfo = eye::Eye::Instance().GetInfo(); + auto const timeSinceLastTransitionToBooking = + eye::Clock::now() - eyeInfo->m_promo.m_transitionToBookingTime; + + if (timeSinceLastTransitionToBooking < kMinMinutesAfterBooking || + timeSinceLastTransitionToBooking > kMaxMinutesAfterBooking) + { + settings::Delete("BookingPromoAwaitingForId"); + m_bookingPromoAwaitingForId.clear(); + } +} + +bool Api::NeedToShowAfterBooking() const +{ + if (m_bookingPromoAwaitingForId.empty()) + return false; + + return NeedToShowImpl(eye::Eye::Instance().GetInfo()); +} + +std::string Api::GetPromoLinkAfterBooking() const +{ + auto const eyeInfo = eye::Eye::Instance().GetInfo(); + + if (m_bookingPromoAwaitingForId.empty() || !NeedToShowImpl(eyeInfo)) + return ""; + + return MakeCityGalleryUrl(m_baseUrl, m_bookingPromoAwaitingForId, languages::GetCurrentNorm()); +} + +void Api::GetCityGallery(std::string const & id, CityGalleryCallback const & cb) const +{ + GetPromoCityGalleryImpl(m_baseUrl, id, cb); +} + +void Api::GetCityGallery(m2::PointD const & point, CityGalleryCallback const & cb) const +{ + CHECK(m_delegate, ()); + + GetPromoCityGalleryImpl(m_baseUrl, m_delegate->GetCityId(point), cb); +} + +void Api::OnMapObjectEvent(eye::MapObject const & mapObject) +{ + CHECK(!mapObject.GetEvents().empty(), ()); + + auto const bestType = classif().GetTypeByReadableObjectName(mapObject.GetBestType()); + + if (!ftypes::IsHotelChecker::Instance()(bestType) && + !ftypes::IsBookingHotelChecker::Instance()(bestType)) + { + return; + } + + m2::PointD pos; + bool found = false; + switch (mapObject.GetEvents().back().m_type) + { + case eye::MapObject::Event::Type::BookingBook: + case eye::MapObject::Event::Type::BookingMore: + case eye::MapObject::Event::Type::BookingReviews: + case eye::MapObject::Event::Type::BookingDetails: + { + pos = mapObject.GetPos(); + found = true; + } + default: /* do nothing */; + } + + auto const id = found ? m_delegate->GetCityId(pos) : ""; + + if (!id.empty()) + settings::Set("BookingPromoAwaitingForId", id); +} +} // namespace promo diff --git a/partners_api/cross_reference_api.hpp b/partners_api/promo_api.hpp index cfd37be713..c75aac7b6f 100644 --- a/partners_api/cross_reference_api.hpp +++ b/partners_api/promo_api.hpp @@ -7,8 +7,9 @@ #include <functional> #include <memory> #include <string> +#include <vector> -namespace cross_reference +namespace promo { struct Author { @@ -37,8 +38,8 @@ using CityGallery = std::vector<CityGalleryItem>; class WebApi { public: - static bool GetCityGalleryByOsmId(std::string const & baseUrl, std::string const & osmId, - std::string const & lang, std::string & result); + static bool GetCityGalleryById(std::string const & baseUrl, std::string const & id, + std::string const & lang, std::string & result); }; using CityGalleryCallback = std::function<void(CityGallery const & gallery)>; @@ -51,18 +52,17 @@ public: public: virtual ~Delegate() = default; - virtual std::string GetCityOsmId(m2::PointD const & point) = 0; + virtual std::string GetCityId(m2::PointD const & point) = 0; }; explicit Api(std::string const & baseUrl = "https://routes.maps.me/gallery/v1/city/"); void SetDelegate(std::unique_ptr<Delegate> delegate); void OnEnterForeground(); - bool NeedToShow() const; - std::string GetCrossReferenceLinkAfterBooking() const; - void GetCrossReferenceCityGallery(std::string const & osmId, - CityGalleryCallback const & cb) const; - void GetCrossReferenceCityGallery(m2::PointD const & point, CityGalleryCallback const & cb) const; + bool NeedToShowAfterBooking() const; + std::string GetPromoLinkAfterBooking() const; + void GetCityGallery(std::string const & id, CityGalleryCallback const & cb) const; + void GetCityGallery(m2::PointD const & point, CityGalleryCallback const & cb) const; // eye::Subscriber overrides: void OnMapObjectEvent(eye::MapObject const & poi) override; @@ -70,7 +70,7 @@ public: private: std::unique_ptr<Delegate> m_delegate; - std::string m_baseUrl; - std::string m_bookingCrossReferenceAwaitingForId; + std::string const m_baseUrl; + std::string m_bookingPromoAwaitingForId; }; -} // namespace cross_reference +} // namespace promo |