Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change HTTP server to be compatible with the latest version #39

Merged
merged 2 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/server/http.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -222,48 +222,48 @@ 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<Index> &indexes) {
// Handle bulk update requests.
static HttpResponse handleUpdateRequest(const HttpRequest &request, const QSharedPointer<Index> &indexes) {
auto index = getIndex(request, indexes);

QJsonArray opsJsonArray;

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_attribute").toObject();
auto name = attrObj.value("name").toString();
auto value = attrObj.value("value").toString();
writer->setAttribute(name, value);
Expand Down Expand Up @@ -294,22 +294,22 @@ HttpRequestHandler::HttpRequestHandler(QSharedPointer<Index> 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
Expand Down
18 changes: 9 additions & 9 deletions src/server/http_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(), "{}");
Expand Down Expand Up @@ -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"}}}},
}},
}));

Expand Down
Loading