excuting misstion from queue

This commit is contained in:
2026-06-13 12:21:29 +07:00
parent 7c505e919c
commit c116b30bea
14 changed files with 1089 additions and 1145 deletions

View File

@@ -9,7 +9,10 @@
namespace lm {
ApiServer::ApiServer(StateRepository& repo) : repo_(repo) {}
ApiServer::ApiServer(StateRepository& repo, MissionQueue& mission_queue)
: repo_(repo), mission_queue_(mission_queue)
{
}
void ApiServer::registerRoutes(httplib::Server& svr)
{
@@ -436,6 +439,69 @@ void ApiServer::registerRoutes(httplib::Server& svr)
return HttpUtil::jsonError(res, 500, "failed to save layout");
res.status = 204;
});
svr.Get("/api/mission_queue", [this](const httplib::Request&, httplib::Response& res) {
HttpUtil::addCors(res);
res.set_header("Content-Type", "application/json; charset=utf-8");
res.body = nlohmann::json({{"queue", mission_queue_.list()}, {"runner", mission_queue_.runnerStatus()}}).dump();
});
svr.Post("/api/mission_queue", [this](const httplib::Request& req, httplib::Response& res) {
HttpUtil::addCors(res);
nlohmann::json payload;
try
{
payload = nlohmann::json::parse(req.body);
}
catch (...)
{
return HttpUtil::jsonError(res, 400, "invalid JSON");
}
std::string err;
const auto entry = mission_queue_.enqueue(payload, err);
if (!entry)
return HttpUtil::jsonError(res, 400, err);
res.status = 201;
res.set_header("Content-Type", "application/json; charset=utf-8");
res.body = entry->dump();
});
svr.Delete("/api/mission_queue", [this](const httplib::Request&, httplib::Response& res) {
HttpUtil::addCors(res);
std::string err;
if (!mission_queue_.clearAll(err))
return HttpUtil::jsonError(res, 400, err);
res.status = 204;
});
svr.Put("/api/mission_queue/reorder", [this](const httplib::Request& req, httplib::Response& res) {
HttpUtil::addCors(res);
nlohmann::json payload;
try
{
payload = nlohmann::json::parse(req.body);
}
catch (...)
{
return HttpUtil::jsonError(res, 400, "invalid JSON");
}
if (!payload.contains("ordered_ids") || !payload["ordered_ids"].is_array())
return HttpUtil::jsonError(res, 400, "ordered_ids is required");
std::string err;
if (!mission_queue_.reorder(payload["ordered_ids"], err))
return HttpUtil::jsonError(res, 400, err);
res.set_header("Content-Type", "application/json; charset=utf-8");
res.body = nlohmann::json({{"ok", true}}).dump();
});
svr.Delete(R"(/api/mission_queue/([0-9a-fA-F]+))", [this](const httplib::Request& req, httplib::Response& res) {
HttpUtil::addCors(res);
const std::string id = req.matches[1].str();
std::string err;
if (!mission_queue_.removeById(id, err))
return HttpUtil::jsonError(res, 400, err);
res.status = 204;
});
}
} // namespace lm