From e3dd339ffe37b5c49e18049017e123e5c1fbd993 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sun, 2 Apr 2023 23:33:24 +0300 Subject: [PATCH] add rudimentary adding and listing of objects --- lab2/database.sqlite | Bin 143360 -> 143360 bytes lab2/src-tauri/Cargo.lock | 5 +- lab2/src-tauri/Cargo.toml | 1 + lab2/src-tauri/src/main.rs | 141 +++++++++++++++++----- lab2/src/lib/FactoryForm.svelte | 11 +- lab2/src/lib/ManagerForm.svelte | 23 ++-- lab2/src/lib/api.ts | 72 +++++++++++ lab2/src/routes/Factories-Managers.svelte | 134 ++++++++++++++------ 8 files changed, 299 insertions(+), 88 deletions(-) create mode 100644 lab2/src/lib/api.ts diff --git a/lab2/database.sqlite b/lab2/database.sqlite index 408a8cb97800170cb6bae214a55eb864d38e70fb..923354d9bb4a8f9f928b50569ec55788344fa761 100644 GIT binary patch delta 508 zcmZp8z|ru4V}dlJ%tRSyRv898|Jscy3;KoF`Ar%4AM@|zU&vp@pUUsWZ@RJZ2H)g& z^W5u&dD$66MR`Se6N^*QU|5oeok3EPR}v}+5r&Y$+*s7BaX7zx+2d8ZawxF!4WU;Qzw^d^4lKRepIf1`yz8VwPs~b@X#|cMW3WVq}))aC3AH I@ehgw0Cd42>i_@% diff --git a/lab2/src-tauri/Cargo.lock b/lab2/src-tauri/Cargo.lock index 9864c94..c0ebba2 100644 --- a/lab2/src-tauri/Cargo.lock +++ b/lab2/src-tauri/Cargo.lock @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" [[package]] name = "async-attributes" @@ -1406,6 +1406,7 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" name = "ice-production" version = "0.0.0" dependencies = [ + "anyhow", "async-std", "dotenv", "serde", diff --git a/lab2/src-tauri/Cargo.toml b/lab2/src-tauri/Cargo.toml index 9f1f304..84a6ade 100644 --- a/lab2/src-tauri/Cargo.toml +++ b/lab2/src-tauri/Cargo.toml @@ -19,6 +19,7 @@ sqlx = { version = "0.6.2", features = ["runtime-async-std-native-tls", "mysql", async-std = {version = "1.12.0", features = ["attributes"] } serde_json = "1.0" dotenv = "0.15.0" +anyhow = "1.0.70" [features] # this feature is used for production builds or when `devPath` points to the filesystem diff --git a/lab2/src-tauri/src/main.rs b/lab2/src-tauri/src/main.rs index f35bbf6..e88d3f0 100644 --- a/lab2/src-tauri/src/main.rs +++ b/lab2/src-tauri/src/main.rs @@ -5,11 +5,16 @@ use std::{env, process::exit}; use dotenv::dotenv; use serde::{Serialize, Deserialize}; -use sqlx::{SqlitePool, sqlite::SqlitePoolOptions, Pool, Sqlite}; +use sqlx::{SqlitePool, sqlite::SqlitePoolOptions, Pool, Sqlite, Row}; use tauri::State; +// TODO: use transaction to revert changes, if failed to insert rows + +type Id = i64; + +#[derive(Serialize)] struct Manager { - id: i64, + id: Id, first_name: String, surname: String, phone_number: Option, @@ -17,42 +22,114 @@ struct Manager { email: Option } +#[derive(Deserialize)] +struct ManagerData { + first_name: String, + surname: String, + phone_number: Option, + title: String, + email: Option +} + +#[derive(Serialize)] +struct Factory { + id: Id, + name: String, + location: String, + floor_size: f64, + manager_id: Id +} +#[derive(Deserialize)] +struct FactoryData { + name: String, + location: String, + floor_size: f64 +} + struct Database { pool: Pool } -#[derive(Serialize, Deserialize)] -enum AddResponse { - Success(i64) +struct EntryID { + id: Id +} + +async fn add_manager(db: &Database, manager: &ManagerData) -> anyhow::Result { + let entry = sqlx::query_as!( + EntryID, + r#" + INSERT INTO manager + (`FIRST_NAME`, `SURNAME`, `PHONE_NUMBER`, `TITLE`, `EMAIL`) + VALUES + (?, ?, ?, ?, ?) + RETURNING ID as id + "#, + manager.first_name, + manager.surname, + manager.phone_number, + manager.title, + manager.email + ).fetch_one(&db.pool).await?; + Ok(entry.id) +} + +async fn add_factory(db: &Database, manager_id: Id, factory: &FactoryData) -> anyhow::Result { + let entry = sqlx::query_as!( + EntryID, + r#" + INSERT INTO factory + (`NAME`, `LOCATION`, `FLOOR_SIZE`, `FK_MANAGER_ID`) + VALUES + (?, ?, ?, ?) + RETURNING ID as id + "#, + factory.name, + factory.location, + factory.floor_size, + manager_id + ).fetch_one(&db.pool).await?; + Ok(entry.id) +} + +async fn list_factories_db(db: &Database) -> anyhow::Result> { + let factories = sqlx::query_as!( + Factory, + r#" + SELECT ID as id, NAME as name, LOCATION as location, FLOOR_SIZE as floor_size, FK_MANAGER_ID as manager_id FROM factory + "#, + ).fetch_all(&db.pool).await?; + Ok(factories) +} + +async fn list_managers_db(db: &Database) -> anyhow::Result> { + let managers = sqlx::query_as!( + Manager, + r#" + SELECT ID as id, FIRST_NAME as first_name, SURNAME as surname, TITLE as title, EMAIL as email, PHONE_NUMBER as phone_number FROM manager + "#, + ).fetch_all(&db.pool).await?; + Ok(managers) } #[tauri::command] -async fn add_manager( - first_name: &str, - surname: &str, - phone_number: Option<&str>, - title: &str, - email: Option<&str>, - database: State<'_, Database> - ) -> Result { - let id = sqlx::query_as!( - Manager, - r#" - INSERT INTO manager - (`FIRST_NAME`, `SURNAME`, `PHONE_NUMBER`, `TITLE`, `EMAIL`) - VALUES - (?, ?, ?, ?, ?) - "#, - first_name, - surname, - phone_number, - title, - email - ).execute(&database.pool) - .await.map_err(|_| ())? - .last_insert_rowid(); +async fn add_manager_factory( + factory: FactoryData, + manager: ManagerData, + db: State<'_, Database> + ) -> Result<(Id, Id), ()> { + let manager_id = add_manager(&db, &manager).await.unwrap(); + let factory_id = add_factory(&db, manager_id, &factory).await.unwrap(); + Ok((factory_id, manager_id)) +} - Ok(AddResponse::Success(id)) +#[tauri::command] +async fn list_managers(db: State<'_, Database>) -> Result, ()> { + Ok(list_managers_db(&db).await.unwrap()) // TODO: handle .unwrap() +} + +#[tauri::command] +async fn list_factories(db: State<'_, Database>) -> Result, ()> { + Ok(list_factories_db(&db).await.unwrap()) // TODO: handle .unwrap() } #[async_std::main] @@ -76,7 +153,9 @@ async fn main() { tauri::Builder::default() .manage(Database { pool }) .invoke_handler(tauri::generate_handler![ - add_manager + list_factories, + list_managers, + add_manager_factory ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/lab2/src/lib/FactoryForm.svelte b/lab2/src/lib/FactoryForm.svelte index 63ed0c9..900dd74 100644 --- a/lab2/src/lib/FactoryForm.svelte +++ b/lab2/src/lib/FactoryForm.svelte @@ -1,11 +1,12 @@ @@ -78,13 +117,19 @@ shouldFilterRows bind:filteredRowIds /> - - + + - - {#if cell.key === "update-btn"} -