From 52b3cd46c76fd4be18aeb8422a08a073484b9fad Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Sat, 29 Aug 2026 12:01:42 +0200 Subject: More module implementation partition units --- server/src/rwgps.cppm | 112 ++------------------------------------------------ 1 file changed, 4 insertions(+), 108 deletions(-) (limited to 'server/src/rwgps.cppm') diff --git a/server/src/rwgps.cppm b/server/src/rwgps.cppm index 3b01e6c..2ed124e 100644 --- a/server/src/rwgps.cppm +++ b/server/src/rwgps.cppm @@ -1,8 +1,6 @@ module; -#include -#include -#include +#include export module routemon:rwgps; @@ -10,10 +8,7 @@ import std; import :http.client; import :log; -namespace beast = boost::beast; -namespace bhttp = beast::http; namespace net = boost::asio; -namespace json = boost::json; namespace routemon::rwgps { @@ -45,55 +40,6 @@ struct get_routes_response get_routes_meta meta; }; -auto tag_invoke(json::value_to_tag const&, json::value const& jv) - -> route_summary -{ - return { - .id = json::value_to(jv.at("id")), - .user_id = json::value_to(jv.at("user_id")), - .url = json::value_to(jv.at("url")), - .name = json::value_to(jv.at("name")), - .description = json::value_to(jv.at("description")), - }; -} - -auto tag_invoke(json::value_to_tag const&, json::value const& jv) - -> pagination -{ - return { - .record_count = json::value_to(jv.at("record_count")), - .page_count = json::value_to(jv.at("page_count")), - .page_size = json::value_to(jv.at("page_size")), - .next_page_url = - json::value_to>(jv.at("next_page_url")), - }; -} - -auto tag_invoke( - json::value_to_tag const&, json::value const& jv) - -> get_routes_meta -{ - return { - .pagination = json::value_to(jv.at("pagination")), - }; -} - -auto tag_invoke( - json::value_to_tag const&, json::value const& jv) - -> get_routes_response -{ - return { - .routes = json::value_to>(jv.at("routes")), - .meta = json::value_to(jv.at("meta")), - }; -} - -auto json_value_to_get_routes_response(json::value const& jv) - -> get_routes_response -{ - return json::value_to(jv); -} - export class client { log::logger l_; @@ -101,64 +47,14 @@ export class client std::string api_key_; std::string auth_token_; - static constexpr std::string host = "ridewithgps.com"; - - // TODO: handle failure appropriately - auto get_routes_page(std::size_t page) -> get_routes_response - { - auto req = bhttp::request{ - bhttp::verb::get, - std::format("/api/v1/routes.json?page_size=200?page={}", page), - 11, // HTTP 1.1 - }; - req.set(bhttp::field::host, host); - req.set("x-rwgps-api-key", api_key_); - req.set("x-rwgps-auth-token", auth_token_); - - auto rsp = hc_.do_request(req); - auto p = json::stream_parser{}; - for (auto const frag : rsp.body().cdata()) - { - p.write(static_cast(frag.data()), frag.size()); - } - assert(p.done()); - return json_value_to_get_routes_response(p.release()); - } + auto get_routes_page(std::size_t page) -> get_routes_response; public: explicit client( net::io_context& ioc, log::logger const& l, std::string api_key, - std::string auth_token) - : l_{l.sub("rwgps-client")}, hc_{ioc}, api_key_{std::move(api_key)}, - auth_token_{std::move(auth_token)} - { - } - - auto get_all_routes() -> std::vector - { - // TODO: make sure that there are no duplicates here. - // What does RWGPS sort on, by default? - // Consider using an associative container instead of a vector. - auto record_count = 0uz; - auto current_page = 0uz; - auto routes = std::vector{}; - - while (true) - { - auto rsp = get_routes_page(current_page); - if (rsp.meta.pagination.next_page_url) - l_.debug("Next page URL: {}", *rsp.meta.pagination.next_page_url); - routes.append_range(rsp.routes); - if (rsp.meta.pagination.record_count > 0) - record_count = rsp.meta.pagination.record_count; - if (rsp.routes.empty() || routes.size() >= record_count) - { - break; - } - } + std::string auth_token); - return routes; - } + auto get_all_routes() -> std::vector; }; } // namespace routemon::rwgps -- cgit v1.3