From f7a827ba9b1a975de1c92d958129972788b1dbba Mon Sep 17 00:00:00 2001 From: Lukas Lalinsky Date: Thu, 5 Dec 2024 20:35:28 +0100 Subject: [PATCH 1/2] Change HTTP server to be compatible with the latest version --- src/server/http.cpp | 52 ++++++++++++++++++++-------------------- src/server/http_test.cpp | 18 +++++++------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/server/http.cpp b/src/server/http.cpp index 7e317586..cdf348d9 100644 --- a/src/server/http.cpp +++ b/src/server/http.cpp @@ -52,7 +52,7 @@ static HttpResponse errInvalidParameter(const QString &description) { return errBadRequest("invalid_parameter", description); } -static HttpResponse errInvalidTerms() { return errBadRequest("invalid_terms", "invalid terms"); } +static HttpResponse errInvalidTerms() { return errBadRequest("invalid_hashes", "invalid hashes"); } static QString getIndexName(const HttpRequest &request) { auto indexName = request.param(":index"); @@ -170,7 +170,7 @@ static HttpResponse handlePutDocumentRequest(const HttpRequest &request, const Q if (body.isEmpty()) { return errInvalidTerms(); } - auto terms = parseTerms(body.value("terms")); + auto terms = parseTerms(body.value("hashes")); try { auto writer = index->openWriter(true, 1000); @@ -222,8 +222,8 @@ static HttpResponse handleSearchRequest(const HttpRequest &request, const QShare return HttpResponse(HTTP_OK, QJsonDocument(responseJson)); } -// Handle bulk requests. -static HttpResponse handleBulkRequest(const HttpRequest &request, const QSharedPointer &indexes) { +// Handle bulk update requests. +static HttpResponse handleUpdateRequest(const HttpRequest &request, const QSharedPointer &indexes) { auto index = getIndex(request, indexes); QJsonArray opsJsonArray; @@ -231,39 +231,39 @@ static HttpResponse handleBulkRequest(const HttpRequest &request, const QSharedP auto doc = request.json(); if (doc.isObject()) { auto obj = doc.object(); - if (obj.contains("operations")) { - auto value = obj.value("operations"); + if (obj.contains("changes")) { + auto value = obj.value("changes"); if (value.isArray()) { opsJsonArray = value.toArray(); } else { - return errBadRequest("invalid_bulk_operation", "'operations' must be an array"); + return errBadRequest("invalid_bulk_update", "'changes' must be an array"); } } } else if (doc.isArray()) { opsJsonArray = doc.array(); } else { - return errBadRequest("invalid_bulk_operation", - "request body must be either an array or an object with 'operations' key in it"); + return errBadRequest("invalid_bulk_update", + "request body must be either an array or an object with 'changes' key in it"); } try { auto writer = index->openWriter(true, 1000); - for (auto operation : opsJsonArray) { - if (!operation.isObject()) { - return errBadRequest("invalid_bulk_operation", "operation must be an object"); + for (auto change : opsJsonArray) { + if (!change.isObject()) { + return errBadRequest("invalid_bulk_update", "change must be an object"); } - auto operationObj = operation.toObject(); - if (operationObj.contains("upsert")) { - auto docObj = operationObj.value("upsert").toObject(); + auto changeObj = change.toObject(); + if (changeObj.contains("insert")) { + auto docObj = changeObj.value("insert").toObject(); auto docId = docObj.value("id").toInt(); - auto terms = parseTerms(docObj.value("terms")); + auto terms = parseTerms(docObj.value("hashes")); writer->addDocument(docId, terms.data(), terms.size()); } - if (operationObj.contains("delete")) { + if (changeObj.contains("delete")) { return errNotImplemented("not implemented in this version of acoustid-index"); } - if (operationObj.contains("set")) { - auto attrObj = operationObj.value("set").toObject(); + if (changeObj.contains("set_attribute")) { + auto attrObj = changeObj.value("set").toObject(); auto name = attrObj.value("name").toString(); auto value = attrObj.value("value").toString(); writer->setAttribute(name, value); @@ -294,22 +294,22 @@ HttpRequestHandler::HttpRequestHandler(QSharedPointer indexes, QSharedPoi }); // Document API - m_router.route(HTTP_HEAD, "/:index/_doc/:docId", [=](auto req) { + m_router.route(HTTP_HEAD, "/:index/:docId", [=](auto req) { return handleHeadDocumentRequest(req, m_indexes); }); - m_router.route(HTTP_GET, "/:index/_doc/:docId", [=](auto req) { + m_router.route(HTTP_GET, "/:index/:docId", [=](auto req) { return handleGetDocumentRequest(req, m_indexes); }); - m_router.route(HTTP_PUT, "/:index/_doc/:docId", [=](auto req) { + m_router.route(HTTP_PUT, "/:index/:docId", [=](auto req) { return handlePutDocumentRequest(req, m_indexes); }); - m_router.route(HTTP_DELETE, "/:index/_doc/:docId", [=](auto req) { + m_router.route(HTTP_DELETE, "/:index/:docId", [=](auto req) { return handleDeleteDocumentRequest(req, m_indexes); }); - // Bulk API - m_router.route(HTTP_POST, "/:index/_bulk", [=](auto req) { - return handleBulkRequest(req, m_indexes); + // Update API + m_router.route(HTTP_POST, "/:index/_update", [=](auto req) { + return handleUpdateRequest(req, m_indexes); }); // Search API diff --git a/src/server/http_test.cpp b/src/server/http_test.cpp index 6599fd52..ba373b93 100644 --- a/src/server/http_test.cpp +++ b/src/server/http_test.cpp @@ -87,16 +87,16 @@ TEST_F(HttpTest, TestGetIndexNotFound) { } TEST_F(HttpTest, TestPutDocumentStringTerms) { - auto request = HttpRequest(HTTP_PUT, QUrl("/main/_doc/111")); - request.setBody(QJsonDocument(QJsonObject{{"terms", "1,2,3"}})); + auto request = HttpRequest(HTTP_PUT, QUrl("/main/111")); + request.setBody(QJsonDocument(QJsonObject{{"hashes", "1,2,3"}})); auto response = handler->router().handle(request); ASSERT_EQ(response.status(), HTTP_OK); ASSERT_EQ(response.body().toStdString(), "{}"); } TEST_F(HttpTest, TestPutDocumentArrayTerms) { - auto request = HttpRequest(HTTP_PUT, QUrl("/main/_doc/111")); - request.setBody(QJsonDocument(QJsonObject{{"terms", QJsonArray{1, 2, 3}}})); + auto request = HttpRequest(HTTP_PUT, QUrl("/main/111")); + request.setBody(QJsonDocument(QJsonObject{{"hashes", QJsonArray{1, 2, 3}}})); auto response = handler->router().handle(request); ASSERT_EQ(response.status(), HTTP_OK); ASSERT_EQ(response.body().toStdString(), "{}"); @@ -159,12 +159,12 @@ TEST_F(HttpTest, TestBulkArray) { }*/ TEST_F(HttpTest, TestBulkObject) { - auto request = HttpRequest(HTTP_POST, QUrl("/main/_bulk")); + auto request = HttpRequest(HTTP_POST, QUrl("/main/_update")); request.setBody(QJsonDocument(QJsonObject{ - {"operations", QJsonArray{ - QJsonObject{{"upsert", QJsonObject{{"id", 111}, {"terms", QJsonArray{1, 2, 3}}}}}, - QJsonObject{{"upsert", QJsonObject{{"id", 112}, {"terms", QJsonArray{3, 4, 5}}}}}, - QJsonObject{{"set", QJsonObject{{"name", "foo"}, {"value", "bar"}}}}, + {"changes", QJsonArray{ + QJsonObject{{"insert", QJsonObject{{"id", 111}, {"hashes", QJsonArray{1, 2, 3}}}}}, + QJsonObject{{"insert", QJsonObject{{"id", 112}, {"hashes", QJsonArray{3, 4, 5}}}}}, + QJsonObject{{"set_attribute", QJsonObject{{"name", "foo"}, {"value", "bar"}}}}, }}, })); From 3e64281c4d67bd41e9ebbb24a8a5a04621286daa Mon Sep 17 00:00:00 2001 From: Lukas Lalinsky Date: Thu, 5 Dec 2024 20:58:53 +0100 Subject: [PATCH 2/2] Fix set_attribute --- src/server/http.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/http.cpp b/src/server/http.cpp index cdf348d9..b7982da3 100644 --- a/src/server/http.cpp +++ b/src/server/http.cpp @@ -263,7 +263,7 @@ static HttpResponse handleUpdateRequest(const HttpRequest &request, const QShare return errNotImplemented("not implemented in this version of acoustid-index"); } if (changeObj.contains("set_attribute")) { - auto attrObj = changeObj.value("set").toObject(); + auto attrObj = changeObj.value("set_attribute").toObject(); auto name = attrObj.value("name").toString(); auto value = attrObj.value("value").toString(); writer->setAttribute(name, value);