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}}"