#include #include #include #include "dto/dto.h" void cleanup() { std::cout << "Stopping..." << std::endl; drogon::app().quit(); std::cout << "Cleanup up uploads..."; std::filesystem::remove_all("uploads"); std::cout << " [Done]" << std::endl; std::cout << "Goodbye!" << std::endl; } int main() { std::cout << "Setting up..." << std::endl; std::cout << "Initializing curl..." << std::flush; curl_global_init(CURL_GLOBAL_ALL); std::cout << " [Done]" << std::endl; if (!std::filesystem::exists("files")) { std::cout << "Creating files..." << std::flush; std::filesystem::create_directory("files"); std::cout << " [Done]" << std::endl; } if (!std::filesystem::exists("logs")) { std::cout << "Creating logs..." << std::flush; std::filesystem::create_directory("logs"); std::cout << " [Done]" << std::endl; } auto* loop = drogon::app().getLoop(); loop->queueInLoop([]{ std::cout << "Starting..." << std::endl; std::cout << "Creating db tables..." << std::flush; auto db = drogon::app().getDbClient(); db->execSqlSync("CREATE TABLE IF NOT EXISTS 'tokens' (\n" " 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" " 'owner_id' INTEGER NOT NULL,\n" " 'exp' INTEGER NOT NULL\n" ")"); db->execSqlSync("CREATE TABLE IF NOT EXISTS 'user' (\n" " 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" " 'gitlab' INTEGER NOT NULL,\n" " 'name' TEXT NOT NULL,\n" " 'password' TEXT NOT NULL,\n" " 'role' INTEGER NOT NULL,\n" " 'root_id' INTEGER NOT NULL,\n" " 'tfa_type' INTEGER NOT NULL,\n" " 'tfa_secret' BLOB,\n" " 'gitlab_at' TEXT,\n" " 'gitlab_rt' TEXT\n" ")"); db->execSqlSync("CREATE TABLE IF NOT EXISTS 'inode' (\n" " 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" " 'is_file' INTEGER NOT NULL,\n" " 'name' TEXT,\n" " 'parent_id' INTEGER,\n" " 'owner_id' INTEGER NOT NULL,\n" " 'size' INTEGER\n" ")"); std::cout << " [Done]" << std::endl; std::cout << "Started!" << std::endl; std::cout << "Registered paths: " << std::endl; auto handlers = drogon::app().getHandlersInfo(); for (const auto& handler : handlers) { std::cout << " "; if (std::get<1>(handler) == drogon::HttpMethod::Post) std::cout << "POST "; else std::cout << "GET "; std::string func = std::get<2>(handler).substr(16); func.resize(30, ' '); std::cout << '[' << func << "] "; std::cout << std::get<0>(handler) << std::endl; } std::cout << "Listening on:" << std::endl; auto listeners = drogon::app().getListeners(); for (const auto& listener : listeners) { std::cout << " " << listener.toIpPort() << std::endl; } }); Json::Value access_logger; access_logger["name"] = "drogon::plugin::AccessLogger"; Json::Value config; config["plugins"].append(access_logger); drogon::app() .setClientMaxBodySize(1024L * 1024L * 1024L * 1024L) // 1 TB .loadConfigJson(config) .createDbClient("sqlite3", "", 0, "", "", "", 1, "sqlite.db") .setCustom404Page(drogon::HttpResponse::newFileResponse("./static/index.html"), false) .setDocumentRoot("./static") .setBrStatic(true) .setStaticFilesCacheTime(0) .setLogPath("./logs") .setLogLevel(trantor::Logger::LogLevel::kDebug) .setIntSignalHandler(cleanup) .setTermSignalHandler(cleanup) .addListener("0.0.0.0", 1234) .setThreadNum(2); std::cout << "Setup done!" << std::endl; drogon::app().run(); }