180 lines
5.3 KiB
C++
180 lines
5.3 KiB
C++
#include <models/controller_dbo.h>
|
|
#include <config.h>
|
|
#include <enums.h>
|
|
#include <mpack.h>
|
|
#include "api_v1_controllers.h"
|
|
using namespace api::v1;
|
|
|
|
void
|
|
controllers::get_all(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
|
|
{
|
|
controller_dbo **all_controllers = controller_dbo::get_all();
|
|
Json::Value all_controllers_json(Json::arrayValue);
|
|
|
|
for(int i = 0; all_controllers[i] != nullptr; i++)
|
|
{
|
|
all_controllers_json.append(all_controllers[i]->to_json());
|
|
}
|
|
|
|
auto resp = HttpResponse::newHttpJsonResponse(all_controllers_json);
|
|
|
|
callback(resp);
|
|
|
|
controller_dbo::free_list(all_controllers);
|
|
}
|
|
|
|
void
|
|
controllers::get_one_by_id(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback,
|
|
const std::string& controller_id_str)
|
|
{
|
|
uuid_t controller_id;
|
|
if(uuid_parse(controller_id_str.c_str(), controller_id))
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k400BadRequest);
|
|
callback(resp);
|
|
return;
|
|
}
|
|
controller_dbo **controllers = controller_dbo::get_by_simple("id", controller_id, (intptr_t) &sqlite3_bind_blob, sizeof(uuid_t));
|
|
|
|
if(controllers[0])
|
|
{
|
|
auto resp = HttpResponse::newHttpJsonResponse(controllers[0]->to_json());
|
|
|
|
callback(resp);
|
|
}
|
|
else
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k404NotFound);
|
|
|
|
callback(resp);
|
|
}
|
|
controller_dbo::free_list(controllers);
|
|
}
|
|
|
|
void
|
|
controllers::get_one_by_tag(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback,
|
|
const std::string &controller_tag)
|
|
{
|
|
controller_dbo **controllers = controller_dbo::get_by_simple("tag", controller_tag.c_str(), (intptr_t) &sqlite3_bind_text, -1);
|
|
|
|
if(controllers[0])
|
|
{
|
|
auto resp = HttpResponse::newHttpJsonResponse(controllers[0]->to_json());
|
|
|
|
callback(resp);
|
|
}
|
|
else
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k404NotFound);
|
|
|
|
callback(resp);
|
|
}
|
|
controller_dbo::free_list(controllers);
|
|
}
|
|
|
|
void
|
|
controllers::delete_one_by_id(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, const std::string& controller_id_str)
|
|
{
|
|
uuid_t controller_id;
|
|
if(uuid_parse(controller_id_str.c_str(), controller_id))
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k400BadRequest);
|
|
callback(resp);
|
|
return;
|
|
}
|
|
controller_dbo **controllers = controller_dbo::get_by_simple("id", controller_id, (intptr_t) &sqlite3_bind_blob, sizeof(uuid_t));
|
|
|
|
if(controllers[0])
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
if(!controllers[0]->remove())
|
|
{
|
|
resp->setStatusCode(k500InternalServerError);
|
|
}
|
|
|
|
callback(resp);
|
|
}
|
|
else
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k404NotFound);
|
|
|
|
callback(resp);
|
|
}
|
|
controller_dbo::free_list(controllers);
|
|
}
|
|
|
|
void
|
|
controllers::put_one_by_id(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback,
|
|
const std::string &controller_id_str)
|
|
{
|
|
Json::Value body = *req->getJsonObject();
|
|
|
|
uuid_t controller_id;
|
|
if(uuid_parse(controller_id_str.c_str(), controller_id))
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k400BadRequest);
|
|
callback(resp);
|
|
return;
|
|
}
|
|
controller_dbo **controllers = controller_dbo::get_by_simple("id", controller_id, (intptr_t) &sqlite3_bind_blob, sizeof(uuid_t));
|
|
|
|
if(controllers[0])
|
|
{
|
|
strncpy(controllers[0]->name, body["name"].asCString(), 127);
|
|
strncpy(controllers[0]->ip, body["ip"].asCString(), 16);
|
|
|
|
controllers[0]->name[127] = '\0';
|
|
controllers[0]->ip[16] = '\0';
|
|
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
if(controllers[0]->update())
|
|
{
|
|
char* data;
|
|
size_t size;
|
|
mpack_writer_t writer;
|
|
mpack_writer_init_growable(&writer, &data, &size);
|
|
|
|
// write the example on the msgpack homepage
|
|
mpack_start_map(&writer, 2);
|
|
|
|
mpack_write_uint(&writer, COMMAND_MAPPING_CODE);
|
|
mpack_write_u8(&writer, config::command_code_set_name);
|
|
|
|
mpack_write_uint(&writer, COMMAND_MAPPING_NAME);
|
|
mpack_write_cstr(&writer, controllers[0]->name);
|
|
|
|
mpack_finish_map(&writer);
|
|
|
|
// finish writing
|
|
if (mpack_writer_destroy(&writer) != mpack_ok) {
|
|
LOG_ERROR << "an error occurred encoding the data";
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k500InternalServerError);
|
|
callback(resp);
|
|
return;
|
|
}
|
|
controllers[0]->command(config::command_code_set_name, data, size);
|
|
resp = HttpResponse::newHttpJsonResponse(controllers[0]->to_json());
|
|
}
|
|
else
|
|
{
|
|
resp->setStatusCode(k500InternalServerError);
|
|
}
|
|
|
|
callback(resp);
|
|
}
|
|
else
|
|
{
|
|
auto resp = HttpResponse::newHttpResponse();
|
|
resp->setStatusCode(k404NotFound);
|
|
|
|
callback(resp);
|
|
}
|
|
controller_dbo::free_list(controllers);
|
|
}
|