From 984ebc4fb0de79bd383c7a2835d0cb9d4318a6d6 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Thu, 26 Oct 2023 22:56:49 +0100 Subject: [PATCH 1/5] feat: completed the rust side of the new wolves api --- src/bin/update_data.rs | 96 +++++++++++++++++++++--------------------- src/lib.rs | 10 +++++ 2 files changed, 59 insertions(+), 47 deletions(-) diff --git a/src/bin/update_data.rs b/src/bin/update_data.rs index 189c12c..910648a 100644 --- a/src/bin/update_data.rs +++ b/src/bin/update_data.rs @@ -1,4 +1,5 @@ use ldap3::{LdapConn, Scope, SearchEntry}; +use serde::{Deserialize, Serialize}; use skynet_ldap_backend::{db_init, get_config, AccountWolves, Accounts, Config}; use sqlx::{Pool, Sqlite}; @@ -14,15 +15,7 @@ async fn main() -> tide::Result<()> { } async fn update_wolves(config: &Config, db: &Pool) { - let mut records = vec![]; - - if let Ok(accounts) = get_csv(config) { - for account in accounts { - records.push(AccountWolves::from(account)); - } - } - - for account in records { + for account in get_wolves(config).await { update_account(db, &account).await; } } @@ -103,55 +96,64 @@ async fn update_ldap(config: &Config, db: &Pool) { // done with ldap ldap.unbind().unwrap(); } - -#[derive(Debug, serde::Deserialize)] -struct RecordCSV { - #[serde(rename = "MemID")] - mem_id: String, - #[serde(rename = "Student Num")] - id_student: String, - #[serde(rename = "Contact Email")] - email: String, - #[serde(rename = "Expiry")] - expiry: String, - #[serde(rename = "First Name")] - name_first: String, - #[serde(rename = "Last Name")] - name_second: String, -} -impl From for AccountWolves { - fn from(input: RecordCSV) -> Self { +impl From<&WolvesResultUser> for AccountWolves { + fn from(input: &WolvesResultUser) -> Self { AccountWolves { - id_wolves: input.mem_id, - id_student: if input.id_student.is_empty() { None } else { Some(input.id_student) }, - email: input.email, - expiry: input.expiry, - name_first: if input.name_first.is_empty() { None } else { Some(input.name_first) }, - name_second: if input.name_second.is_empty() { None } else { Some(input.name_second) }, + id_wolves: input.wolves_id.to_owned(), + id_student: input.student_id.to_owned(), + email: input.email.to_owned(), + expiry: input.expiry.to_owned(), + name_first: Some(input.first_name.to_owned()), + name_second: Some(input.last_name.to_owned()), } } } -fn get_csv(config: &Config) -> Result, Box> { - let mut records: Vec = vec![]; +#[derive(Deserialize, Serialize, Debug)] +struct WolvesResultUser { + committee: String, + wolves_id: String, + first_name: String, + last_name: String, + email: String, + student_id: Option, + note: Option, + expiry: String, + requested: String, + approved: String, + sitename: String, + domain: String +} +#[derive(Deserialize, Serialize, Debug)] +struct WolvesResult { + success: i8, + result: Vec +} - let csv = format!("{}/{}", &config.home, &config.csv); - println!("CSV: {:?}", &csv); - if let Ok(mut rdr) = csv::Reader::from_path(csv) { - for result in rdr.deserialize() { - // Notice that we need to provide a type hint for automatic - // deserialization. - let record: RecordCSV = result?; - if record.mem_id.is_empty() { - continue; - } - records.push(record); +async fn get_wolves(config: &Config) -> Vec { + if config.wolves_key.is_empty() { + return vec![]; + } + if config.wolves_url.is_empty() { + return vec![]; + } + + // get wolves data + let uri = &config.wolves_url; + let mut res = surf::post(uri).header("X-AM-Identity", &config.wolves_key).await.unwrap(); + + if let Ok(WolvesResult { success, result }) = res.body_json().await { + if success != 1 { + return vec![]; } + + return result.iter().map(|wolves| AccountWolves::from(wolves) ).collect::>(); } - Ok(records) + vec![] } + async fn update_account(db: &Pool, account: &AccountWolves) { sqlx::query_as::<_, AccountWolves>( " diff --git a/src/lib.rs b/src/lib.rs index 420a1c1..979b8e2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -188,6 +188,8 @@ pub struct Config { pub ssh_root: String, pub auth_discord: String, pub users_restricted: Vec, + pub wolves_url: String, + pub wolves_key: String, } pub fn get_config() -> Config { @@ -208,6 +210,8 @@ pub fn get_config() -> Config { ssh_root: "skynet_old".to_string(), auth_discord: "".to_string(), users_restricted: vec![], + wolves_url: "".to_string(), + wolves_key: "".to_string(), }; if let Ok(x) = env::var("LDAP_HOST") { @@ -246,6 +250,12 @@ pub fn get_config() -> Config { if let Ok(x) = env::var("LDAP_DISCORD_AUTH") { config.auth_discord = x.trim().to_string(); } + if let Ok(x) = env::var("WOLVES_URL") { + config.wolves_url = x.trim().to_string(); + } + if let Ok(x) = env::var("WOLVES_KEY") { + config.wolves_key = x.trim().to_string(); + } if let Ok(x) = env::var("USERS_RESTRICTED") { // usernames that are restricted -- 2.46.1 From 1e9b49f4594dd48ac0905ed3ce7a6f0a7602c716 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Thu, 26 Oct 2023 22:59:30 +0100 Subject: [PATCH 2/5] feat: nixos side of the config Closes #20 --- flake.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/flake.nix b/flake.nix index 75e8240..709c9b9 100644 --- a/flake.nix +++ b/flake.nix @@ -80,6 +80,7 @@ "${cfg.env.ldap}" "${cfg.env.discord}" "${cfg.env.mail}" + "${cfg.env.wolves}" ]; }; }); @@ -124,6 +125,10 @@ type = types.str; description = "Mail details, has EMAIL_SMTP, EMAIL_USER, EMAIL_PASS"; }; + wolves = mkOption rec { + type = types.str; + description = "Mail details, has WOLVES_URL, WOLVES_KEY"; + }; }; users = { @@ -213,12 +218,14 @@ "${cfg.env.ldap}" "${cfg.env.discord}" "${cfg.env.mail}" + "${cfg.env.wolves}" ]; }; restartTriggers = [ "${cfg.env.ldap}" "${cfg.env.discord}" "${cfg.env.mail}" + "${cfg.env.wolves}" ]; }; } // serviceGenerator scripts; -- 2.46.1 From ba06d1ec0bdd1d6828ff2bde34706b639820a648 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Thu, 26 Oct 2023 23:06:59 +0100 Subject: [PATCH 3/5] fmt: clippy and fmt --- src/bin/update_data.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/bin/update_data.rs b/src/bin/update_data.rs index 910648a..a637020 100644 --- a/src/bin/update_data.rs +++ b/src/bin/update_data.rs @@ -122,12 +122,12 @@ struct WolvesResultUser { requested: String, approved: String, sitename: String, - domain: String + domain: String, } #[derive(Deserialize, Serialize, Debug)] struct WolvesResult { success: i8, - result: Vec + result: Vec, } async fn get_wolves(config: &Config) -> Vec { @@ -137,23 +137,26 @@ async fn get_wolves(config: &Config) -> Vec { if config.wolves_url.is_empty() { return vec![]; } - + // get wolves data let uri = &config.wolves_url; let mut res = surf::post(uri).header("X-AM-Identity", &config.wolves_key).await.unwrap(); - - if let Ok(WolvesResult { success, result }) = res.body_json().await { + + if let Ok(WolvesResult { + success, + result, + }) = res.body_json().await + { if success != 1 { return vec![]; } - return result.iter().map(|wolves| AccountWolves::from(wolves) ).collect::>(); + return result.iter().map(AccountWolves::from).collect::>(); } vec![] } - async fn update_account(db: &Pool, account: &AccountWolves) { sqlx::query_as::<_, AccountWolves>( " -- 2.46.1 From b729c050f99fab760155bbe45b21b30afa5d0349 Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Fri, 27 Oct 2023 01:42:54 +0100 Subject: [PATCH 4/5] fix: better error handling --- src/bin/update_data.rs | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/bin/update_data.rs b/src/bin/update_data.rs index a637020..8bb25f4 100644 --- a/src/bin/update_data.rs +++ b/src/bin/update_data.rs @@ -139,19 +139,18 @@ async fn get_wolves(config: &Config) -> Vec { } // get wolves data - let uri = &config.wolves_url; - let mut res = surf::post(uri).header("X-AM-Identity", &config.wolves_key).await.unwrap(); + if let Ok(mut res) = surf::post(&config.wolves_url).header("X-AM-Identity", &config.wolves_key).await { + if let Ok(WolvesResult { + success, + result, + }) = res.body_json().await + { + if success != 1 { + return vec![]; + } - if let Ok(WolvesResult { - success, - result, - }) = res.body_json().await - { - if success != 1 { - return vec![]; + return result.iter().map(AccountWolves::from).collect::>(); } - - return result.iter().map(AccountWolves::from).collect::>(); } vec![] -- 2.46.1 From c1f5be0a62f1625a45b05f764aa4ec795045a89b Mon Sep 17 00:00:00 2001 From: Brendan Golden Date: Fri, 27 Oct 2023 01:48:37 +0100 Subject: [PATCH 5/5] feat: remove the last traces of the csv --- Cargo.lock | 22 ---------------------- Cargo.toml | 3 --- flake.nix | 1 - src/lib.rs | 5 ----- 4 files changed, 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3338b6e..e6cf9fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,27 +661,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "csv" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - [[package]] name = "ctor" version = "0.1.26" @@ -2515,7 +2494,6 @@ version = "0.1.0" dependencies = [ "async-std", "chrono", - "csv", "dotenvy", "ldap3", "lettre", diff --git a/Cargo.toml b/Cargo.toml index 5a3f833..a54eb15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,9 +34,6 @@ rand = "0.8.5" # fancy time stuff chrono = "0.4.26" -# handlign teh csv export from wolves -csv = "1.2" - # for email lettre = "0.10.4" maud = "0.25.0" diff --git a/flake.nix b/flake.nix index 709c9b9..1c6ac58 100644 --- a/flake.nix +++ b/flake.nix @@ -50,7 +50,6 @@ # basic server stuff HOME = cfg.home; DATABASE = "database.db"; - CSV = "wolves.csv"; HOST_PORT = cfg.host_port; SSH_ROOT = "skynet_old"; diff --git a/src/lib.rs b/src/lib.rs index 979b8e2..532c7d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -180,7 +180,6 @@ pub struct Config { pub ldap_admin_pw: String, pub home: String, pub database: String, - pub csv: String, pub host_port: String, pub mail_smtp: String, pub mail_user: String, @@ -202,7 +201,6 @@ pub fn get_config() -> Config { ldap_admin_pw: "".to_string(), home: ".".to_string(), database: "database.db".to_string(), - csv: "wolves.csv".to_string(), host_port: "127.0.0.1:8087".to_string(), mail_smtp: "".to_string(), mail_user: "".to_string(), @@ -229,9 +227,6 @@ pub fn get_config() -> Config { if let Ok(x) = env::var("DATABASE") { config.database = x.trim().to_string(); } - if let Ok(x) = env::var("CSV") { - config.csv = x.trim().to_string(); - } if let Ok(x) = env::var("HOST_PORT") { config.host_port = x.trim().to_string(); } -- 2.46.1