aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds/projectstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-08-18 11:21:12 +0200
committerGitHub <[email protected]>2023-08-18 11:21:12 +0200
commit3975db7eb6ab9457c90a32c2744843d9e757b370 (patch)
treebfcebcf91f5c86fd80d0f48c52b123ed8eabfca8 /src/zen/cmds/projectstore.cpp
parentcheck oplog op attachments when gathering references for GC (#363) (diff)
downloadarchived-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.cpp139
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");