From 9a0fda367c5ce62c7725f625233c58669730ffcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Jungmann?= Date: Thu, 17 Aug 2023 19:53:14 +0200 Subject: [PATCH 1/2] feat: make mutation public for other crates in workspace --- core/src/database/mutation/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/database/mutation/mod.rs b/core/src/database/mutation/mod.rs index ef22e13c..8099a0cd 100644 --- a/core/src/database/mutation/mod.rs +++ b/core/src/database/mutation/mod.rs @@ -1,4 +1,4 @@ -pub(crate) struct Mutation; +pub struct Mutation; pub mod application; pub mod session; From 179e6daf982ef00f91d1b3e9d3f40c4d94758d35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Jungmann?= Date: Thu, 17 Aug 2023 19:54:01 +0200 Subject: [PATCH 2/2] feat: add set_admin function --- Cargo.lock | 18 +++++----- cli/Cargo.toml | 2 +- cli/src/main.rs | 53 +++++++++++++++++++++++++---- core/src/database/mutation/admin.rs | 39 +++++++++++++++++++++ core/src/database/mutation/mod.rs | 1 + 5 files changed, 97 insertions(+), 16 deletions(-) create mode 100644 core/src/database/mutation/admin.rs diff --git a/Cargo.lock b/Cargo.lock index f1ad4ade..df60b3c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1105,9 +1105,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -1545,9 +1545,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2089,9 +2089,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" @@ -3708,12 +3708,12 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna 0.4.0", "percent-encoding", ] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 74dbff79..f293f799 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" publish = false [dependencies] -url = "^2.3" +url = "^2.4" clap = { version = "^4.3", features = ["cargo"] } portfolio-entity = { path = "../entity" } diff --git a/cli/src/main.rs b/cli/src/main.rs index 231d9a21..c983eeba 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,8 +4,8 @@ use clap::{arg, ArgAction, ArgMatches, command, Command, value_parser}; use sea_orm::{Database, DatabaseConnection, DbConn}; use url::Url; -use portfolio_core::{crypto, Query}; -use portfolio_core::services::portfolio_service::{FileType}; +use portfolio_core::{crypto, Query, Mutation}; +use portfolio_core::services::portfolio_service::FileType; use portfolio_core::utils::csv::{ApplicationCsv, CsvExporter}; async fn get_admin_private_key(db: &DbConn, sub_matches: &ArgMatches) -> Result> { @@ -84,7 +84,8 @@ async fn main() -> Result<(), Box> { arg!( -a --admin_id "Admin ID" ) - .required(false), + .required(false) + .value_parser(value_parser!(i32)), ) ) .subcommand( @@ -128,7 +129,8 @@ async fn main() -> Result<(), Box> { arg!( -a --admin_id "Admin ID" ) - .required(false), + .required(false) + .value_parser(value_parser!(i32)), ) ) .subcommand( @@ -177,7 +179,8 @@ async fn main() -> Result<(), Box> { arg!( -a --admin_id "Admin ID" ) - .required(false), + .required(false) + .value_parser(value_parser!(i32)), ) ) .subcommand( @@ -244,8 +247,37 @@ async fn main() -> Result<(), Box> { -p --password "Password" ) .required(true) - ), + .value_parser(value_parser!(String)) + ) + .subcommand( + Command::new("db") + .about("Write to database") + .arg( + arg!( + -d --database "URL to the database or sql file with postgres:// or sqlite://" + ) + .alias("url") + .required(true) + .value_parser(value_parser!(Url)), + ) + // arg for id + .arg( + arg!( + -i --id "Admin ID" + ) + .required(true) + .value_parser(value_parser!(i32)) + ) + .arg( + arg!( + -n --name "Admin name" + ) + .required(true) + .value_parser(value_parser!(String)) + ) + ) ) + // .get_matches(); match clap.subcommand() { @@ -355,6 +387,15 @@ async fn main() -> Result<(), Box> { .unwrap(); + if let Some(sub_matches) = sub_matches.subcommand_matches("db") { + let db = get_db_conn(sub_matches).await?; + let admin_id = sub_matches.get_one::("id").unwrap().to_owned(); + let admin_name = sub_matches.get_one::("name").unwrap().to_owned(); + Mutation::set_admin(&db, admin_id, admin_name, pubkey.clone(), priv_key.clone(), password_hash.clone()) + .await?; + println!("Admin {} created", admin_id); + } + println!("{}", pubkey); println!("{}", priv_key); println!("{}", password_hash); diff --git a/core/src/database/mutation/admin.rs b/core/src/database/mutation/admin.rs new file mode 100644 index 00000000..8a6f3d65 --- /dev/null +++ b/core/src/database/mutation/admin.rs @@ -0,0 +1,39 @@ +use chrono::Utc; +use entity::admin; +use sea_orm::{DbConn, DbErr, Set, ActiveModelTrait, EntityTrait}; + +use crate::Mutation; + +impl Mutation { + pub async fn set_admin( + db: &DbConn, + admin_id: i32, + name: String, + public_key: String, + private_key: String, + password: String, + ) -> Result { + let admin_exists = admin::Entity::find_by_id(admin_id) + .one(db) + .await + .expect("Db Error"); + + let admin = admin::ActiveModel { + id: Set(admin_id), + name: Set(name), + public_key: Set(public_key), + private_key: Set(private_key), + password: Set(password), + created_at: Set(Utc::now().naive_local()), + updated_at: Set(Utc::now().naive_local()) + }; + + if admin_exists.is_some() { + admin.update(db).await + } else { + admin.insert(db).await + } + } + + +} \ No newline at end of file diff --git a/core/src/database/mutation/mod.rs b/core/src/database/mutation/mod.rs index 8099a0cd..6d40947c 100644 --- a/core/src/database/mutation/mod.rs +++ b/core/src/database/mutation/mod.rs @@ -1,5 +1,6 @@ pub struct Mutation; +pub mod admin; pub mod application; pub mod session; pub mod candidate;