diff options
author | Arsentiy Milchakov <milcars@mapswithme.com> | 2019-05-21 20:45:23 +0300 |
---|---|---|
committer | mpimenov <mpimenov@users.noreply.github.com> | 2019-05-22 21:13:05 +0300 |
commit | 7f550f91f8521e3848d140f813fa681c12e51654 (patch) | |
tree | 6bdaa962451f994025b233fb24a2b3a43b99e946 /partners_api | |
parent | fa59cb2a6a97839d035f33127aff5e38d334a85a (diff) |
[core] synchronous cross reference url calculation after booking
Diffstat (limited to 'partners_api')
-rw-r--r-- | partners_api/cross_reference_api.cpp | 98 | ||||
-rw-r--r-- | partners_api/cross_reference_api.hpp | 15 | ||||
-rw-r--r-- | partners_api/partners_api_tests/cross_reference_tests.cpp | 132 |
3 files changed, 54 insertions, 191 deletions
diff --git a/partners_api/cross_reference_api.cpp b/partners_api/cross_reference_api.cpp index 99c69986bc..b488774cf6 100644 --- a/partners_api/cross_reference_api.cpp +++ b/partners_api/cross_reference_api.cpp @@ -143,9 +143,10 @@ void Api::SetDelegate(std::unique_ptr<Delegate> delegate) void Api::OnEnterForeground() { - settings::TryGet("BookingCrossReferenceIsAwaiting", m_bookingCrossReferenceIsAwaiting); + m_bookingCrossReferenceAwaitingForId.clear(); + settings::TryGet("BookingCrossReferenceAwaitingForId", m_bookingCrossReferenceAwaitingForId); - if (!m_bookingCrossReferenceIsAwaiting) + if (m_bookingCrossReferenceAwaitingForId.empty()) return; auto const eyeInfo = eye::Eye::Instance().GetInfo(); @@ -155,74 +156,28 @@ void Api::OnEnterForeground() if (timeSinceLastTransitionToBooking < kMinMinutesCountAfterBooking || timeSinceLastTransitionToBooking > kMaxMinutesCountAfterBooking) { - m_bookingCrossReferenceIsAwaiting = false; - settings::Set("BookingCrossReferenceIsAwaiting", false); + settings::Delete("BookingCrossReferenceAwaitingForId"); + m_bookingCrossReferenceAwaitingForId.clear(); } } bool Api::NeedToShow() const { - if (!m_bookingCrossReferenceIsAwaiting) + if (m_bookingCrossReferenceAwaitingForId.empty()) return false; return NeedToShowImpl(eye::Eye::Instance().GetInfo()); } -void Api::GetCrossReferenceLinkAfterBooking(AfterBookingCallback const & cb) const +std::string Api::GetCrossReferenceLinkAfterBooking() const { - CHECK(m_delegate, ()); - auto const eyeInfo = eye::Eye::Instance().GetInfo(); - if (!m_bookingCrossReferenceIsAwaiting || !NeedToShowImpl(eyeInfo)) - { - GetPlatform().RunTask(Platform::Thread::Gui, [cb]() { cb({}); }); - return; - } + if (m_bookingCrossReferenceAwaitingForId.empty() || !NeedToShowImpl(eyeInfo)) + return ""; - GetPlatform().RunTask(Platform::Thread::Background, [this, eyeInfo, cb]() - { - auto const targetTime = eyeInfo->m_crossReferences.m_transitionToBookingTime; - m2::PointD pos; - auto const found = - eyeInfo->m_mapObjects.FindNode([&pos, targetTime](eye::MapObject const & mapObject) - { - if (mapObject.GetEvents().empty()) - return false; - - auto const typeIt = std::find(kSupportedBookingTypes.cbegin(), - kSupportedBookingTypes.cend(), mapObject.GetBestType()); - - if (typeIt == kSupportedBookingTypes.cend()) - return false; - - for (auto const & event : mapObject.GetEvents()) - { - switch (event.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: - { - if (event.m_eventTime == targetTime) - { - pos = mapObject.GetPos(); - return true; - } - } - default: continue; - } - } - return false; - }); - - auto const osmId = found ? m_delegate->GetCityOsmId(pos) : ""; - auto const resultUrl = - osmId.empty() ? "" : MakeCityGalleryUrl(m_baseUrl, osmId, languages::GetCurrentNorm()); - - GetPlatform().RunTask(Platform::Thread::Gui, [cb, resultUrl]() { cb(resultUrl); }); - }); + return MakeCityGalleryUrl(m_baseUrl, m_bookingCrossReferenceAwaitingForId, + languages::GetCurrentNorm()); } void Api::GetCrossReferenceCityGallery(std::string const & osmId, @@ -238,4 +193,35 @@ void Api::GetCrossReferenceCityGallery(m2::PointD const & point, 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/cross_reference_api.hpp b/partners_api/cross_reference_api.hpp index 33f0dec148..cfd37be713 100644 --- a/partners_api/cross_reference_api.hpp +++ b/partners_api/cross_reference_api.hpp @@ -1,5 +1,7 @@ #pragma once +#include "metrics/eye.hpp" + #include "geometry/point2d.hpp" #include <functional> @@ -39,10 +41,9 @@ public: std::string const & lang, std::string & result); }; -using AfterBookingCallback = std::function<void(std::string const & url)>; using CityGalleryCallback = std::function<void(CityGallery const & gallery)>; -class Api +class Api : public eye::Subscriber { public: class Delegate @@ -58,16 +59,18 @@ public: void SetDelegate(std::unique_ptr<Delegate> delegate); void OnEnterForeground(); bool NeedToShow() const; - void GetCrossReferenceLinkAfterBooking(AfterBookingCallback const & cb) 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; + void GetCrossReferenceCityGallery(m2::PointD const & point, CityGalleryCallback const & cb) const; + + // eye::Subscriber overrides: + void OnMapObjectEvent(eye::MapObject const & poi) override; private: std::unique_ptr<Delegate> m_delegate; std::string m_baseUrl; - bool m_bookingCrossReferenceIsAwaiting = false; + std::string m_bookingCrossReferenceAwaitingForId; }; } // namespace cross_reference diff --git a/partners_api/partners_api_tests/cross_reference_tests.cpp b/partners_api/partners_api_tests/cross_reference_tests.cpp index 1d48e86640..8b12c62aab 100644 --- a/partners_api/partners_api_tests/cross_reference_tests.cpp +++ b/partners_api/partners_api_tests/cross_reference_tests.cpp @@ -69,7 +69,7 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) } EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceIsAwaiting", true); + settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId); api.OnEnterForeground(); TEST_EQUAL(api.NeedToShow(), false, ()); @@ -94,7 +94,7 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2); EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceIsAwaiting", true); + settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId); api.OnEnterForeground(); TEST_EQUAL(api.NeedToShow(), false, ()); @@ -129,139 +129,13 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_NeedToShow) info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::minutes(6); EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceIsAwaiting", true); + settings::Set("BookingCrossReferenceAwaitingForId", kTestOsmId); api.OnEnterForeground(); TEST_EQUAL(api.NeedToShow(), true, ()); } -UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_GetCrossReferenceLinkAfterBooking) -{ - cross_reference::Api api; - api.SetDelegate(std::make_unique<DelegateForTesting>()); - Info info; - { - MapObject poi; - poi.SetBestType("tourism-hotel"); - poi.SetPos({53.652007, 108.143443}); - MapObject::Event eventInfo; - - eventInfo.m_eventTime = Clock::now() - std::chrono::hours((24 * 30 * 3) + 1); - eventInfo.m_userPos = {72.045507, 81.408095}; - eventInfo.m_type = MapObject::Event::Type::Open; - poi.GetEditableEvents().emplace_back(eventInfo); - - eventInfo.m_eventTime = - Clock::now() - (std::chrono::hours(24 * 30 * 3) + std::chrono::seconds(1)); - eventInfo.m_userPos = {72.045400, 81.408200}; - eventInfo.m_type = MapObject::Event::Type::AddToBookmark; - poi.GetEditableEvents().emplace_back(eventInfo); - - eventInfo.m_eventTime = Clock::now() - std::chrono::hours(24 * 30 * 3); - eventInfo.m_userPos = {72.045450, 81.408201}; - eventInfo.m_type = MapObject::Event::Type::RouteToCreated; - poi.GetEditableEvents().emplace_back(eventInfo); - - info.m_mapObjects.Add(poi); - } - - EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceIsAwaiting", true); - api.OnEnterForeground(); - - std::string result{}; - api.GetCrossReferenceLinkAfterBooking([&result](std::string const & url) - { - result = url; - testing::Notify(); - }); - - testing::Wait(); - TEST(result.empty(), ()); - - auto eventTime = Clock::now() - std::chrono::hours(2); - { - MapObject poi; - poi.SetBestType("tourism-hotel"); - poi.SetPos({53.652005, 108.143448}); - MapObject::Event eventInfo; - - eventInfo.m_eventTime = Clock::now() - std::chrono::hours(24 * 30 * 3); - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::Open; - poi.GetEditableEvents().emplace_back(eventInfo); - - eventInfo.m_eventTime = eventTime; - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::BookingBook; - poi.GetEditableEvents().emplace_back(eventInfo); - - info.m_mapObjects.Add(poi); - } - - info.m_crossReferences.m_transitionToBookingTime = Clock::now() - std::chrono::hours(2); - EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceIsAwaiting", true); - api.OnEnterForeground(); - - result = {}; - api.GetCrossReferenceLinkAfterBooking([&result](std::string const & url) - { - result = url; - testing::Notify(); - }); - - testing::Wait(); - TEST(result.empty(), ()); - - eventTime = Clock::now() - std::chrono::minutes(6); - { - MapObject poi; - poi.SetBestType("tourism-hotel"); - poi.SetPos({53.653005, 108.143548}); - MapObject::Event eventInfo; - - eventInfo.m_eventTime = Clock::now() - std::chrono::hours(24 * 20 * 3); - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::Open; - poi.GetEditableEvents().emplace_back(eventInfo); - - eventInfo.m_eventTime = eventTime; - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::BookingReviews; - poi.GetEditableEvents().emplace_back(eventInfo); - - eventInfo.m_eventTime = Clock::now() - std::chrono::minutes(3); - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::Open; - poi.GetEditableEvents().emplace_back(eventInfo); - - eventInfo.m_eventTime = Clock::now() - std::chrono::minutes(1); - eventInfo.m_userPos = {53.016347, 158.683327}; - eventInfo.m_type = MapObject::Event::Type::RouteToCreated; - poi.GetEditableEvents().emplace_back(eventInfo); - - info.m_mapObjects.Add(poi); - } - - info.m_crossReferences.m_transitionToBookingTime = eventTime; - EyeForTesting::SetInfo(info); - settings::Set("BookingCrossReferenceIsAwaiting", true); - api.OnEnterForeground(); - - result = {}; - api.GetCrossReferenceLinkAfterBooking([&result](std::string const & url) - { - result = url; - testing::Notify(); - }); - - testing::Wait(); - TEST_NOT_EQUAL(result.find(kTestOsmId, 0), std::string::npos, ()); -} - UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, CrossReference_GetCrossReferenceCityGallery) { - {} cross_reference::Api api("http://localhost:34568/gallery/city/"); api.SetDelegate(std::make_unique<DelegateForTesting>()); |