11#include " engines.h"
2- #include < filesystem>
3- #include < sstream>
4- #include < stdexcept>
52#include < utility>
63#include " services/engine_service.h"
74#include " utils/archive_utils.h"
85#include " utils/cortex_utils.h"
9- #include " utils/system_info_utils .h"
6+ #include " utils/logging_utils .h"
107
118void Engines::InstallEngine (
129 const HttpRequestPtr& req,
1310 std::function<void (const HttpResponsePtr&)>&& callback,
14- const std::string& engine) const {
15- LOG_DEBUG << " InitEngine, Engine: " << engine;
11+ const std::string& engine) {
12+
1613 if (engine.empty ()) {
1714 Json::Value res;
1815 res[" message" ] = " Engine name is required" ;
@@ -23,98 +20,27 @@ void Engines::InstallEngine(
2320 return ;
2421 }
2522
26- auto system_info = system_info_utils::GetSystemInfo ();
2723 auto version{" latest" };
28- constexpr auto gitHubHost = " https://api.github.com" ;
29-
30- std::ostringstream engineReleasePath;
31- engineReleasePath << " /repos/janhq/" << engine << " /releases/" << version;
32-
33- httplib::Client cli (gitHubHost);
34- using namespace nlohmann ;
35- if (auto res = cli.Get (engineReleasePath.str ())) {
36- if (res->status == httplib::StatusCode::OK_200) {
37- try {
38- auto jsonResponse = json::parse (res->body );
39- auto assets = jsonResponse[" assets" ];
40-
41- auto os_arch{system_info->os + " -" + system_info->arch };
42- for (auto & asset : assets) {
43- auto assetName = asset[" name" ].get <std::string>();
44- if (assetName.find (os_arch) != std::string::npos) {
45- auto download_url =
46- asset[" browser_download_url" ].get <std::string>();
47- auto name = asset[" name" ].get <std::string>();
48- LOG_INFO << " Download url: " << download_url;
49-
50- std::filesystem::path engine_folder_path =
51- file_manager_utils::GetContainerFolderPath (
52- file_manager_utils::DownloadTypeToString (
53- DownloadType::Engine)) /
54- engine;
55-
56- if (!std::filesystem::exists (engine_folder_path)) {
57- CTL_INF (" Creating " << engine_folder_path.string ());
58- std::filesystem::create_directories (engine_folder_path);
59- }
60- auto local_path = engine_folder_path / assetName;
61- auto downloadTask{DownloadTask{.id = engine,
62- .type = DownloadType::Engine,
63- .items = {DownloadItem{
64- .id = engine,
65- .downloadUrl = download_url,
66- .localPath = local_path,
67- }}}};
68-
69- DownloadService ().AddAsyncDownloadTask (
70- downloadTask, [](const DownloadTask& finishedTask) {
71- // try to unzip the downloaded file
72- archive_utils::ExtractArchive (
73- finishedTask.items [0 ].localPath .string (),
74- finishedTask.items [0 ]
75- .localPath .parent_path ()
76- .parent_path ()
77- .string ());
78-
79- // remove the downloaded file
80- try {
81- std::filesystem::remove (finishedTask.items [0 ].localPath );
82- } catch (const std::exception& e) {
83- LOG_WARN << " Could not delete file: " << e.what ();
84- }
85- LOG_INFO << " Finished!" ;
86- });
87-
88- Json::Value res;
89- res[" message" ] = " Engine download started" ;
90- res[" result" ] = " OK" ;
91- auto resp = cortex_utils::CreateCortexHttpJsonResponse (res);
92- resp->setStatusCode (k200OK);
93- callback (resp);
94- return ;
95- }
96- }
97- Json::Value res;
98- res[" message" ] = " Engine not found" ;
99- res[" result" ] = " Error" ;
100- auto resp = cortex_utils::CreateCortexHttpJsonResponse (res);
101- resp->setStatusCode (k404NotFound);
102- callback (resp);
103- } catch (const json::parse_error& e) {
104- std::cerr << " JSON parse error: " << e.what () << std::endl;
105- }
106- }
24+ auto result = engine_service_.InstallEngine (engine, version);
25+ if (result.has_error ()) {
26+ Json::Value res;
27+ res[" message" ] = result.error ();
28+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (res);
29+ resp->setStatusCode (k400BadRequest);
30+ callback (resp);
10731 } else {
108- auto err = res.error ();
109- LOG_ERROR << " HTTP error: " << httplib::to_string (err);
32+ Json::Value res;
33+ res[" message" ] = " Engine " + engine + " installed successfully!" ;
34+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (res);
35+ resp->setStatusCode (k200OK);
36+ callback (resp);
11037 }
11138}
11239
11340void Engines::ListEngine (
11441 const HttpRequestPtr& req,
11542 std::function<void (const HttpResponsePtr&)>&& callback) const {
116- auto engine_service = EngineService ();
117- auto status_list = engine_service.GetEngineInfoList ();
43+ auto status_list = engine_service_.GetEngineInfoList ();
11844
11945 Json::Value ret;
12046 ret[" object" ] = " list" ;
@@ -140,10 +66,9 @@ void Engines::ListEngine(
14066void Engines::GetEngine (const HttpRequestPtr& req,
14167 std::function<void (const HttpResponsePtr&)>&& callback,
14268 const std::string& engine) const {
143- auto engine_service = EngineService ();
144- try {
145- auto status = engine_service.GetEngineInfo (engine);
146- Json::Value ret;
69+ auto status = engine_service_.GetEngineInfo (engine);
70+ Json::Value ret;
71+ if (status.has_value ()) {
14772 ret[" name" ] = status->name ;
14873 ret[" description" ] = status->description ;
14974 ret[" version" ] = status->version ;
@@ -153,48 +78,34 @@ void Engines::GetEngine(const HttpRequestPtr& req,
15378 auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
15479 resp->setStatusCode (k200OK);
15580 callback (resp);
156- } catch ( const std::runtime_error e) {
81+ } else {
15782 Json::Value ret;
158- ret[" message" ] = e. what () ;
83+ ret[" message" ] = " Engine not found " ;
15984 auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
16085 resp->setStatusCode (k400BadRequest);
16186 callback (resp);
162- } catch (const std::exception& e) {
163- Json::Value ret;
164- ret[" message" ] = e.what ();
165- auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
166- resp->setStatusCode (k500InternalServerError);
167- callback (resp);
16887 }
16988}
17089
17190void Engines::UninstallEngine (
17291 const HttpRequestPtr& req,
17392 std::function<void (const HttpResponsePtr&)>&& callback,
174- const std::string& engine) const {
175- LOG_INFO << " [Http] Uninstall engine " << engine;
176- auto engine_service = EngineService ();
93+ const std::string& engine) {
17794
95+ auto result = engine_service_.UninstallEngine (engine);
17896 Json::Value ret;
179- try {
180- // TODO: Unload the model which is currently running on engine_
181- // TODO: Unload engine if is loaded
182- engine_service.UninstallEngine (engine);
18397
184- ret[" message" ] = " Engine " + engine + " uninstalled successfully!" ;
185- auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
186- resp->setStatusCode (k200OK);
187- callback (resp);
188- } catch (const std::runtime_error& e) {
189- CLI_LOG (" Runtime exception" );
190- ret[" message" ] = " Engine " + engine + " is not installed!" ;
98+ if (result.has_error ()) {
99+ CTL_INF (result.error ());
100+ ret[" message" ] = result.error ();
191101 auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
192102 resp->setStatusCode (k400BadRequest);
193103 callback (resp);
194- } catch (const std::exception& e) {
195- ret[" message" ] = " Engine " + engine + " failed to uninstall: " + e.what ();
104+ } else {
105+ CTL_INF (" Engine uninstalled successfully" );
106+ ret[" message" ] = " Engine " + engine + " uninstalled successfully!" ;
196107 auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
197- resp->setStatusCode (k400BadRequest );
108+ resp->setStatusCode (k200OK );
198109 callback (resp);
199110 }
200111}
0 commit comments