Mantis App v0.2.7
Loading...
Searching...
No Matches
app.h
Go to the documentation of this file.
1
11#ifndef APP_H
12#define APP_H
13
14#include <string>
15#include <mutex>
16#include <filesystem>
17#include <argparse/argparse.hpp>
18#include <chrono>
19
20#include "../core/expr_evaluator.h"
21
22// For password management ... // TODO get a proper library
23#ifdef _WIN32
24#include <conio.h>
25#else
26#include <termios.h>
27#include <unistd.h>
28#endif
29
30namespace mantis
31{
32 namespace fs = std::filesystem;
33
34 class DatabaseUnit;
35 class HttpUnit;
36 class LoggingUnit;
37 class SettingsUnit;
38 class Router;
39 class Validator;
40 class FileUnit;
41
45 enum class DbType
46 {
47 SQLITE = 0x01,
48 PSQL,
49 MYSQL
50 };
51
65 {
66 public:
72 explicit MantisApp(int argc = 0, char** argv = nullptr);
73 ~MantisApp();
74
78 void init();
79
84 static MantisApp& instance();
85
90 [[nodiscard]]
91 int run();
92
101 void close();
102
109 static int quit(const int& exitCode = 0, const std::string& reason = "Something went wrong!");
110
115 [[nodiscard]] int port() const;
120 void setPort(const int& port);
121
126 [[nodiscard]] int poolSize() const;
131 void setPoolSize(const int& pool_size);
132
137 [[nodiscard]] std::string host() const;
142 void setHost(const std::string& host);
143
148 [[nodiscard]] std::string publicDir() const;
153 void setPublicDir(const std::string& dir);
154
159 [[nodiscard]] std::string dataDir() const;
164 void setDataDir(const std::string& dir);
165
170 [[nodiscard]] DbType dbType() const;
175 void setDbType(const DbType& dbType);
176
181 static std::string jwtSecretKey();
189 void ensureInitialized(const char* caller) const;
190
195 static std::string appVersion();
197 static int appMinorVersion();
199 static int appMajorVersion();
201 static int appPatchVersion();
202
204 [[nodiscard]] DatabaseUnit& db() const;
206 [[nodiscard]] LoggingUnit& log() const;
208 [[nodiscard]] HttpUnit& http() const;
210 [[nodiscard]] argparse::ArgumentParser& cmd() const;
212 [[nodiscard]] Router& router() const;
214 [[nodiscard]] Validator& validators() const;
216 [[nodiscard]] ExprEvaluator& evaluator() const;
218 [[nodiscard]] SettingsUnit& settings() const;
220 [[nodiscard]] FileUnit& files() const;
221
228 void openBrowserOnStart() const;
229
235 std::chrono::time_point<std::chrono::steady_clock> startTime() const;
236
237 bool isDevMode() const;
238
239 private:
240 const std::string __class_name__ = "mantis::MantisApp";
241
242 // Points to externally constructed instance (no ownership)
243 static MantisApp* s_instance;
244 static std::mutex s_mutex;
245
246 // Disable copying and moving
247 MantisApp(const MantisApp&) = delete;
248 MantisApp& operator=(const MantisApp&) = delete;
249 MantisApp(MantisApp&&) = delete;
250 MantisApp& operator=(MantisApp&&) = delete;
251
252 // Private members
253 void parseArgs();
254 void init_units();
255
256 [[nodiscard]]
257 bool ensureDirsAreCreated() const;
266 static std::string getUserValueSecurely(const std::string& prompt);
267
268 // Store commandline args passed in, to be used in the init phase.
269 std::vector<std::string> m_cmdArgs;
270
271 // Hold state if the instance has be initialized already!
272 bool initialized = false;
273
274 std::string m_publicDir;
275 std::string m_dataDir;
276 DbType m_dbType;
277
278 // System uptime checkpoint
279 std::chrono::time_point<std::chrono::steady_clock> m_startTime;
280
281 int m_port = 7070;
282
283 std::string m_host = "127.0.0.1";
284
285 int m_poolSize = 2;
286 bool m_toStartServer = false;
287 bool m_launchAdminPanel = false;
288 bool m_isDevMode = false;
289
290 std::unique_ptr<DatabaseUnit> m_database;
291 std::unique_ptr<LoggingUnit> m_logger;
292 std::unique_ptr<HttpUnit> m_http;
293 std::unique_ptr<argparse::ArgumentParser> m_opts;
294 std::unique_ptr<Router> m_router;
295 std::unique_ptr<Validator> m_validators;
296 std::unique_ptr<ExprEvaluator> m_exprEval;
297 std::unique_ptr<SettingsUnit> m_settings;
298 std::unique_ptr<FileUnit> m_files;
299 };
300}
301
302#endif //APP_H
Database Management Class.
Definition database.h:29
Handle file management for record type files.
Definition fileunit.h:27
Definition http.h:228
Definition logging.h:36
Mantis entry point.
Definition app.h:65
int poolSize() const
Retrieve the database pool size value.
Definition app.cpp:580
Router & router() const
Get the router object instance.
Definition app.cpp:431
argparse::ArgumentParser & cmd() const
Get the commandline parser object.
Definition app.cpp:425
static MantisApp & instance()
Retrieve existing application instance.
Definition app.cpp:92
static std::string appVersion()
Definition app.cpp:522
void setDbType(const DbType &dbType)
Definition app.cpp:496
~MantisApp()
Definition app.cpp:57
void init()
Run initialization actions for Mantis, ensuring all objects are initialized properly before use.
Definition app.cpp:72
DatabaseUnit & db() const
Get the database unit object.
Definition app.cpp:407
LoggingUnit & log() const
Get the logging unit object.
Definition app.cpp:413
ExprEvaluator & evaluator() const
Get the cparse expression evaluator unit object instance.
Definition app.cpp:443
void openBrowserOnStart() const
Launch browser with the admin dashboard page. If all goes well, the default OS browser should open (i...
Definition app.cpp:461
static int appPatchVersion()
Fetch the patch version.
Definition app.cpp:537
static std::string jwtSecretKey()
Retrieve the JWT secret key.
Definition app.cpp:502
SettingsUnit & settings() const
Get the settings unit object.
Definition app.cpp:449
DbType dbType() const
Retrieves the active database type.
Definition app.cpp:542
void close()
Close the application and reset object instances that are dependent on the class.
Definition app.cpp:370
bool isDevMode() const
Definition app.cpp:491
std::chrono::time_point< std::chrono::steady_clock > startTime() const
Get the server start time in std::chrono::
Definition app.cpp:486
int run()
Start the http server and start listening for requests.
Definition app.cpp:386
FileUnit & files() const
Get the file unit object.
Definition app.cpp:455
std::string host() const
Retrieve HTTP Server host address. For instance, a host of 127.0.0.1, 0.0.0.0, etc.
Definition app.cpp:564
Validator & validators() const
Get the validators unit object instance in MantisApp.
Definition app.cpp:437
static int appMajorVersion()
Fetch the minor version.
Definition app.cpp:532
std::string publicDir() const
Retrieve the public static file directory.
Definition app.cpp:595
void setDataDir(const std::string &dir)
Update the data directory for MantisApp.
Definition app.cpp:616
void setPoolSize(const int &pool_size)
Set the database pool size value.
Definition app.cpp:586
void setHost(const std::string &host)
Update HTTP Server host address.
Definition app.cpp:570
HttpUnit & http() const
Get the http unit object.
Definition app.cpp:419
static int quit(const int &exitCode=0, const std::string &reason="Something went wrong!")
Quit the running application immediately.
Definition app.cpp:357
void setPort(const int &port)
Set a new port value for HTTP server.
Definition app.cpp:554
int port() const
Retrieve HTTP Listening port.
Definition app.cpp:548
std::string dataDir() const
Retrieves the data directory where SQLite db and files are stored.
Definition app.cpp:610
void ensureInitialized(const char *caller) const
Syntactic method to enforce.
Definition app.cpp:511
void setPublicDir(const std::string &dir)
Update HTTP server static file directory.
Definition app.cpp:601
static int appMinorVersion()
Fetch the major version.
Definition app.cpp:527
Router class allows for managing routes as well as acting as a top-wrapper on the HttpUnit.
Definition router.h:22
Manages application settings.
Definition settings.h:21
Definition models.h:19
router.h
Definition app.h:31
DbType
Enum for which database is currently selected.
Definition app.h:46
@ MYSQL
‍PostGreSQL Database
@ PSQL
‍SQLite Database
Struct instance for handling evaluation of database access rules.
Definition expr_evaluator.h:27