Files
backend/main.cc
T

87 lines
3.6 KiB
C++

#include <drogon/drogon.h>
#include "common/Cors.h"
#include "plugins/RequestLogger.h"
#include "repositories/MigrationRunner.h"
#include <cstdio>
#include <fstream>
#include <cstdlib>
int main()
{
setvbuf(stdout, nullptr, _IONBF, 0);
(void)RequestLogger::classTypeName();
Json::Value config;
std::ifstream configFile("config.json");
if (configFile.is_open())
{
configFile >> config;
if (const char* envHost = std::getenv("DB_HOST"))
config["db_clients"][0]["host"] = envHost;
if (const char* envPort = std::getenv("DB_PORT"))
config["db_clients"][0]["port"] = std::stoi(envPort);
if (const char* envUser = std::getenv("DB_USER"))
config["db_clients"][0]["user"] = envUser;
if (const char* envPass = std::getenv("DB_PASSWORD"))
config["db_clients"][0]["passwd"] = envPass;
if (const char* envDb = std::getenv("DB_NAME"))
config["db_clients"][0]["dbname"] = envDb;
if (const char* envTimeout = std::getenv("DB_TIMEOUT"))
config["db_clients"][0]["timeout"] = std::stod(envTimeout);
if (const char* envMailProvider = std::getenv("MAIL_PROVIDER"))
config["custom_config"]["mail"]["provider"] = envMailProvider;
if (const char* envMailApiBaseUrl = std::getenv("RESEND_API_BASE_URL"))
config["custom_config"]["mail"]["api_base_url"] = envMailApiBaseUrl;
if (const char* envMailApiKey = std::getenv("RESEND_API_KEY"))
config["custom_config"]["mail"]["api_key"] = envMailApiKey;
if (const char* envMailFrom = std::getenv("MAIL_FROM"))
config["custom_config"]["mail"]["from"] = envMailFrom;
if (const char* envCorsAllowedOrigin = std::getenv("CORS_ALLOWED_ORIGIN"))
config["custom_config"]["cors"]["allowed_origin"] = envCorsAllowedOrigin;
if (const char* envCieServiceBaseUrl = std::getenv("CIE_AUTH_SERVICE_BASE_URL"))
config["custom_config"]["cie_auth"]["service_base_url"] = envCieServiceBaseUrl;
if (const char* envCieStartPath = std::getenv("CIE_AUTH_START_PATH"))
config["custom_config"]["cie_auth"]["start_path"] = envCieStartPath;
if (const char* envCieSharedSecret = std::getenv("CIE_AUTH_SHARED_SECRET"))
config["custom_config"]["cie_auth"]["shared_secret"] = envCieSharedSecret;
if (const char* envCieStateTtl = std::getenv("CIE_AUTH_STATE_TTL_MINUTES"))
config["custom_config"]["cie_auth"]["state_ttl_minutes"] = std::stoi(envCieStateTtl);
if (const char* envCieFrontendRedirect = std::getenv("CIE_AUTH_DEFAULT_FRONTEND_REDIRECT_URI"))
config["custom_config"]["cie_auth"]["default_frontend_redirect_uri"] = envCieFrontendRedirect;
drogon::app().loadConfigJson(config);
}
else
{
drogon::app().loadConfigFile("config.json");
}
Json::Value requestLoggerConfig;
requestLoggerConfig["include_query"] = true;
drogon::app().addPlugin("RequestLogger", {}, requestLoggerConfig);
visione::cors::configure();
const auto migrationsPath = drogon::app()
.getCustomConfig()
.get("migrations_path", "migrations")
.asString();
drogon::app().getLoop()->runAfter(0.0, [migrationsPath]() {
try
{
visione::repositories::MigrationRunner::run(migrationsPath);
}
catch (const std::exception &error)
{
LOG_FATAL << "Migration failed: " << error.what();
drogon::app().quit();
}
});
drogon::app().run();
return 0;
}