diff options
| author | Dan Engelbrecht <[email protected]> | 2023-08-18 11:21:12 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-08-18 11:21:12 +0200 |
| commit | 3975db7eb6ab9457c90a32c2744843d9e757b370 (patch) | |
| tree | bfcebcf91f5c86fd80d0f48c52b123ed8eabfca8 /src/zen/cmds/projectstore.cpp | |
| parent | check oplog op attachments when gathering references for GC (#363) (diff) | |
| download | archived-zen-3975db7eb6ab9457c90a32c2744843d9e757b370.tar.xz archived-zen-3975db7eb6ab9457c90a32c2744843d9e757b370.zip | |
add update/delete endpoint for project and oplog (#353)
* add update endpoint for project store project
* add update endpoint for oplog
* changelog
* Zen command line tool `project-update`
Zen command line tool `project-delete`
Zen command line tool `oplog-update`
Zen command line tool `oplog-delete`
* add --force-update option to project/oplog create
remove project/oplog update commnad
Diffstat (limited to 'src/zen/cmds/projectstore.cpp')
| -rw-r--r-- | src/zen/cmds/projectstore.cpp | 139 |
1 files changed, 133 insertions, 6 deletions
diff --git a/src/zen/cmds/projectstore.cpp b/src/zen/cmds/projectstore.cpp index f7dc82569..b2f1cda5d 100644 --- a/src/zen/cmds/projectstore.cpp +++ b/src/zen/cmds/projectstore.cpp @@ -189,6 +189,7 @@ CreateProjectCommand::CreateProjectCommand() m_Options.add_option("", "", "enginedir", "Absolute path to engine root directory", cxxopts::value(m_EngineRootDir), "<engineroot>"); m_Options.add_option("", "", "projectdir", "Absolute path to project directory", cxxopts::value(m_ProjectRootDir), "<projectroot>"); m_Options.add_option("", "", "projectfile", "Absolute path to .uproject file", cxxopts::value(m_ProjectFile), "<projectfile>"); + m_Options.add_option("", "f", "force-update", "Force update of existing project", cxxopts::value(m_ForceUpdate), "<force-update>"); m_Options.parse_positional({"project", "rootdir", "enginedir", "projectdir", "projectfile"}); } @@ -224,13 +225,13 @@ CreateProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** a Session.SetUrl({fmt::format("{}/prj/{}", m_HostName, m_ProjectId)}); cpr::Response Response = Session.Get(); - if (zen::IsHttpSuccessCode(Response.status_code)) + if (zen::IsHttpSuccessCode(Response.status_code) && !m_ForceUpdate) { ZEN_CONSOLE("Project already exists.\n{}", Response.text); return 1; } - if (Response.status_code == static_cast<long>(zen::HttpResponseCode::NotFound)) + if (Response.status_code == static_cast<long>(zen::HttpResponseCode::NotFound) || m_ForceUpdate) { zen::CbObjectWriter Project; Project.AddString("id"sv, m_ProjectId); @@ -241,9 +242,68 @@ CreateProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** a zen::IoBuffer ProjectPayload = Project.Save().GetBuffer().AsIoBuffer(); Session.SetBody(cpr::Body{(const char*)ProjectPayload.GetData(), ProjectPayload.GetSize()}); Session.SetHeader(cpr::Header{{"Accept", "text"}}); - Response = Session.Post(); + Response = m_ForceUpdate ? Session.Post() : Session.Put(); + } + + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); + return MapHttpToCommandReturnCode(Response); +} + +/////////////////////////////////////// + +DeleteProjectCommand::DeleteProjectCommand() +{ + m_Options.add_options()("h,help", "Print help"); + m_Options.add_option("", "u", "hosturl", "Host URL", cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); + m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectId), "<projectid>"); +} + +DeleteProjectCommand::~DeleteProjectCommand() = default; + +int +DeleteProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +{ + ZEN_UNUSED(GlobalOptions); + + using namespace std::literals; + + if (!ParseOptions(argc, argv)) + { + return 0; + } + + m_HostName = ResolveTargetHostSpec(m_HostName); + + if (m_HostName.empty()) + { + throw zen::OptionParseException("unable to resolve server specification"); } + cpr::Session Session; + Session.SetHeader(cpr::Header{{"Accept", "application/json"}}); + + if (m_ProjectId.empty()) + { + ZEN_ERROR("Project name must be given"); + return 1; + } + + Session.SetUrl({fmt::format("{}/prj/{}", m_HostName, m_ProjectId)}); + cpr::Response Response = Session.Get(); + if (Response.status_code == static_cast<long>(zen::HttpResponseCode::NotFound)) + { + ZEN_CONSOLE("Project does not exist.\n{}", Response.text); + return 1; + } + if (!zen::IsHttpSuccessCode(Response.status_code)) + { + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); + return 1; + } + + Session.SetHeader(cpr::Header{{"Accept", "text"}}); + Response = Session.Delete(); + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); return MapHttpToCommandReturnCode(Response); } @@ -257,6 +317,7 @@ CreateOplogCommand::CreateOplogCommand() m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectId), "<projectid>"); m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogId), "<oplogid>"); m_Options.add_option("", "", "gcpath", "Absolute path to oplog lifetime marker file", cxxopts::value(m_GcPath), "<path>"); + m_Options.add_option("", "f", "force-update", "Force update of existing oplog", cxxopts::value(m_ForceUpdate), "<force-update>"); m_Options.parse_positional({"project", "oplog", "gcpath"}); } @@ -296,13 +357,13 @@ CreateOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg Session.SetUrl({fmt::format("{}/prj/{}/oplog/{}", m_HostName, m_ProjectId, m_OplogId)}); cpr::Response Response = Session.Get(); - if (zen::IsHttpSuccessCode(Response.status_code)) + if (zen::IsHttpSuccessCode(Response.status_code) && !m_ForceUpdate) { ZEN_CONSOLE("Oplog already exists.\n{}", Response.text); return 1; } - if (Response.status_code == static_cast<long>(zen::HttpResponseCode::NotFound)) + if (Response.status_code == static_cast<long>(zen::HttpResponseCode::NotFound) || m_ForceUpdate) { Session.SetHeader(cpr::Header{{"Accept", "text"}}); if (!m_GcPath.empty()) @@ -314,7 +375,7 @@ CreateOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg Session.SetHeader(cpr::Header{{"Accept", "text"}, {"Content-Type", std::string(ToString(zen::HttpContentType::kCbObject))}}); } - Response = Session.Post(); + Response = m_ForceUpdate ? Session.Post() : Session.Put(); } ZEN_CONSOLE("{}", FormatHttpResponse(Response)); @@ -324,6 +385,72 @@ CreateOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg /////////////////////////////////////// +DeleteOplogCommand::DeleteOplogCommand() +{ + m_Options.add_options()("h,help", "Print help"); + m_Options.add_option("", "u", "hosturl", "Host URL", cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); + m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectId), "<projectid>"); + m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogId), "<oplogid>"); + m_Options.parse_positional({"project", "oplog", "gcpath"}); +} + +DeleteOplogCommand::~DeleteOplogCommand() = default; + +int +DeleteOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +{ + ZEN_UNUSED(GlobalOptions); + + using namespace std::literals; + + if (!ParseOptions(argc, argv)) + { + return 0; + } + + m_HostName = ResolveTargetHostSpec(m_HostName); + + if (m_HostName.empty()) + { + throw zen::OptionParseException("unable to resolve server specification"); + } + + cpr::Session Session; + Session.SetHeader(cpr::Header{{"Accept", "application/json"}}); + + if (m_ProjectId.empty()) + { + throw zen::OptionParseException("project name must be specified"); + } + + if (m_OplogId.empty()) + { + throw zen::OptionParseException("oplog name must be specified"); + } + + Session.SetUrl({fmt::format("{}/prj/{}/oplog/{}", m_HostName, m_ProjectId, m_OplogId)}); + cpr::Response Response = Session.Get(); + if (Response.status_code == static_cast<long>(zen::HttpResponseCode::NotFound)) + { + ZEN_CONSOLE("Oplog does not exist.\n{}", Response.text); + return 1; + } + if (!zen::IsHttpSuccessCode(Response.status_code)) + { + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); + return 1; + } + + Session.SetHeader(cpr::Header{{"Accept", "text"}}); + Response = Session.Delete(); + + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); + + return MapHttpToCommandReturnCode(Response); +} + +/////////////////////////////////////// + ExportOplogCommand::ExportOplogCommand() { m_Options.add_options()("h,help", "Print help"); |