diff --git a/src/main.rs b/src/main.rs index 876fbf5..31c7edc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -160,6 +160,7 @@ async fn request(req: HttpRequest, body: String) -> HttpResponse { "/api/webui/userInfo" => router::webui::user(req), "/webui/logout" => router::webui::logout(req), "/api/webui/admin" => router::webui::admin(req), + "/api/webui/export" => router::webui::export(req), _ => api_req(req, body) } } diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index 2dadddf..c0e6851 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -600,3 +600,14 @@ pub fn set_server_time(time: i64, token: &str) -> JsonValue { pub fn webui_logout(token: &str) { DATABASE.lock_and_exec("DELETE FROM webui WHERE token=?1", params!(token)); } + +pub fn export_user(token: &str) -> Option { + let login_token = webui_login_token(token)?; + + Some(object!{ + userdata: json::stringify(get_acc(&login_token)), + userhome: json::stringify(get_acc_home(&login_token)), + missions: json::stringify(get_acc_missions(&login_token)), + sifcards: json::stringify(get_acc_sif(&login_token)) + }) +} diff --git a/src/router/webui.rs b/src/router/webui.rs index 3ca851c..26ad485 100644 --- a/src/router/webui.rs +++ b/src/router/webui.rs @@ -215,6 +215,21 @@ pub fn admin_post(req: HttpRequest, body: String) -> HttpResponse { result: "OK" }; HttpResponse::Ok() - .insert_header(ContentType::json()) - .body(json::stringify(resp)) + .insert_header(ContentType::json()) + .body(json::stringify(resp)) } + +pub fn export(req: HttpRequest) -> HttpResponse { + let token = get_login_token(&req); + if token.is_none() { + return error("Not logged in"); + } + let resp = object!{ + result: "OK", + data: userdata::export_user(&token.unwrap()).unwrap() + }; + HttpResponse::Ok() + .insert_header(ContentType::json()) + .body(json::stringify(resp)) +} + diff --git a/webui/src/home/Home.jsx b/webui/src/home/Home.jsx index 3f60187..633fee7 100644 --- a/webui/src/home/Home.jsx +++ b/webui/src/home/Home.jsx @@ -70,6 +70,25 @@ function Home() { const logout = () => { window.location.href = "/webui/logout"; } + const downloadFile = (contents, name) => { + let a = document.createElement("a"); + a.href = URL.createObjectURL(new Blob([contents], {type: "application/json"})); + a.download = name; + a.click(); + } + const expor = async (e) => { + e.preventDefault(); + let resp = await Request("/api/webui/export"); + if (resp.result !== "OK") { + error[1](resp.message); + return; + } + downloadFile(resp.data.userdata, "userdata.json"); + downloadFile(resp.data.userhome, "userhome.json"); + downloadFile(resp.data.missions, "missions.json"); + downloadFile(resp.data.sifcards, "sifcards.json"); + + } const handleSubmit = async (event) => { event.preventDefault(); let time = Math.round(new Date(inputValue.trim()).getTime() / 1000); @@ -135,6 +154,7 @@ function Home() { return (
+


Home