diff --git a/src-tauri/src/auth.rs b/src-tauri/src/auth.rs index f09c789..c27e2e4 100644 --- a/src-tauri/src/auth.rs +++ b/src-tauri/src/auth.rs @@ -14,7 +14,7 @@ use serde::{Deserialize, Serialize}; use tauri::{AppHandle, Emitter, Manager}; use url::Url; -use crate::{db::{fetch_base_url, DatabaseAuth}, AppState, AppStatus, User, DB}; +use crate::{db::{DatabaseAuth, DatabaseImpls}, AppState, AppStatus, User, DB}; #[derive(Serialize)] #[serde(rename_all="camelCase")] @@ -81,7 +81,7 @@ pub fn generate_authorization_header() -> String { } pub fn fetch_user() -> Result { - let base_url = fetch_base_url(); + let base_url = DB.fetch_base_url(); let endpoint = base_url.join("/api/v1/client/user").unwrap(); let header = generate_authorization_header(); diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs index e58e5d9..775107b 100644 --- a/src-tauri/src/db.rs +++ b/src-tauri/src/db.rs @@ -9,8 +9,6 @@ use rustbreak::{deser::Bincode, PathDatabase}; use serde::{Deserialize, Serialize}; use url::Url; -use crate::DB; - #[derive(serde::Serialize, Clone, Deserialize)] #[serde(rename_all="camelCase")] pub struct DatabaseAuth { @@ -35,38 +33,43 @@ pub struct Database { pub type DatabaseInterface = rustbreak::Database; +pub trait DatabaseImpls { + fn set_up_database() -> DatabaseInterface; + fn database_is_set_up(&self) -> bool; + fn fetch_base_url(&self) -> Url; +} +impl DatabaseImpls for DatabaseInterface { + fn set_up_database() -> DatabaseInterface { + let db_path = DATA_ROOT_DIR.join("drop.db"); + let apps_base_dir = DATA_ROOT_DIR.join("apps"); + create_dir_all(DATA_ROOT_DIR.clone()).unwrap(); + create_dir_all(apps_base_dir.clone()).unwrap(); + + let default = Database { + auth: None, + base_url: "".to_string(), + downloads: DatabaseApps { + apps_base_dir: apps_base_dir.to_str().unwrap().to_string(), + }, + }; + #[allow(clippy::let_and_return)] + let db = match fs::exists(db_path.clone()).unwrap() { + true => PathDatabase::load_from_path(db_path).expect("Database loading failed"), + false => PathDatabase::create_at_path(db_path, default).unwrap(), + }; + + db + } + + fn database_is_set_up(&self) -> bool { + !self.borrow_data().unwrap().base_url.is_empty() + } + + fn fetch_base_url(&self) -> Url { + let handle = self.borrow_data().unwrap(); + Url::parse(&handle.base_url).unwrap() + } +} pub static DATA_ROOT_DIR: LazyLock = LazyLock::new(|| BaseDirs::new().unwrap().data_dir().join("drop")); - -pub fn set_up_database() -> DatabaseInterface { - let db_path = DATA_ROOT_DIR.join("drop.db"); - let apps_base_dir = DATA_ROOT_DIR.join("apps"); - - create_dir_all(DATA_ROOT_DIR.clone()).unwrap(); - create_dir_all(apps_base_dir.clone()).unwrap(); - - let default = Database { - auth: None, - base_url: "".to_string(), - downloads: DatabaseApps { - apps_base_dir: apps_base_dir.to_str().unwrap().to_string(), - }, - }; - #[allow(clippy::let_and_return)] - let db = match fs::exists(db_path.clone()).unwrap() { - true => PathDatabase::load_from_path(db_path).expect("Database loading failed"), - false => PathDatabase::create_at_path(db_path, default).unwrap(), - }; - - db -} - -pub fn database_is_set_up() -> bool { - !DB.borrow_data().unwrap().base_url.is_empty() -} - -pub fn fetch_base_url() -> Url { - let handle = DB.borrow_data().unwrap(); - Url::parse(&handle.base_url).unwrap() -} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 1d45c50..8751662 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -5,7 +5,7 @@ mod remote; mod unpacker; use auth::{auth_initiate, generate_authorization_header, recieve_handshake}; -use db::{fetch_base_url, DatabaseInterface, DATA_ROOT_DIR}; +use db::{DatabaseInterface, DATA_ROOT_DIR}; use env_logger::Env; use http::{header::*, response::Builder as ResponseBuilder}; use library::{fetch_game, fetch_library, Game}; @@ -16,6 +16,7 @@ use std::{ collections::HashMap, sync::{LazyLock, Mutex} }; use tauri_plugin_deep_link::DeepLinkExt; +use crate::db::DatabaseImpls; #[derive(Clone, Copy, Serialize)] pub enum AppStatus { @@ -53,7 +54,7 @@ fn fetch_state(state: tauri::State<'_, Mutex>) -> Result AppState { env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); - let is_set_up = db::database_is_set_up(); + let is_set_up = DB.database_is_set_up(); if !is_set_up { return AppState { status: AppStatus::NotConfigured, @@ -70,7 +71,7 @@ fn setup() -> AppState { } } -pub static DB: LazyLock = LazyLock::new(db::set_up_database); +pub static DB: LazyLock = LazyLock::new(DatabaseInterface::set_up_database); #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { @@ -135,7 +136,7 @@ pub fn run() { Ok(()) }) .register_asynchronous_uri_scheme_protocol("object", move |_ctx, request, responder| { - let base_url = fetch_base_url(); + let base_url = DB.fetch_base_url(); // Drop leading / let object_id = &request.uri().path()[1..]; diff --git a/src-tauri/src/library.rs b/src-tauri/src/library.rs index 2715194..448a950 100644 --- a/src-tauri/src/library.rs +++ b/src-tauri/src/library.rs @@ -4,7 +4,8 @@ use serde::{Deserialize, Serialize}; use serde_json::json; use tauri::{AppHandle, Manager}; -use crate::{auth::generate_authorization_header, db::fetch_base_url, AppState}; +use crate::{auth::generate_authorization_header, AppState, DB}; +use crate::db::DatabaseImpls; #[derive(Serialize, Deserialize, Clone)] #[serde(rename_all="camelCase")] @@ -24,7 +25,7 @@ pub struct Game { #[tauri::command] pub fn fetch_library(app: AppHandle) -> Result { - let base_url = fetch_base_url(); + let base_url = DB.fetch_base_url(); let library_url = base_url.join("/api/v1/client/user/library").unwrap(); let header = generate_authorization_header();