From 9308f4d719cf4028868c59fd6d048ec73e5b1d61 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 May 2025 12:10:26 +1200 Subject: [PATCH] Bug fixing --- README.md | 2 +- src/put_handler.cpp | 48 ++++++++++++++++++++++++++++++++++++--------- test.sh | 13 +++++++++++- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8b8f1d8..abccf61 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Public read actions: curl -X PUT \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@/path/to/your/file.txt" \ - -F 'metadata={"labeltag":"example:latest","description":"Example file","tags":["test","example"],"custom_field":"custom value"}' \ + -F 'metadata={"label":"example","tags":["latest","test","example"],"description":"Example file","custom_field":"custom value"}' \ "http://localhost:8123/upload" ``` - The object file is uploaded, hashed, added to the registry (if that hash doesn't already exist), and {label:tag,hash} entries are added to the directory index. diff --git a/src/put_handler.cpp b/src/put_handler.cpp index df5ba5b..68dbb39 100644 --- a/src/put_handler.cpp +++ b/src/put_handler.cpp @@ -9,6 +9,18 @@ #include #include +/* + +IMPORTANT: handling of tags. + +When an object is uploaded: +- the object is stored in the object store +- the database is primarily + + + +*/ + namespace simple_object_storage { PutHandler::PutHandler(Server& server) : server_(server) {} @@ -55,19 +67,25 @@ void PutHandler::handle_put_object(const httplib::Request& req, httplib::Respons } // Validate required metadata fields - if (!metadata.contains("labeltag")) { + if (!metadata.contains("label")) { res.status = 400; - nlohmann::json response = {{"result", "error"}, {"error", "Missing required metadata field: labeltag"}}; + nlohmann::json response = {{"result", "error"}, {"error", "Missing required metadata field: label"}}; res.set_content(response.dump(), "application/json"); return; } - // Extract labeltag and validate format - std::string labeltag = metadata["labeltag"]; - auto [label, tag] = server_.parse_label_tag(labeltag); - if (label.empty() || tag.empty()) { + if (!metadata.contains("tags") || !metadata["tags"].is_array() || metadata["tags"].empty()) { res.status = 400; - nlohmann::json response = {{"result", "error"}, {"error", "Invalid label:tag format"}}; + nlohmann::json response = {{"result", "error"}, {"error", "Missing or invalid required metadata field: tags (must be non-empty array)"}}; + res.set_content(response.dump(), "application/json"); + return; + } + + // Extract label and tags + std::string label = metadata["label"]; + if (label.empty()) { + res.status = 400; + nlohmann::json response = {{"result", "error"}, {"error", "Label cannot be empty"}}; res.set_content(response.dump(), "application/json"); return; } @@ -144,11 +162,23 @@ void PutHandler::handle_put_object(const httplib::Request& req, httplib::Respons // Update database index dbEntry entry; - entry.label_tag = labeltag; entry.hash = std::to_string(hash); entry.metadata = metadata; // Store the complete metadata - if (!server_.db_->update_or_insert(entry)) { + // For each tag, create a label:tag entry + bool success = true; + for (const auto& tag : metadata["tags"]) { + std::string tag_str = tag.get(); + if (tag_str.empty()) continue; // Skip empty tags + + entry.label_tag = label + ":" + tag_str; + if (!server_.db_->update_or_insert(entry)) { + success = false; + break; + } + } + + if (!success) { res.status = 500; nlohmann::json response = {{"result", "error"}, {"error", "Failed to update database index"}}; res.set_content(response.dump(), "application/json"); diff --git a/test.sh b/test.sh index ab70aa2..72cf2de 100755 --- a/test.sh +++ b/test.sh @@ -211,6 +211,13 @@ UPLOAD_RESPONSE=$(curl -X PUT \ FIRST_HASH=$(echo ${UPLOAD_RESPONSE} | jq -r '.hash') +# Store first version's metadata before uploading second version +FIRST_METADATA=$(curl -s "${BASE_URL}/meta/${BASE_TAG}:latest") +echo "First version metadata response: ${FIRST_METADATA}" +if ! echo "${FIRST_METADATA}" | jq -r '.metadata.tags[]' | grep -q 'v1'; then + die "First version does not have v1 tag" +fi + # Upload second version with same tag 'latest' SECOND_METADATA_JSON=$(cat <