73 lines
2.0 KiB
C++
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));
|
|
}
|
|
}
|