添加AGENTS SKILL

This commit is contained in:
2026-08-08 21:45:29 +08:00
parent 1fd375a23b
commit d1cff37a2a
12 changed files with 427 additions and 16 deletions
@@ -129,6 +129,25 @@ int main() {
});
ADMINIVE_CHECK(response->status == drogon::k200OK);
ADMINIVE_CHECK(Json::parse(response->body).at("data").at("total") == 1);
request->parameters = {{"unknown", "value"}};
response.reset();
app.handle("/configs", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
ADMINIVE_CHECK(response->status == drogon::k400BadRequest);
request->parameters = {{"orderBy", "unknown"}, {"orderDir", "asc"}};
response.reset();
app.handle("/configs", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
ADMINIVE_CHECK(response->status == drogon::k400BadRequest);
request->parameters = {{"orderBy", "name"}, {"orderDir", "sideways"}};
response.reset();
app.handle("/configs", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
});
ADMINIVE_CHECK(response->status == drogon::k400BadRequest);
request->parameters.clear();
response.reset();
app.handle("/configs/1", drogon::Get, request, [&response](const drogon::HttpResponsePtr& value) {
response = value;
@@ -72,6 +72,9 @@ public:
std::string_view getBody() const noexcept {
return body;
}
const std::map<std::string, std::string>& getParameters() const noexcept {
return parameters;
}
const std::string& getParameter(const std::string& name) const {
const auto iterator = parameters.find(name);
return iterator == parameters.end() ? empty_parameter_ : iterator->second;
+36 -3
View File
@@ -2,6 +2,7 @@
#include "adminive/adapters/httplib.hpp"
#include "adminive_test.hpp"
#include <atomic>
#include <stdexcept>
#include <string>
#include <thread>
#include <vector>
@@ -14,6 +15,9 @@ struct Config {
struct Item_Status {
std::string state{"ready"};
};
struct Overview_Status {
std::string user;
};
struct Row {
std::string name;
bool enabled{true};
@@ -39,6 +43,13 @@ struct Type_Descriptor<httplib_adapter_test::Item_Status> {
}
};
template <>
struct Type_Descriptor<httplib_adapter_test::Overview_Status> {
static auto get() {
using T = httplib_adapter_test::Overview_Status;
return object<T>("httplib_overview_status", ADMINIVE_FIELD(T, user));
}
};
template <>
struct Type_Descriptor<httplib_adapter_test::Row> {
static auto get() {
using T = httplib_adapter_test::Row;
@@ -77,17 +88,30 @@ int main() {
committed_remote = context.remote_address;
};
adminive::Http_Resource<Config, Json> resource(config, "/config", transaction);
adminive::Http_Status_Resource<Overview_Status, Json> status("/status", [](const adminive::Request_Context& context) {
if(context.user == "status-error") {
throw std::runtime_error("status failed");
}
return Overview_Status{context.user};
}, 25);
adminive::Http_Collection_Resource<Row, Json> collection("/rows", {Row{"alpha", true, 70}, Row{"beta", false, 90}, Row{"gamma", true, 50}});
collection.register_status<&Row::status>(25);
httplib::Server server;
resource.bind(server, adminive::Httplib_Bind_Options{[](const httplib::Request& request) {
adminive::Httplib_Bind_Options options;
options.context_factory = [](const httplib::Request& request) {
const std::string user = request.get_header_value("X-User");
if(user == "context-error") {
throw std::runtime_error("context failed");
}
adminive::Request_Context context;
context.user = request.get_header_value("X-User");
context.user = user;
context.request_id = request.get_header_value("X-Request-Id");
context.remote_address = request.remote_addr;
context.attributes.emplace("transport", "httplib");
return context;
}});
};
resource.bind(server, options);
status.bind(server, options);
collection.bind(server);
const int port = server.bind_to_any_port("127.0.0.1");
ADMINIVE_CHECK(port > 0);
@@ -107,6 +131,15 @@ int main() {
ADMINIVE_CHECK(committed_user == "alice");
ADMINIVE_CHECK(committed_request_id == "request-42");
ADMINIVE_CHECK(committed_remote == "127.0.0.1");
httplib::Headers context_error_headers{{"X-User", "context-error"}};
check_status(client.Post("/config/data", context_error_headers, R"({"name":"not-applied"})", "application/json"), 500);
ADMINIVE_CHECK(config.name == "updated");
check_status(client.Get("/status/descriptor"), 200);
check_status(client.Get("/status/amis"), 200);
ADMINIVE_CHECK(body_json(client.Get("/status/data", headers)).at("data").at("user").at("value") == "alice");
httplib::Headers status_error_headers{{"X-User", "status-error"}};
check_status(client.Get("/status/data", status_error_headers), 500);
check_status(client.Get("/status/data", context_error_headers), 500);
ADMINIVE_CHECK(body_json(client.Get("/rows/descriptor")).at("data").at("name") == "httplib_row");
ADMINIVE_CHECK(body_json(client.Get("/rows/view")).at("data").at("kind") == "table");
ADMINIVE_CHECK(body_json(client.Get("/rows?perPage=2&page=1&orderBy=score&orderDir=desc")).at("data").at("items").at(0).at("name") == "beta");