diff --git a/devenv.nix b/devenv.nix index 2dc4001..09ee8a7 100644 --- a/devenv.nix +++ b/devenv.nix @@ -20,6 +20,7 @@ pkgs.gtk3 pkgs.webkitgtk_4_1 pkgs.zed-editor + pkgs.openssl_3 # pkgs.webkitgtk # Linux Tauri dependency (Webview2 is the one used on Widnows) ]; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 88eb6c2..b3297bf 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -2,6 +2,9 @@ use sqlx::{migrate::MigrateDatabase, sqlite::SqlitePoolOptions, Pool, Sqlite}; use tauri::{App, Manager}; +mod repositories; +mod models; + // #[tauri::command] // fn greet(name: &str) -> String { // format!("Hello, {}! You've been greeted from Rust!", name) @@ -69,7 +72,7 @@ pub fn run() { ]) .setup(|app| { tauri::async_runtime::block_on(async move { - let db = setup_db(&app).await; + let db = setup_db(app).await; app.manage(AppState { db }); }); diff --git a/src-tauri/src/models/exercise.rs b/src-tauri/src/models/exercise.rs new file mode 100644 index 0000000..0d55b6f --- /dev/null +++ b/src-tauri/src/models/exercise.rs @@ -0,0 +1,6 @@ +pub struct Exercise { + id: u16, + ex_type: String, + content: String, + node_id: u32 +} diff --git a/src-tauri/src/models/mod.rs b/src-tauri/src/models/mod.rs new file mode 100644 index 0000000..c1e36d6 --- /dev/null +++ b/src-tauri/src/models/mod.rs @@ -0,0 +1,3 @@ +pub mod path; +pub mod node; +pub mod exercise; diff --git a/src-tauri/src/models/node.rs b/src-tauri/src/models/node.rs new file mode 100644 index 0000000..c6469c3 --- /dev/null +++ b/src-tauri/src/models/node.rs @@ -0,0 +1,6 @@ +pub struct Node { + id: u32, + title: String, + description: String, + path_id: String +} diff --git a/src-tauri/src/models/path.rs b/src-tauri/src/models/path.rs new file mode 100644 index 0000000..f57507b --- /dev/null +++ b/src-tauri/src/models/path.rs @@ -0,0 +1,12 @@ + +#[derive(Debug, sqlx::FromRow)] +pub struct Path { + id: String, + title: String, + description: String, +} + +pub struct PathVersions { + path_id: String, + version_number: String, +} diff --git a/src-tauri/src/repositories/mod.rs b/src-tauri/src/repositories/mod.rs index e69de29..85db469 100644 --- a/src-tauri/src/repositories/mod.rs +++ b/src-tauri/src/repositories/mod.rs @@ -0,0 +1 @@ +pub mod path_repository; diff --git a/src-tauri/src/repositories/path_repository.rs b/src-tauri/src/repositories/path_repository.rs index f500319..2eee7a2 100644 --- a/src-tauri/src/repositories/path_repository.rs +++ b/src-tauri/src/repositories/path_repository.rs @@ -1,11 +1,43 @@ -use sqlx::sqlite::{SqlitePool}; +use sqlx::{pool, sqlite::SqlitePool, FromRow}; + +use crate::models::path::Path; pub struct PathRepository<'a> { pub pool: &'a SqlitePool, } impl<'a> PathRepository<'a> { - pub fn get_path_by_id(&self, id: i32) -> Result{ + pub async fn get_path_by_id(&self, id: i32) -> Result { + let result = sqlx::query("SELECT * FROM path WHERE id = ?") + .bind(id) + .fetch_all(self.pool) + .await + .map_err(|e| format!("ERROR: Failed to query Path db: {} ", e)) + .unwrap(); + if result.len() > 1 { + return Err(format!("ERROR: Multiple paths for ID {} found", id)); + } else if result.is_empty(){ + return Err(format!("ERROR: No Path with ID {} found", id)); + } + + let path = match result.first() { + Some(p) => match Path::from_row(p) { + Ok(p) => {p}, + Err(e) => {return Err(format!("ERROR: Could not parse Path: {}", e));}, + }, + None => return Err(format!("ERROR: No path for ID {} found", id)), + }; + + Ok(path) } -} \ No newline at end of file + + pub async fn get_all_paths(&self) -> Result, String> { + let rows = sqlx::query_as::<_, Path>("SELECT * FROM paths") + .fetch_all(self.pool) + .await + .map_err(|e| e.to_string())?; + + Ok(rows) + } +} diff --git a/src-tauri/src/services/mod.rs b/src-tauri/src/services/mod.rs new file mode 100644 index 0000000..e69de29