diff --git a/src/mtconnect/sink/rest_sink/rest_service.cpp b/src/mtconnect/sink/rest_sink/rest_service.cpp index 1f01a8445..0055ac05e 100644 --- a/src/mtconnect/sink/rest_sink/rest_service.cpp +++ b/src/mtconnect/sink/rest_sink/rest_service.cpp @@ -521,22 +521,6 @@ namespace mtconnect { void RestService::createAssetRoutings() { using namespace rest_sink; - auto handler = [&](SessionPtr session, RequestPtr request) -> bool { - auto removed = *request->parameter("removed"); - auto count = *request->parameter("count"); - auto pretty = request->parameter("pretty").value_or(false); - auto format = request->parameter("format"); - auto printer = getPrinter(request->m_accepts, format); - - request->m_request = "MTConnectAssets"; - - respond(session, - assetRequest(printer, count, removed, request->parameter("type"), - request->parameter("device"), pretty, request->m_requestId), - request->m_requestId); - return true; - }; - auto idHandler = [&](SessionPtr session, RequestPtr request) -> bool { auto asset = request->parameter("assetIds"); request->m_request = "MTConnectAssets"; @@ -564,17 +548,43 @@ namespace mtconnect { return true; }; + auto handler = [&](SessionPtr session, RequestPtr request) -> bool { + if (request->parameter("assetIds")) + { + return idHandler(session, request); + } + + auto removed = *request->parameter("removed"); + auto count = *request->parameter("count"); + auto pretty = request->parameter("pretty").value_or(false); + auto format = request->parameter("format"); + auto printer = getPrinter(request->m_accepts, format); + + request->m_request = "MTConnectAssets"; + + respond(session, + assetRequest(printer, count, removed, request->parameter("type"), + request->parameter("device"), pretty, request->m_requestId), + request->m_requestId); + return true; + }; + string qp( "type={string}&removed={bool:false}&" "count={integer:100}&device={string}&pretty={bool:false}&format={string}"); + + m_server->addRouting({boost::beast::http::verb::get, "/asset?" + qp, handler}) + .document("MTConnect assets request", "Returns up to `count` assets"); + m_server->addRouting({boost::beast::http::verb::get, "/{device}/asset?" + qp, handler}) + .document("MTConnect assets request", "Returns up to `count` assets for deivce `device`") + .command("asset"); // Wickelhaus added the asset command for websocket processing. + m_server->addRouting({boost::beast::http::verb::get, "/assets?" + qp, handler}) .document("MTConnect assets request", "Returns up to `count` assets"); - m_server->addRouting({boost::beast::http::verb::get, "/asset?" + qp, handler}) - .document("MTConnect asset request", "Returns up to `count` assets"); m_server->addRouting({boost::beast::http::verb::get, "/{device}/assets?" + qp, handler}) - .document("MTConnect assets request", "Returns up to `count` assets for deivce `device`"); - m_server->addRouting({boost::beast::http::verb::get, "/{device}/asset?" + qp, handler}) - .document("MTConnect asset request", "Returns up to `count` assets for deivce `device`"); + .document("MTConnect assets request", "Returns up to `count` assets for deivce `device`") + .command("assets"); // Wickelhaus added the assets command for websocket processing. + m_server->addRouting({boost::beast::http::verb::get, "/assets/{assetIds}", idHandler}) .document( "MTConnect assets request", @@ -582,7 +592,10 @@ namespace mtconnect { m_server->addRouting({boost::beast::http::verb::get, "/asset/{assetIds}", idHandler}) .document("MTConnect asset request", "Returns a set of assets identified by asset ids `asset` separated by " - "semi-colon (;)"); + "semi-colon (;)") + .command("assetsById"); + // Wickelhaus added assetsById command to process the assetIds values for websocket + // processing. if (m_server->arePutsAllowed()) { @@ -626,28 +639,29 @@ namespace mtconnect { for (const auto &asset : list {"asset", "assets"}) { - for (const auto &t : list {boost::beast::http::verb::put, - boost::beast::http::verb::post}) + for (const auto &verb : list {boost::beast::http::verb::put, + boost::beast::http::verb::post}) { m_server ->addRouting( - {t, "/" + asset + "/{assetId}?device={string}&type={string}&format={string}", + {verb, "/" + asset + "/{assetId}?device={string}&type={string}&format={string}", putHandler}) .document("Upload an asset by identified by `assetId`", "Updates or adds an asset with the asset XML in the body"); m_server - ->addRouting( - {t, "/" + asset + "?device={string}&type={string}&format={string}", putHandler}) + ->addRouting({verb, "/" + asset + "?device={string}&type={string}&format={string}", + putHandler}) .document("Upload an asset by identified by `assetId`", "Updates or adds an asset with the asset XML in the body"); m_server - ->addRouting({t, "/{device}/" + asset + "/{assetId}?type={string}&format={string}", + ->addRouting({verb, + "/{device}/" + asset + "/{assetId}?type={string}&format={string}", putHandler}) .document("Upload an asset by identified by `assetId`", "Updates or adds an asset with the asset XML in the body"); m_server ->addRouting( - {t, "/{device}/" + asset + "?type={string}&format={string}", putHandler}) + {verb, "/{device}/" + asset + "?type={string}&format={string}", putHandler}) .document("Upload an asset by identified by `assetId`", "Updates or adds an asset with the asset XML in the body"); } @@ -1270,7 +1284,7 @@ namespace mtconnect { optional uuid; if (device) { - auto d = m_sinkContract->findDeviceByUUIDorName(*device); + auto d = checkDevice(printer, *device); if (d) uuid = d->getUuid(); } diff --git a/src/mtconnect/sink/rest_sink/websocket_session.hpp b/src/mtconnect/sink/rest_sink/websocket_session.hpp index f43a425e2..3a3338101 100644 --- a/src/mtconnect/sink/rest_sink/websocket_session.hpp +++ b/src/mtconnect/sink/rest_sink/websocket_session.hpp @@ -357,7 +357,6 @@ namespace mtconnect::sink::rest_sink { #ifdef __GOSave__ #define GetObject __GOSave__ #endif - for (auto &it : object) { switch (it.value.GetType()) @@ -380,7 +379,6 @@ namespace mtconnect::sink::rest_sink { case rapidjson::kStringType: request->m_parameters.emplace( make_pair(it.name.GetString(), ParameterValue(string(it.value.GetString())))); - break; case rapidjson::kNumberType: if (it.value.IsInt()) @@ -410,6 +408,9 @@ namespace mtconnect::sink::rest_sink { bool dispatchRequest(RequestPtr &&request) { using namespace std; + LOG(debug) << "Dispatching websocket request"; + if (request->m_command) + LOG(debug) << " command: " << *(request->m_command); if (request->m_parameters.count("id") > 0) { diff --git a/src/mtconnect/utilities.hpp b/src/mtconnect/utilities.hpp index dff98f5d8..0b10cc783 100644 --- a/src/mtconnect/utilities.hpp +++ b/src/mtconnect/utilities.hpp @@ -241,14 +241,15 @@ namespace mtconnect { /// @brief Thread safe localtime function that uses localtime_s or localtime_r based on platform /// @param[in] timer pointer to time_t /// @param[out] buf pointer to tm struct to fill - inline void safe_localtime(const std::time_t* timer, std::tm* buf) { + inline void safe_localtime(const std::time_t *timer, std::tm *buf) + { #ifdef _WINDOWS localtime_s(buf, timer); #else localtime_r(timer, buf); #endif } - + /// @brief Formats the timePoint as string given the format /// @param[in] timePoint the time /// @param[in] format the format diff --git a/test_package/mqtt_entity_sink_test.cpp b/test_package/mqtt_entity_sink_test.cpp index f5b781ab1..4cc274038 100644 --- a/test_package/mqtt_entity_sink_test.cpp +++ b/test_package/mqtt_entity_sink_test.cpp @@ -218,16 +218,15 @@ TEST_F(MqttEntitySinkTest, mqtt_entity_sink_should_use_flat_topic_structure) client->set_keep_alive_sec(30); bool subscribed = false; - client->set_connack_handler( - [client](bool sp, mqtt::connect_return_code connack_return_code) { - if (connack_return_code == mqtt::connect_return_code::accepted) - { - auto pid = client->acquire_unique_packet_id(); - client->async_subscribe(pid, "MTConnect/#", MQTT_NS::qos::at_least_once, - [](MQTT_NS::error_code ec) { EXPECT_FALSE(ec); }); - } - return true; - }); + client->set_connack_handler([client](bool sp, mqtt::connect_return_code connack_return_code) { + if (connack_return_code == mqtt::connect_return_code::accepted) + { + auto pid = client->acquire_unique_packet_id(); + client->async_subscribe(pid, "MTConnect/#", MQTT_NS::qos::at_least_once, + [](MQTT_NS::error_code ec) { EXPECT_FALSE(ec); }); + } + return true; + }); client->set_suback_handler( [&subscribed](std::uint16_t packet_id, std::vector results) {