[partners_api] booking api small changes

This commit is contained in:
Arsentiy Milchakov 2017-11-09 10:46:31 +03:00 committed by Yuri Gorshenin
parent b6c9614c3a
commit f886bd939a
10 changed files with 127 additions and 90 deletions

View file

@ -11,8 +11,8 @@ set(
banner.hpp
booking_api.cpp
booking_api.hpp
booking_http.cpp
booking_http.hpp
booking_availability_params.cpp
booking_availability_params.hpp
cian_api.cpp
cian_api.hpp
facebook_ads.cpp
@ -37,6 +37,7 @@ set(
taxi_provider.hpp
uber_api.cpp
uber_api.hpp
utils.cpp
utils.hpp
viator_api.cpp
viator_api.hpp

View file

@ -1,5 +1,7 @@
#include "partners_api/booking_api.hpp"
#include "partners_api/utils.hpp"
#include "platform/http_client.hpp"
#include "platform/platform.hpp"
#include "coding/url_encode.hpp"
@ -9,6 +11,7 @@
#include "base/thread.hpp"
#include "base/url_helpers.hpp"
#include <chrono>
#include <iostream>
#include <sstream>
#include <utility>
@ -19,7 +22,7 @@
using namespace base;
using namespace booking;
using namespace booking::http;
using namespace platform;
using namespace std;
using namespace std::chrono;
@ -33,6 +36,21 @@ string const kPhotoSmallUrl = "http://aff.bstatic.com/images/hotel/max300/";
string const kSearchBaseUrl = "https://www.booking.com/search.html";
string g_BookingUrlForTesting = "";
bool RunSimpleHttpRequest(bool const needAuth, string const & url, string & result)
{
HttpClient request(url);
if (needAuth)
request.SetUserAndPassword(BOOKING_KEY, BOOKING_SECRET);
return request.RunHttpRequest(result);
}
std::string FormatTime(system_clock::time_point p)
{
return partners_api::FormatTime(p, "%Y-%m-%d");
}
string MakeApiUrlV1(string const & func, url::Params const & params)
{
if (!g_BookingUrlForTesting.empty())
@ -214,7 +232,7 @@ void FillPriceAndCurrency(string const & src, string const & currency, string &
}
}
void FillHotelIds(string const & src, vector<uint64_t> & result)
void FillHotelIds(string const & src, vector<std::string> & result)
{
my::Json root(src.c_str());
auto const resultsArray = json_object_get(root.get(), "result");
@ -225,7 +243,9 @@ void FillHotelIds(string const & src, vector<uint64_t> & result)
for (size_t i = 0; i < size; ++i)
{
auto const obj = json_array_get(resultsArray, i);
FromJSONObject(obj, "hotel_id", result[i]);
uint64_t id = 0;
FromJSONObject(obj, "hotel_id", id);
result[i] = std::to_string(id);
}
}
} // namespace
@ -299,7 +319,8 @@ string Api::GetSearchUrl(string const & city, string const & name) const
return resultStream.str();
}
void Api::GetMinPrice(string const & hotelId, string const & currency, GetMinPriceCallback const & fn)
void Api::GetMinPrice(string const & hotelId, string const & currency,
GetMinPriceCallback const & fn) const
{
GetPlatform().RunOnNetworkThread([hotelId, currency, fn]()
{
@ -326,7 +347,8 @@ void Api::GetMinPrice(string const & hotelId, string const & currency, GetMinPri
});
}
void Api::GetHotelInfo(string const & hotelId, string const & lang, GetHotelInfoCallback const & fn)
void Api::GetHotelInfo(string const & hotelId, string const & lang,
GetHotelInfoCallback const & fn) const
{
GetPlatform().RunOnNetworkThread([hotelId, lang, fn]()
{
@ -355,15 +377,15 @@ void Api::GetHotelInfo(string const & hotelId, string const & lang, GetHotelInfo
}
void Api::GetHotelAvailability(AvailabilityParams const & params,
GetHotelAvailabilityCallback const & fn)
GetHotelAvailabilityCallback const & fn) const
{
GetPlatform().RunOnNetworkThread([params, fn]()
{
std::vector<uint64_t> result;
std::vector<std::string> result;
string httpResult;
if (!RawApi::HotelAvailability(params, httpResult))
{
fn(result);
fn(std::move(result));
return;
}
@ -377,7 +399,7 @@ void Api::GetHotelAvailability(AvailabilityParams const & params,
result.clear();
}
fn(result);
fn(std::move(result));
});
}

View file

@ -1,6 +1,6 @@
#pragma once
#include "partners_api/booking_http.hpp"
#include "partners_api/booking_availability_params.hpp"
#include "platform/safe_callback.hpp"
@ -55,13 +55,16 @@ public:
static bool GetHotelAvailability(std::string const & hotelId, std::string const & currency, std::string & result);
static bool GetExtendedInfo(std::string const & hotelId, std::string const & lang, std::string & result);
// Booking Api v2 methods:
static bool HotelAvailability(http::AvailabilityParams const & params, std::string & result);
static bool HotelAvailability(AvailabilityParams const & params, std::string & result);
};
using GetMinPriceCallback = platform::SafeCallback<void(std::string const & hotelId, std::string const & price, std::string const & currency)>;
using GetHotelInfoCallback = platform::SafeCallback<void(HotelInfo const & hotelInfo)>;
using GetHotelAvailabilityCallback = platform::SafeCallback<void(std::vector<uint64_t> hotelIds)>;
// NOTE: this callback will be called NOT on main thread.
using GetHotelAvailabilityCallback = std::function<void(std::vector<std::string> hotelIds)>;
/// Guarantees the preservation of the sequence of calls callbacks in accordance with
/// the sequence of method calls.
class Api
{
public:
@ -72,14 +75,17 @@ public:
/// Real-time information methods (used for retrieving rapidly changing information).
/// These methods send requests directly to Booking.
void GetMinPrice(std::string const & hotelId, std::string const & currency, GetMinPriceCallback const & fn);
void GetMinPrice(std::string const & hotelId, std::string const & currency,
GetMinPriceCallback const & fn) const;
/// NOTE: callback will be called NOT on main thread.
void GetHotelAvailability(AvailabilityParams const & params,
GetHotelAvailabilityCallback const & fn) const;
/// Static information methods (use for information that can be cached).
/// These methods use caching server to prevent Booking from being ddossed.
void GetHotelInfo(std::string const & hotelId, std::string const & lang, GetHotelInfoCallback const & fn);
void GetHotelAvailability(http::AvailabilityParams const & params,
GetHotelAvailabilityCallback const & fn);
void GetHotelInfo(std::string const & hotelId, std::string const & lang,
GetHotelInfoCallback const & fn) const;
};
void SetBookingUrlForTesting(std::string const & url);

View file

@ -1,41 +1,22 @@
#include "partners_api/booking_http.hpp"
#include "platform/http_client.hpp"
#include "partners_api/booking_availability_params.hpp"
#include "partners_api/utils.hpp"
#include "base/string_utils.hpp"
#include <ctime>
#include <iomanip>
#include "private.h"
using namespace base::url;
using namespace platform;
using namespace std;
using namespace std::chrono;
namespace
{
std::string FormatTime(booking::AvailabilityParams::Time p)
{
return partners_api::FormatTime(p, "%Y-%m-%d");
}
} // namespace
namespace booking
{
namespace http
{
bool RunSimpleHttpRequest(bool const needAuth, string const & url, string & result)
{
HttpClient request(url);
if (needAuth)
request.SetUserAndPassword(BOOKING_KEY, BOOKING_SECRET);
return request.RunHttpRequest(result);
}
string FormatTime(Time p)
{
time_t t = duration_cast<seconds>(p.time_since_epoch()).count();
ostringstream os;
os << put_time(gmtime(&t), "%Y-%m-%d");
return os.str();
}
Params AvailabilityParams::Get() const
{
Params result;
@ -55,5 +36,9 @@ Params AvailabilityParams::Get() const
return result;
}
} // namespace http
bool AvailabilityParams::IsEmpty() const
{
return m_checkin == Time() || m_checkout == Time() || m_rooms.empty();
}
} // namespace booking

View file

@ -8,22 +8,17 @@
namespace booking
{
namespace http
{
bool RunSimpleHttpRequest(bool const needAuth, std::string const & url, std::string & result);
using Time = std::chrono::system_clock::time_point;
using Hotels = std::vector<std::string>;
using Rooms = std::vector<std::string>;
using Stars = std::vector<std::string>;
std::string FormatTime(Time p);
/// Params for checking availability of hotels.
/// [m_hotelIds], [m_checkin], [m_checkout], [m_rooms] are required.
struct AvailabilityParams
{
using Time = std::chrono::system_clock::time_point;
using Hotels = std::vector<std::string>;
using Rooms = std::vector<std::string>;
using Stars = std::vector<std::string>;
base::url::Params Get() const;
bool IsEmpty() const;
/// Limit the result list to the specified hotels where they have availability for the
/// specified guests and dates.
@ -44,5 +39,4 @@ struct AvailabilityParams
/// Limit to hotels with the given number(s) of stars. Supported values 1-5.
Stars m_stars;
};
} // namespace http
} // namespace booking

View file

@ -12,7 +12,7 @@ SOURCES += \
ads_base.cpp \
ads_engine.cpp \
booking_api.cpp \
booking_http.cpp \
booking_availability_params.cpp \
cian_api.cpp \
facebook_ads.cpp \
google_ads.cpp \
@ -24,6 +24,7 @@ SOURCES += \
taxi_countries.cpp \
taxi_engine.cpp \
uber_api.cpp \
utils.cpp \
viator_api.cpp \
yandex_api.cpp \
@ -32,7 +33,7 @@ HEADERS += \
ads_engine.hpp \
banner.hpp \
booking_api.hpp \
booking_http.hpp \
booking_availability_params.hpp
cian_api.hpp \
facebook_ads.hpp \
google_ads.hpp \

View file

@ -4,13 +4,10 @@
#include "partners_api/booking_api.hpp"
#include "base/scope_guard.hpp"
#include <chrono>
using namespace partners_api;
using namespace booking;
using namespace booking::http;
namespace
{
@ -143,15 +140,15 @@ UNIT_CLASS_TEST(AsyncGuiThread, GetHotelInfo)
UNIT_CLASS_TEST(AsyncGuiThreadBooking, GetHotelAvailability)
{
AvailabilityParams params;
params.m_hotelIds = {"77615", "10623"};
params.m_hotelIds = {"0"}; // Internal hotel id for testing.
params.m_rooms = {"A,A"};
params.m_checkin = std::chrono::system_clock::now() + std::chrono::hours(24);
params.m_checkout = std::chrono::system_clock::now() + std::chrono::hours(24 * 7);
params.m_stars = {"4"};
Api api;
std::vector<uint64_t> result;
std::vector<std::string> result;
api.GetHotelAvailability(params, [&result](std::vector<uint64_t> const & r)
api.GetHotelAvailability(params, [&result](std::vector<std::string> const & r)
{
result = r;
testing::Notify();
@ -159,8 +156,8 @@ UNIT_CLASS_TEST(AsyncGuiThreadBooking, GetHotelAvailability)
testing::Wait();
TEST_EQUAL(result.size(), 3, ());
TEST_EQUAL(result[0], 10623, ());
TEST_EQUAL(result[1], 10624, ());
TEST_EQUAL(result[2], 10625, ());
TEST_EQUAL(result[0], "10623", ());
TEST_EQUAL(result[1], "10624", ());
TEST_EQUAL(result[2], "10625", ());
}
}

33
partners_api/utils.cpp Normal file
View file

@ -0,0 +1,33 @@
#include "partners_api/utils.hpp"
#include <ctime>
#include <iomanip>
#include <sstream>
using namespace std;
using namespace std::chrono;
namespace partners_api
{
namespace http
{
Result RunSimpleRequest(std::string const & url)
{
platform::HttpClient request(url);
bool result = false;
if (request.RunHttpRequest() && !request.WasRedirected() && request.ErrorCode() == 200)
result = true;
return {result, request.ErrorCode(), request.ServerResponse()};
}
} // namespace http
string FormatTime(system_clock::time_point p, string const & format)
{
time_t t = duration_cast<seconds>(p.time_since_epoch()).count();
ostringstream os;
os << put_time(gmtime(&t), format.c_str());
return os.str();
}
} // namespace partners_api

View file

@ -2,6 +2,7 @@
#include "platform/http_client.hpp"
#include <chrono>
#include <string>
namespace partners_api
@ -22,15 +23,8 @@ struct Result
std::string m_data;
};
inline Result RunSimpleRequest(std::string const & url)
{
platform::HttpClient request(url);
bool result = false;
if (request.RunHttpRequest() && !request.WasRedirected() && request.ErrorCode() == 200)
result = true;
return {result, request.ErrorCode(), request.ServerResponse()};
}
Result RunSimpleRequest(std::string const & url);
} // namespace http
std::string FormatTime(std::chrono::system_clock::time_point p, std::string const & format);
} // namespace partners_api

View file

@ -19,8 +19,6 @@
3488B0371E9D11860068AFD8 /* ads_engine_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 346E889D1E9D088200D4CE9B /* ads_engine_tests.cpp */; };
3488B0381E9D11890068AFD8 /* rb_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 346E889E1E9D088200D4CE9B /* rb_tests.cpp */; };
3488B0391E9D118D0068AFD8 /* facebook_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3DBC1C501E4B14810016897F /* facebook_tests.cpp */; };
3D3731EF1F98A7AF00D2121B /* booking_http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D3731ED1F98A7AF00D2121B /* booking_http.cpp */; };
3D3731F01F98A7AF00D2121B /* booking_http.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D3731EE1F98A7AF00D2121B /* booking_http.hpp */; };
3D452AEF1EE6D202009EAB9B /* google_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AED1EE6D202009EAB9B /* google_tests.cpp */; };
3D452AF01EE6D202009EAB9B /* mopub_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AEE1EE6D202009EAB9B /* mopub_tests.cpp */; };
3D452AF31EE6D20D009EAB9B /* google_ads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AF11EE6D20D009EAB9B /* google_ads.cpp */; };
@ -33,6 +31,9 @@
3D47B2AD1F14BE89000828D2 /* cian_api.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D47B2AB1F14BE89000828D2 /* cian_api.hpp */; };
3D47B2AF1F14BE94000828D2 /* cian_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D47B2AE1F14BE94000828D2 /* cian_tests.cpp */; };
3D47B2B11F14FA14000828D2 /* utils.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D47B2B01F14FA14000828D2 /* utils.hpp */; };
3D4E997C1FB439260025B48C /* booking_availability_params.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D4E997A1FB439260025B48C /* booking_availability_params.hpp */; };
3D4E997D1FB439260025B48C /* booking_availability_params.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E997B1FB439260025B48C /* booking_availability_params.cpp */; };
3D4E997F1FB439300025B48C /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E997E1FB439300025B48C /* utils.cpp */; };
3D7815761F3A14910068B6AC /* async_gui_thread.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7815751F3A14910068B6AC /* async_gui_thread.hpp */; };
3DBC1C541E4B14920016897F /* facebook_ads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3DBC1C521E4B14920016897F /* facebook_ads.cpp */; };
3DBC1C551E4B14920016897F /* facebook_ads.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3DBC1C531E4B14920016897F /* facebook_ads.hpp */; };
@ -82,8 +83,6 @@
346E889E1E9D088200D4CE9B /* rb_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rb_tests.cpp; sourceTree = "<group>"; };
3475E0E11DBF581B004C7E69 /* common-debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-debug.xcconfig"; path = "../common-debug.xcconfig"; sourceTree = "<group>"; };
3475E0E21DBF581B004C7E69 /* common-release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-release.xcconfig"; path = "../common-release.xcconfig"; sourceTree = "<group>"; };
3D3731ED1F98A7AF00D2121B /* booking_http.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = booking_http.cpp; sourceTree = "<group>"; };
3D3731EE1F98A7AF00D2121B /* booking_http.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_http.hpp; sourceTree = "<group>"; };
3D452AED1EE6D202009EAB9B /* google_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = google_tests.cpp; sourceTree = "<group>"; };
3D452AEE1EE6D202009EAB9B /* mopub_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mopub_tests.cpp; sourceTree = "<group>"; };
3D452AF11EE6D20D009EAB9B /* google_ads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = google_ads.cpp; sourceTree = "<group>"; };
@ -97,6 +96,9 @@
3D47B2AB1F14BE89000828D2 /* cian_api.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cian_api.hpp; sourceTree = "<group>"; };
3D47B2AE1F14BE94000828D2 /* cian_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cian_tests.cpp; sourceTree = "<group>"; };
3D47B2B01F14FA14000828D2 /* utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utils.hpp; sourceTree = "<group>"; };
3D4E997A1FB439260025B48C /* booking_availability_params.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_availability_params.hpp; sourceTree = "<group>"; };
3D4E997B1FB439260025B48C /* booking_availability_params.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = booking_availability_params.cpp; sourceTree = "<group>"; };
3D4E997E1FB439300025B48C /* utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utils.cpp; sourceTree = "<group>"; };
3D7815751F3A14910068B6AC /* async_gui_thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = async_gui_thread.hpp; sourceTree = "<group>"; };
3DBC1C501E4B14810016897F /* facebook_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = facebook_tests.cpp; sourceTree = "<group>"; };
3DBC1C521E4B14920016897F /* facebook_ads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = facebook_ads.cpp; sourceTree = "<group>"; };
@ -185,8 +187,9 @@
F6B5363B1DA520B20067EEA5 /* partners_api */ = {
isa = PBXGroup;
children = (
3D3731ED1F98A7AF00D2121B /* booking_http.cpp */,
3D3731EE1F98A7AF00D2121B /* booking_http.hpp */,
3D4E997E1FB439300025B48C /* utils.cpp */,
3D4E997B1FB439260025B48C /* booking_availability_params.cpp */,
3D4E997A1FB439260025B48C /* booking_availability_params.hpp */,
BB1956E41F543D7B003ECE6C /* locals_api.cpp */,
BB1956E51F543D7C003ECE6C /* locals_api.hpp */,
3D47B2B01F14FA14000828D2 /* utils.hpp */,
@ -296,8 +299,8 @@
3DFEBF9F1EFBFC1500317D5C /* yandex_api.hpp in Headers */,
3DFEBF9D1EFBFC1500317D5C /* taxi_provider.hpp in Headers */,
346E88991E9D087400D4CE9B /* ads_engine.hpp in Headers */,
3D4E997C1FB439260025B48C /* booking_availability_params.hpp in Headers */,
3DFEBF9C1EFBFC1500317D5C /* taxi_engine.hpp in Headers */,
3D3731F01F98A7AF00D2121B /* booking_http.hpp in Headers */,
F6B536431DA520E40067EEA5 /* uber_api.hpp in Headers */,
3DBC1C551E4B14920016897F /* facebook_ads.hpp in Headers */,
BB1956E71F543D7C003ECE6C /* locals_api.hpp in Headers */,
@ -397,12 +400,13 @@
3DFEBFA41EFBFC2300317D5C /* yandex_tests.cpp in Sources */,
3D452AEF1EE6D202009EAB9B /* google_tests.cpp in Sources */,
3D452AF01EE6D202009EAB9B /* mopub_tests.cpp in Sources */,
3D4E997F1FB439300025B48C /* utils.cpp in Sources */,
3430643C1E9FBCF500DC7665 /* mopub_ads.cpp in Sources */,
346E88961E9D087400D4CE9B /* ads_base.cpp in Sources */,
3DFEBF891EF82C1300317D5C /* viator_tests.cpp in Sources */,
3DFEBF851EF82BEA00317D5C /* viator_api.cpp in Sources */,
3D4E997D1FB439260025B48C /* booking_availability_params.cpp in Sources */,
F6B536421DA520E40067EEA5 /* uber_api.cpp in Sources */,
3D3731EF1F98A7AF00D2121B /* booking_http.cpp in Sources */,
3DFEBF9B1EFBFC1500317D5C /* taxi_engine.cpp in Sources */,
346E889B1E9D087400D4CE9B /* rb_ads.cpp in Sources */,
3DBC1C541E4B14920016897F /* facebook_ads.cpp in Sources */,