From 29261796d4f557ed1b5c491b323a811cd831131c Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Thu, 14 Nov 2019 20:25:35 +0300 Subject: [PATCH] [core] bookmarks catalog headers are provided into corresponding requests --- map/CMakeLists.txt | 3 ++ map/bookmark_catalog.cpp | 11 ++++++- map/bookmark_catalog.hpp | 15 +++++++-- map/bookmark_manager.cpp | 2 ++ map/bookmark_manager.hpp | 11 ++++--- map/catalog_headers_provider.cpp | 31 +++++++++++++++++++ map/catalog_headers_provider.hpp | 22 +++++++++++++ map/framework.cpp | 7 ++++- map/framework.hpp | 6 ++-- map/map_tests/bookmarks_test.cpp | 2 ++ map/position_provider.hpp | 13 ++++++++ map/promo_delegate.cpp | 13 ++++++-- map/promo_delegate.hpp | 7 ++++- .../partners_api_tests/promo_tests.cpp | 2 +- partners_api/promo_api.cpp | 18 +++++------ partners_api/promo_api.hpp | 2 ++ platform/http_client.hpp | 2 -- web_api/request_headers.cpp | 31 +++++++++++++++++++ web_api/request_headers.hpp | 18 +++++++++-- 19 files changed, 188 insertions(+), 28 deletions(-) create mode 100644 map/catalog_headers_provider.cpp create mode 100644 map/catalog_headers_provider.hpp create mode 100644 map/position_provider.hpp diff --git a/map/CMakeLists.txt b/map/CMakeLists.txt index 699dac3d4d..a4a0a96109 100644 --- a/map/CMakeLists.txt +++ b/map/CMakeLists.txt @@ -32,6 +32,8 @@ set( bookmark_manager.hpp bookmarks_search_params.hpp caching_address_getter.hpp + catalog_headers_provider.cpp + catalog_headers_provider.hpp chart_generator.cpp chart_generator.hpp cloud.cpp @@ -95,6 +97,7 @@ set( onboarding.hpp place_page_info.cpp place_page_info.hpp + position_provider.hpp power_management/power_manager.cpp power_management/power_manager.hpp power_management/power_management_schemas.cpp diff --git a/map/bookmark_catalog.cpp b/map/bookmark_catalog.cpp index 781ab5b0e2..b579436af3 100644 --- a/map/bookmark_catalog.cpp +++ b/map/bookmark_catalog.cpp @@ -5,7 +5,6 @@ #include "web_api/request_headers.hpp" #include "web_api/utils.hpp" -#include "platform/http_client.hpp" #include "platform/http_uploader.hpp" #include "platform/platform.hpp" #include "platform/preferred_languages.hpp" @@ -729,3 +728,13 @@ void BookmarkCatalog::SetInvalidTokenHandler(InvalidTokenHandler && onInvalidTok { m_onInvalidToken = std::move(onInvalidToken); } + +void BookmarkCatalog::SetHeadersProvider(HeadersProvider const & provider) +{ + m_headersProvider = provider; +} + +platform::HttpClient::Headers BookmarkCatalog::GetHeaders() const +{ + return m_headersProvider(); +} diff --git a/map/bookmark_catalog.hpp b/map/bookmark_catalog.hpp index b1ddf239b0..0bafd5ecb5 100644 --- a/map/bookmark_catalog.hpp +++ b/map/bookmark_catalog.hpp @@ -2,8 +2,11 @@ #include "partners_api/utm.hpp" +#include "map/catalog_headers_provider.hpp" + #include "kml/types.hpp" +#include "platform/http_client.hpp" #include "platform/remote_file.hpp" #include "platform/safe_callback.hpp" @@ -53,6 +56,8 @@ public: using CustomPropertiesCallback = platform::SafeCallback; using InvalidTokenHandler = std::function; + using HeadersProvider = std::function; + void RegisterByServerId(std::string const & id); void UnregisterByServerId(std::string const & id); @@ -119,16 +124,20 @@ public: using PingCallback = platform::SafeCallback; void Ping(PingCallback && callback) const; - // Handler can be called from non-UI thread. - void SetInvalidTokenHandler(InvalidTokenHandler && onInvalidToken); - using BookmarksToDeleteCallback = platform::SafeCallback const & serverIds)>; void RequestBookmarksToDelete(std::string const & accessToken, std::string const & userId, std::vector const & serverIds, BookmarksToDeleteCallback && callback) const; + // Handler can be called from non-UI thread. + void SetInvalidTokenHandler(InvalidTokenHandler && onInvalidToken); + + void SetHeadersProvider(HeadersProvider const & provider); + platform::HttpClient::Headers GetHeaders() const; + private: std::set m_downloadingIds; std::set m_registeredInCatalog; InvalidTokenHandler m_onInvalidToken; + HeadersProvider m_headersProvider; }; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index d288629a4e..f0e28a85c1 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -551,6 +551,8 @@ BookmarkManager::BookmarkManager(User & user, Callbacks && callbacks) m_bookmarkCloud.SetInvalidTokenHandler([this] { m_user.ResetAccessToken(); }); m_bookmarkCatalog.SetInvalidTokenHandler([this] { m_user.ResetAccessToken(); }); + + m_bookmarkCatalog.SetHeadersProvider(m_callbacks.m_catalogHeadersProvider); } BookmarkManager::EditSession BookmarkManager::GetEditSession() diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index bbf900712f..5ae7ac3fe5 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -82,14 +82,16 @@ public: using DetachedBookmarksCallback = std::function const &)>; template Callbacks(StringsBundleProvider && stringsBundleProvider, - SearchAPIProvider && searchAPIProvider, CreateListener && createListener, - UpdateListener && updateListener, DeleteListener && deleteListener, - AttachListener && attachListener, DetachListener && detachListener) + SearchAPIProvider && searchAPIProvider, CatalogHeadersProvider && catalogHeaders, + CreateListener && createListener, UpdateListener && updateListener, + DeleteListener && deleteListener, AttachListener && attachListener, + DetachListener && detachListener) : m_getStringsBundle(std::forward(stringsBundleProvider)) , m_getSearchAPI(std::forward(searchAPIProvider)) + , m_catalogHeadersProvider(std::forward(catalogHeaders)) , m_createdBookmarksCallback(std::forward(createListener)) , m_updatedBookmarksCallback(std::forward(updateListener)) , m_deletedBookmarksCallback(std::forward(deleteListener)) @@ -99,6 +101,7 @@ public: GetStringsBundleFn m_getStringsBundle; GetSeacrhAPIFn m_getSearchAPI; + BookmarkCatalog::HeadersProvider m_catalogHeadersProvider; CreatedBookmarksCallback m_createdBookmarksCallback; UpdatedBookmarksCallback m_updatedBookmarksCallback; DeletedBookmarksCallback m_deletedBookmarksCallback; diff --git a/map/catalog_headers_provider.cpp b/map/catalog_headers_provider.cpp new file mode 100644 index 0000000000..b81711dedf --- /dev/null +++ b/map/catalog_headers_provider.cpp @@ -0,0 +1,31 @@ +#include "map/catalog_headers_provider.hpp" + +CatalogHeadersProvider::CatalogHeadersProvider(PositionProvider const & positionProvider, + storage::Storage const & storage) + : m_positionProvider(positionProvider) + , m_storage(storage) +{ +} + +platform::HttpClient::Headers CatalogHeadersProvider::GetHeaders() +{ + web_api::HeadersParams params; + params.m_currentPosition = m_positionProvider.GetCurrentPosition(); + + storage::CountriesVec localMaps; + m_storage.GetLocalRealMaps(localMaps); + auto const & countryToCity = m_storage.GetMwmTopCityGeoIds(); + auto & countries = params.m_countryGeoids; + auto & cities = params.m_cityGeoids; + for (auto const id : localMaps) + { + auto const countryIds = m_storage.GetTopCountryGeoIds(id); + countries.insert(countries.end(), countryIds.cbegin(), countryIds.cend()); + + auto const cityIt = countryToCity.find(id); + if (cityIt != countryToCity.cend()) + cities.push_back(cityIt->second); + } + + return web_api::GetCatalogHeaders(params); +} diff --git a/map/catalog_headers_provider.hpp b/map/catalog_headers_provider.hpp new file mode 100644 index 0000000000..df920fc43a --- /dev/null +++ b/map/catalog_headers_provider.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "map/position_provider.hpp" + +#include "storage/storage.hpp" + +#include "web_api/request_headers.hpp" + +#include "platform/http_client.hpp" + +class CatalogHeadersProvider +{ +public: + CatalogHeadersProvider(PositionProvider const & positionProvider, + storage::Storage const & storage); + + platform::HttpClient::Headers GetHeaders(); + +private: + PositionProvider const & m_positionProvider; + storage::Storage const & m_storage; +}; diff --git a/map/framework.cpp b/map/framework.cpp index 2acbe2c853..e7a64f9e59 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1,5 +1,6 @@ #include "map/framework.hpp" #include "map/benchmark_tools.hpp" +#include "map/catalog_headers_provider.hpp" #include "map/chart_generator.hpp" #include "map/displayed_categories_modifiers.hpp" #include "map/everywhere_search_params.hpp" @@ -421,10 +422,13 @@ Framework::Framework(FrameworkParams const & params) InitSearchAPI(); LOG(LDEBUG, ("Search API initialized")); + + auto const catalogHeadersProvider = make_shared(*this, m_storage); m_bmManager = make_unique(m_user, BookmarkManager::Callbacks( [this]() -> StringsBundle const & { return m_stringsBundle; }, [this]() -> SearchAPI & { return GetSearchAPI(); }, + [catalogHeadersProvider]() { return catalogHeadersProvider->GetHeaders(); }, [this](vector const & marks) { GetSearchAPI().OnBookmarksCreated(marks); }, [this](vector const & marks) { GetSearchAPI().OnBookmarksUpdated(marks); }, [this](vector const & marks) { GetSearchAPI().OnBookmarksDeleted(marks); }, @@ -514,7 +518,8 @@ Framework::Framework(FrameworkParams const & params) GetPowerManager().Subscribe(this); GetPowerManager().Load(); - m_promoApi->SetDelegate(make_unique(m_featuresFetcher.GetDataSource(), *m_cityFinder)); + m_promoApi->SetDelegate(make_unique(m_featuresFetcher.GetDataSource(), + *m_cityFinder, catalogHeadersProvider)); eye::Eye::Instance().Subscribe(m_promoApi.get()); // Clean the no longer used key from old devices. diff --git a/map/framework.hpp b/map/framework.hpp index c876d52a09..e2d6c09f15 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -13,6 +13,7 @@ #include "map/mwm_url.hpp" #include "map/notifications/notification_manager.hpp" #include "map/place_page_info.hpp" +#include "map/position_provider.hpp" #include "map/power_management/power_management_schemas.hpp" #include "map/power_management/power_manager.hpp" #include "map/purchase.hpp" @@ -151,7 +152,8 @@ struct FrameworkParams {} }; -class Framework : public SearchAPI::Delegate, +class Framework : public PositionProvider, + public SearchAPI::Delegate, public RoutingManager::Delegate, public TipsApi::Delegate, private power_management::PowerManager::Subscriber @@ -378,7 +380,7 @@ public: search::Results::ConstIter end, bool clear, booking::filter::Types types) override; void ClearViewportSearchResults() override; - // SearchApi::Delegate and TipsApi::Delegate override. + // PositionProvider, SearchApi::Delegate and TipsApi::Delegate override. boost::optional GetCurrentPosition() const override; bool ParseSearchQueryCommand(search::SearchParams const & params) override; search::ProductInfo GetProductInfo(search::Result const & result) const override; diff --git a/map/map_tests/bookmarks_test.cpp b/map/map_tests/bookmarks_test.cpp index a7eac2242c..0989a2d39e 100644 --- a/map/map_tests/bookmarks_test.cpp +++ b/map/map_tests/bookmarks_test.cpp @@ -143,6 +143,7 @@ BookmarkManager::Callbacks const bmCallbacks( return dummyBundle; }, static_cast(nullptr), + static_cast(nullptr), static_cast(nullptr), static_cast(nullptr), static_cast(nullptr), @@ -1221,6 +1222,7 @@ UNIT_CLASS_TEST(Runner, Bookmarks_Listeners) return dummyBundle; }, static_cast(nullptr), + static_cast(nullptr), onCreate, onUpdate, onDelete, onAttach, onDetach); User user; diff --git a/map/position_provider.hpp b/map/position_provider.hpp new file mode 100644 index 0000000000..1bc0da6ea2 --- /dev/null +++ b/map/position_provider.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "geometry/point2d.hpp" + +#include + +class PositionProvider +{ +public: + virtual ~PositionProvider() = default; + + virtual boost::optional GetCurrentPosition() const = 0; +}; diff --git a/map/promo_delegate.cpp b/map/promo_delegate.cpp index 71a925fe66..96baa635cb 100644 --- a/map/promo_delegate.cpp +++ b/map/promo_delegate.cpp @@ -7,8 +7,9 @@ #include "base/string_utils.hpp" -PromoDelegate::PromoDelegate(DataSource const & dataSource, search::CityFinder & cityFinder) - : m_dataSource(dataSource), m_cityFinder(cityFinder) +PromoDelegate::PromoDelegate(DataSource const & dataSource, search::CityFinder & cityFinder, + std::shared_ptr const & headersProvider) + : m_dataSource(dataSource), m_cityFinder(cityFinder), m_headersProvider(headersProvider) { } @@ -39,3 +40,11 @@ std::string PromoDelegate::GetCityId(m2::PointD const & point) return {}; } + +platform::HttpClient::Headers PromoDelegate::GetHeaders() +{ + if (!m_headersProvider) + return {}; + + return m_headersProvider->GetHeaders(); +} diff --git a/map/promo_delegate.hpp b/map/promo_delegate.hpp index e5a823afbc..531c93fbc7 100644 --- a/map/promo_delegate.hpp +++ b/map/promo_delegate.hpp @@ -1,5 +1,7 @@ #pragma once +#include "map/catalog_headers_provider.hpp" + #include "partners_api/promo_api.hpp" #include "indexer/feature_to_osm.hpp" @@ -19,13 +21,16 @@ class CityFinder; class PromoDelegate : public promo::Api::Delegate { public: - PromoDelegate(DataSource const & dataSource, search::CityFinder & cityFinder); + PromoDelegate(DataSource const & dataSource, search::CityFinder & cityFinder, + std::shared_ptr const & headersProvider); std::string GetCityId(m2::PointD const & point) override; + platform::HttpClient::Headers GetHeaders() override; private: DataSource const & m_dataSource; search::CityFinder & m_cityFinder; + std::shared_ptr m_headersProvider; // todo(@a, @m) Drop the unique_ptr and add an IsLoaded() method? std::unique_ptr m_cities; }; diff --git a/partners_api/partners_api_tests/promo_tests.cpp b/partners_api/partners_api_tests/promo_tests.cpp index 880b917fd2..a5f96f71fe 100644 --- a/partners_api/partners_api_tests/promo_tests.cpp +++ b/partners_api/partners_api_tests/promo_tests.cpp @@ -8,7 +8,6 @@ #include "platform/platform_tests_support/async_gui_thread.hpp" -#include #include using namespace eye; @@ -38,6 +37,7 @@ class DelegateForTesting : public promo::Api::Delegate { public: std::string GetCityId(m2::PointD const &) override { return kTestId; } + platform::HttpClient::Headers GetHeaders() override { return {}; } }; } // namespace diff --git a/partners_api/promo_api.cpp b/partners_api/promo_api.cpp index 4b9d4c32ee..9b01733c15 100644 --- a/partners_api/promo_api.cpp +++ b/partners_api/promo_api.cpp @@ -1,7 +1,5 @@ #include "partners_api/promo_api.hpp" -#include "web_api/request_headers.hpp" - #include "platform/http_client.hpp" #include "platform/platform.hpp" #include "platform/preferred_languages.hpp" @@ -165,9 +163,8 @@ std::string GetCityCatalogueUrl(std::string const & baseUrl, std::string const & return baseUrl + "v2/mobilefront/city/" + ToSignedId(id); } - -void GetPromoGalleryImpl(std::string const & url, UTM utm, - CityGalleryCallback const & onSuccess, OnError const & onError) +void GetPromoGalleryImpl(std::string const & url, platform::HttpClient::Headers const & headers, + UTM utm, CityGalleryCallback const & onSuccess, OnError const & onError) { if (url.empty()) { @@ -175,13 +172,13 @@ void GetPromoGalleryImpl(std::string const & url, UTM utm, return; } - GetPlatform().RunTask(Platform::Thread::Network, [url, utm, onSuccess, onError]() + GetPlatform().RunTask(Platform::Thread::Network, [url, headers, utm, onSuccess, onError]() { CityGallery result; std::string httpResult; platform::HttpClient request(url); request.SetTimeout(5 /* timeoutSec */); - request.SetRawHeaders(web_api::GetDefaultCatalogHeaders()); + request.SetRawHeaders(headers); if (!request.RunHttpRequest(httpResult)) { onError(); @@ -270,7 +267,8 @@ void Api::GetCityGallery(m2::PointD const & point, std::string const & lang, UTM { CHECK(m_delegate, ()); auto const url = MakeCityGalleryUrl(m_baseUrl, m_delegate->GetCityId(point), lang); - GetPromoGalleryImpl(url, utm, onSuccess, onError); + auto const headers = m_delegate->GetHeaders(); + GetPromoGalleryImpl(url, headers, utm, onSuccess, onError); } void Api::GetPoiGallery(m2::PointD const & point, std::string const & lang, Tags const & tags, @@ -278,9 +276,11 @@ void Api::GetPoiGallery(m2::PointD const & point, std::string const & lang, Tags OnError const & onError) const { CHECK(m_delegate, ()); + auto const url = MakePoiGalleryUrl(m_baseUrl, m_delegate->GetCityId(point), point, lang, tags, useCoordinates); - GetPromoGalleryImpl(url, utm, onSuccess, onError); + auto const headers = m_delegate->GetHeaders(); + GetPromoGalleryImpl(url, headers, utm, onSuccess, onError); } void Api::OnTransitionToBooking(m2::PointD const & hotelPos) diff --git a/partners_api/promo_api.hpp b/partners_api/promo_api.hpp index cc922a894f..c16d33bc87 100644 --- a/partners_api/promo_api.hpp +++ b/partners_api/promo_api.hpp @@ -4,6 +4,7 @@ #include "metrics/eye.hpp" +#include "platform/http_client.hpp" #include "platform/safe_callback.hpp" #include "geometry/point2d.hpp" @@ -85,6 +86,7 @@ public: virtual ~Delegate() = default; virtual std::string GetCityId(m2::PointD const & point) = 0; + virtual platform::HttpClient::Headers GetHeaders() = 0; }; Api(std::string const & baseUrl = BOOKMARKS_CATALOG_FRONT_URL, diff --git a/platform/http_client.hpp b/platform/http_client.hpp index 2deb923384..547984cfa1 100644 --- a/platform/http_client.hpp +++ b/platform/http_client.hpp @@ -53,8 +53,6 @@ public: // Check by default: ErrorCode() == 200 bool RunHttpRequest(std::string & response, SuccessChecker checker = nullptr); - // Shared methods for all platforms, implemented at http_client.cpp - HttpClient & SetDebugMode(bool debug_mode); HttpClient & SetUrlRequested(std::string const & url); HttpClient & SetHttpMethod(std::string const & method); // This method is mutually exclusive with set_body_data(). diff --git a/web_api/request_headers.cpp b/web_api/request_headers.cpp index 929ceea3ea..e43633c58a 100644 --- a/web_api/request_headers.cpp +++ b/web_api/request_headers.cpp @@ -4,14 +4,45 @@ #include "platform/platform.hpp" +#include "geometry/mercator.hpp" + +#include "base/string_utils.hpp" + namespace web_api { +namespace +{ char const * const kDeviceIdHeader = "X-Mapsme-Device-Id"; char const * const kUserAgentHeader = "User-Agent"; +char const * const kCitiesHeader = "X-Mapsme-City-Ids"; +char const * const kCountriesHeader = "X-Mapsme-Country-Ids"; +char const * const kLatLonHeader = "X-Mapsme-Lat-Lon"; +} // namespace platform::HttpClient::Headers GetDefaultCatalogHeaders() { return {{kUserAgentHeader, GetPlatform().GetAppUserAgent()}, {kDeviceIdHeader, DeviceId()}}; } + +platform::HttpClient::Headers GetCatalogHeaders(HeadersParams const & params) +{ + platform::HttpClient::Headers result = GetDefaultCatalogHeaders(); + + if (params.m_currentPosition) + { + std::ostringstream latLonStream; + auto const latLon = mercator::ToLatLon(params.m_currentPosition.get()); + latLonStream << std::fixed << std::setprecision(3) << latLon.m_lat << "," << latLon.m_lon; + result.emplace(kLatLonHeader, latLonStream.str()); + } + + if (!params.m_cityGeoids.empty()) + result.emplace(kCitiesHeader, strings::JoinAny(params.m_cityGeoids)); + + if (!params.m_countryGeoids.empty()) + result.emplace(kCountriesHeader, strings::JoinAny(params.m_countryGeoids)); + + return result; +} } // namespace web_api diff --git a/web_api/request_headers.hpp b/web_api/request_headers.hpp index 0c0146a577..f8d019018b 100644 --- a/web_api/request_headers.hpp +++ b/web_api/request_headers.hpp @@ -2,10 +2,24 @@ #include "platform/http_client.hpp" +#include "geometry/point2d.hpp" + +#include "base/geo_object_id.hpp" + +#include + +#include + namespace web_api { -extern char const * const kDeviceIdHeader; -extern char const * const kUserAgentHeader; +class HeadersParams +{ +public: + boost::optional m_currentPosition; + std::vector m_countryGeoids; + std::vector m_cityGeoids; +}; platform::HttpClient::Headers GetDefaultCatalogHeaders(); +platform::HttpClient::Headers GetCatalogHeaders(HeadersParams const & params); } // namespace web_api