Files
backend/controllers/ApiController.cc
T

73 lines
2.0 KiB
C++

#include "ApiController.h"
#include <drogon/drogon.h>
#include <drogon/orm/Exception.h>
#include <json/json.h>
#include <memory>
using drogon::HttpResponse;
using drogon::HttpResponsePtr;
using drogon::k503ServiceUnavailable;
namespace
{
HttpResponsePtr jsonResponse(Json::Value body,
drogon::HttpStatusCode status = drogon::k200OK)
{
auto response = HttpResponse::newHttpJsonResponse(std::move(body));
response->setStatusCode(status);
return response;
}
Json::Value mysqlReadyBody(bool ready)
{
Json::Value body;
body["status"] = ready ? "ready" : "not_ready";
body["dependencies"]["mysql"] = ready;
return body;
}
}
void ApiController::health(
const drogon::HttpRequestPtr &,
std::function<void(const HttpResponsePtr &)> &&callback)
{
Json::Value body;
body["status"] = "ok";
body["service"] = "visione-backend";
callback(jsonResponse(std::move(body)));
}
void ApiController::ready(
const drogon::HttpRequestPtr &,
std::function<void(const HttpResponsePtr &)> &&callback)
{
auto responseCallback = std::make_shared<
std::function<void(const HttpResponsePtr &)>>(std::move(callback));
try
{
auto dbClient = drogon::app().getDbClient();
dbClient->execSqlAsync(
"SELECT 1",
[responseCallback](const drogon::orm::Result &) {
(*responseCallback)(jsonResponse(mysqlReadyBody(true)));
},
[responseCallback](const drogon::orm::DrogonDbException &error) {
auto body = mysqlReadyBody(false);
body["errors"]["mysql"] = error.base().what();
(*responseCallback)(
jsonResponse(std::move(body), k503ServiceUnavailable));
});
}
catch (const std::exception &error)
{
auto body = mysqlReadyBody(false);
body["errors"]["mysql"] = error.what();
(*responseCallback)(
jsonResponse(std::move(body), k503ServiceUnavailable));
}
}