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

View File

@@ -2,6 +2,7 @@
#include <httplib.h>
#include "mission/mission_queue.hpp"
#include "storage/state_repository.hpp"
namespace lm {
@@ -9,12 +10,13 @@ namespace lm {
class ApiServer
{
public:
explicit ApiServer(StateRepository& repo);
ApiServer(StateRepository& repo, MissionQueue& mission_queue);
void registerRoutes(httplib::Server& svr);
private:
StateRepository& repo_;
MissionQueue& mission_queue_;
};
} // namespace lm