From 2f02e283c010de0ec89b50404d48bf29ac9f7b16 Mon Sep 17 00:00:00 2001 From: Djeeberjr Date: Fri, 16 May 2025 17:47:08 +0200 Subject: [PATCH] added api route for id mappings also need rocket json feature --- Cargo.lock | 1 + Cargo.toml | 2 +- src/webserver.rs | 37 +++++++++++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62ab535..69fb7af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1116,6 +1116,7 @@ dependencies = [ "rocket_codegen", "rocket_http", "serde", + "serde_json", "state", "tempfile", "time", diff --git a/Cargo.toml b/Cargo.toml index 50aa4fe..b536daf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ gpio = "0.4.1" regex = "1.11.1" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.140" -rocket = "0.5.1" +rocket = { version = "0.5.1", features = ["json"] } tokio = { version = "1.44.2", features = ["full"] } rust-embed = "8.7.0" log = "0.4.27" diff --git a/src/webserver.rs b/src/webserver.rs index e9a2afb..e18a7a7 100644 --- a/src/webserver.rs +++ b/src/webserver.rs @@ -1,20 +1,32 @@ -use log::{error, info, warn}; +use log::{debug, error, info, warn}; +use rocket::data::FromData; use rocket::http::Status; -use rocket::{Config, State}; +use rocket::serde::json::Json; +use rocket::{Config, State, post}; use rocket::{get, http::ContentType, response::content::RawHtml, routes}; use rust_embed::Embed; +use serde::Deserialize; use std::borrow::Cow; use std::env; use std::ffi::OsStr; use std::sync::Arc; +use std::time::Instant; use tokio::sync::Mutex; +use crate::id_mapping::{IDMapping, Name}; use crate::id_store::IDStore; +use crate::tally_id::TallyID; #[derive(Embed)] #[folder = "web/dist"] struct Asset; +#[derive(Deserialize)] +struct NewMapping { + id: String, + name: Name, +} + pub async fn start_webserver(store: Arc>) -> Result<(), rocket::Error> { let port = match env::var("HTTP_PORT") { Ok(port) => port.parse().unwrap_or_else(|_| { @@ -31,7 +43,10 @@ pub async fn start_webserver(store: Arc>) -> Result<(), rocket::E }; rocket::custom(config) - .mount("/", routes![static_files, index, export_csv]) + .mount( + "/", + routes![static_files, index, export_csv, get_mapping, add_mapping], + ) .manage(store) .launch() .await?; @@ -63,8 +78,22 @@ async fn export_csv(manager: &State>>) -> Result Ok(csv), Err(e) => { - error!("Failed to generate csv: {}", e); + error!("Failed to generate csv: {e}"); Err(Status::InternalServerError) } } } + +#[get("/api/mapping")] +async fn get_mapping(store: &State>>) -> Json { + Json(store.lock().await.mapping.clone()) +} + +#[post("/api/mapping", format = "json", data = "")] +async fn add_mapping(store: &State>>, new_mapping: Json) { + store + .lock() + .await + .mapping + .add_mapping(TallyID(new_mapping.id.clone()), new_mapping.name.clone()); +}