From 38d4d493996f5c5684ece47d45f5cc987fb74bf5 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti <jv@jviotti.com> Date: Tue, 7 Jan 2025 15:18:38 -0400 Subject: [PATCH] [WIP] Introduce a basic search API Signed-off-by: Juan Cruz Viotti <jv@jviotti.com> --- src/server/CMakeLists.txt | 1 + src/server/server.cc | 36 +++++++++++++++++++++++++++++++++++- test/e2e/ce/search.hurl | 10 ++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/e2e/ce/search.hurl diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index cdd6e17..2aed4f3 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -4,6 +4,7 @@ noa_add_default_options(PRIVATE schema_registry_server) set_target_properties(schema_registry_server PROPERTIES OUTPUT_NAME sourcemeta-registry-server) target_link_libraries(schema_registry_server PRIVATE sourcemeta::jsontoolkit::uri) target_link_libraries(schema_registry_server PRIVATE sourcemeta::jsontoolkit::json) +target_link_libraries(schema_registry_server PRIVATE sourcemeta::jsontoolkit::jsonl) target_link_libraries(schema_registry_server PRIVATE sourcemeta::jsontoolkit::jsonschema) target_link_libraries(schema_registry_server PRIVATE sourcemeta::hydra::http) target_link_libraries(schema_registry_server PRIVATE sourcemeta::hydra::httpserver) diff --git a/src/server/server.cc b/src/server/server.cc index 6c681b6..cbc5bcd 100644 --- a/src/server/server.cc +++ b/src/server/server.cc @@ -3,6 +3,7 @@ #include <sourcemeta/hydra/httpserver.h> #include <sourcemeta/jsontoolkit/json.h> +#include <sourcemeta/jsontoolkit/jsonl.h> #include <sourcemeta/jsontoolkit/jsonschema.h> #include <sourcemeta/jsontoolkit/uri.h> @@ -17,7 +18,7 @@ #include <memory> // std::unique_ptr #include <optional> // std::optional, std::nullopt #include <sstream> // std::ostringstream -#include <string> // std::string +#include <string> // std::string, std::getline #include <string_view> // std::string_view #include <utility> // std::move @@ -106,6 +107,38 @@ auto on_index(const sourcemeta::hydra::http::ServerLogger &, sourcemeta::hydra::http::serve_file( *(__global_data) / "generated" / "index.html", request, response); } + +auto on_search(const sourcemeta::hydra::http::ServerLogger &logger, + const sourcemeta::hydra::http::ServerRequest &request, + sourcemeta::hydra::http::ServerResponse &response) -> void { + const auto query{request.query("q")}; + if (!query.has_value()) { + json_error(logger, request, response, + sourcemeta::hydra::http::Status::BAD_REQUEST, "missing-query", + "You must provide a query parameter to search for"); + return; + } + + auto stream = sourcemeta::jsontoolkit::read_file( + *(__global_data) / "generated" / "search.jsonl"); + std::string line; + while (std::getline(stream, line)) { + std::cerr << line << "\n"; + if (stream.bad()) { + std::cerr << "BAD\n"; + } + if (stream.fail()) { + std::cerr << "FAIL\n"; + } + if (stream.eof()) { + std::cerr << "EOF\n"; + } + } + + std::cerr << "XXXX: " << query.value() << "\n"; + response.status(sourcemeta::hydra::http::Status::OK); + response.end(); +} #endif static auto on_request(const sourcemeta::hydra::http::ServerLogger &logger, @@ -250,6 +283,7 @@ auto main(int argc, char *argv[]) noexcept -> int { sourcemeta::hydra::http::Server server; #ifdef SOURCEMETA_REGISTRY_ENTERPRISE server.route(sourcemeta::hydra::http::Method::GET, "/", on_index); + server.route(sourcemeta::hydra::http::Method::GET, "/search", on_search); #endif server.route(sourcemeta::hydra::http::Method::GET, "/*", on_request); server.route(sourcemeta::hydra::http::Method::HEAD, "/*", on_request); diff --git a/test/e2e/ce/search.hurl b/test/e2e/ce/search.hurl new file mode 100644 index 0000000..88032a9 --- /dev/null +++ b/test/e2e/ce/search.hurl @@ -0,0 +1,10 @@ +GET {{base}}/search?q=foo +HTTP 404 +Content-Type: application/json +[Captures] +current_request_id: header "X-Request-id" +[Asserts] +jsonpath "$.code" == 404 +jsonpath "$.error" == "not-found" +jsonpath "$.message" == "There is no schema at this URL" +jsonpath "$.request" == "{{current_request_id}}"