From b7f62b78b102d1fcfd53d78fa400a7afbc78db8e Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Wed, 26 Mar 2025 07:54:58 -0700 Subject: [PATCH] Clean up DB refactor access (#192) --- src-tauri/src/history.rs | 8 +- src-tauri/src/http_request.rs | 81 ++-- src-tauri/src/lib.rs | 381 +++++------------- src-tauri/src/notifications.rs | 14 +- src-tauri/src/plugin_events.rs | 65 +-- src-tauri/src/updates.rs | 10 +- src-tauri/yaak-license/src/license.rs | 16 +- src-tauri/yaak-models/src/commands.rs | 7 +- src-tauri/yaak-models/src/connection_or_tx.rs | 25 ++ .../src/{queries/base.rs => db_context.rs} | 42 +- src-tauri/yaak-models/src/lib.rs | 10 +- src-tauri/yaak-models/src/manager.rs | 108 ----- src-tauri/yaak-models/src/models.rs | 2 +- src-tauri/yaak-models/src/queries/batch.rs | 4 +- .../yaak-models/src/queries/cookie_jars.rs | 4 +- .../yaak-models/src/queries/environments.rs | 4 +- src-tauri/yaak-models/src/queries/folders.rs | 4 +- .../src/queries/grpc_connections.rs | 6 +- .../yaak-models/src/queries/grpc_events.rs | 4 +- .../yaak-models/src/queries/grpc_requests.rs | 10 +- .../yaak-models/src/queries/http_requests.rs | 10 +- .../yaak-models/src/queries/http_responses.rs | 6 +- .../yaak-models/src/queries/key_values.rs | 4 +- src-tauri/yaak-models/src/queries/mod.rs | 3 +- .../src/queries/plugin_key_values.rs | 2 +- src-tauri/yaak-models/src/queries/plugins.rs | 8 +- src-tauri/yaak-models/src/queries/settings.rs | 16 +- .../yaak-models/src/queries/sync_states.rs | 4 +- .../src/queries/websocket_connections.rs | 6 +- .../src/queries/websocket_events.rs | 4 +- .../src/queries/websocket_requests.rs | 10 +- .../src/queries/workspace_metas.rs | 8 +- .../yaak-models/src/queries/workspaces.rs | 4 +- src-tauri/yaak-models/src/query_manager.rs | 124 ++++++ .../src/{queries_legacy.rs => util.rs} | 9 +- src-tauri/yaak-plugins/src/manager.rs | 6 +- src-tauri/yaak-sync/src/sync.rs | 48 +-- src-tauri/yaak-ws/src/commands.rs | 95 ++--- src-web/lib/tauri.ts | 3 - 39 files changed, 470 insertions(+), 705 deletions(-) create mode 100644 src-tauri/yaak-models/src/connection_or_tx.rs rename src-tauri/yaak-models/src/{queries/base.rs => db_context.rs} (83%) delete mode 100644 src-tauri/yaak-models/src/manager.rs create mode 100644 src-tauri/yaak-models/src/query_manager.rs rename src-tauri/yaak-models/src/{queries_legacy.rs => util.rs} (95%) diff --git a/src-tauri/src/history.rs b/src-tauri/src/history.rs index 1e92f1e1..1ae629c7 100644 --- a/src-tauri/src/history.rs +++ b/src-tauri/src/history.rs @@ -1,6 +1,6 @@ use tauri::{AppHandle, Runtime}; -use yaak_models::manager::QueryManagerExt; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::UpdateSource; const NAMESPACE: &str = "analytics"; const NUM_LAUNCHES_KEY: &str = "num_launches"; @@ -22,7 +22,6 @@ pub async fn store_launch_history(app_handle: &AppHandle) -> Laun info.current_version = app_handle.package_info().version.to_string(); app_handle - .queries() .with_tx(|tx| { info.previous_version = tx.get_key_value_string(NAMESPACE, last_tracked_version_key, ""); @@ -39,7 +38,6 @@ pub async fn store_launch_history(app_handle: &AppHandle) -> Laun tx.set_key_value_int(NAMESPACE, NUM_LAUNCHES_KEY, info.num_launches, source); Ok(()) }) - .await .unwrap(); info @@ -58,5 +56,5 @@ pub fn get_os() -> &'static str { } pub async fn get_num_launches(app_handle: &AppHandle) -> i32 { - app_handle.queries().connect().await.unwrap().get_key_value_int(NAMESPACE, NUM_LAUNCHES_KEY, 0) + app_handle.db().get_key_value_int(NAMESPACE, NUM_LAUNCHES_KEY, 0) } diff --git a/src-tauri/src/http_request.rs b/src-tauri/src/http_request.rs index ad339689..03bf08ca 100644 --- a/src-tauri/src/http_request.rs +++ b/src-tauri/src/http_request.rs @@ -24,12 +24,12 @@ use tokio::fs::{create_dir_all, File}; use tokio::io::AsyncWriteExt; use tokio::sync::watch::Receiver; use tokio::sync::{oneshot, Mutex}; -use yaak_models::manager::QueryManagerExt; +use yaak_models::query_manager::QueryManagerExt; use yaak_models::models::{ Cookie, CookieJar, Environment, HttpRequest, HttpResponse, HttpResponseHeader, HttpResponseState, ProxySetting, ProxySettingAuth, }; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::util::UpdateSource; use yaak_plugins::events::{ CallHttpAuthenticationRequest, HttpHeader, RenderPurpose, WindowContext, }; @@ -48,16 +48,13 @@ pub async fn send_http_request( let plugin_manager = app_handle.state::(); let update_source = &UpdateSource::from_window(&window); let (settings, workspace) = { - let db = window.queries().connect().await?; - let settings = db.get_or_create_settings(update_source)?; + let db = window.db(); + let settings = db.get_or_create_settings(update_source); let workspace = db.get_workspace(&unrendered_request.workspace_id)?; (settings, workspace) }; - let base_environment = app_handle - .queries() - .connect() - .await? - .get_base_environment(&unrendered_request.workspace_id)?; + let base_environment = + app_handle.db().get_base_environment(&unrendered_request.workspace_id)?; let response_id = og_response.id.clone(); let response = Arc::new(Mutex::new(og_response.clone())); @@ -84,8 +81,7 @@ pub async fn send_http_request( &*response.lock().await, e.to_string(), &update_source, - ) - .await) + )) } }; @@ -200,8 +196,7 @@ pub async fn send_http_request( &*response.lock().await, format!("Failed to parse URL \"{}\": {}", url_string, e.to_string()), &update_source, - ) - .await); + )); } }; // Yes, we're parsing both URI and URL because they could return different errors @@ -213,8 +208,7 @@ pub async fn send_http_request( &*response.lock().await, format!("Failed to parse URL \"{}\": {}", url_string, e.to_string()), &update_source, - ) - .await); + )); } }; @@ -321,8 +315,7 @@ pub async fn send_http_request( &*response.lock().await, e, &update_source, - ) - .await); + )); } } } else if body_type == "multipart/form-data" && request_body.contains_key("form") { @@ -353,8 +346,7 @@ pub async fn send_http_request( &*response.lock().await, e.to_string(), &update_source, - ) - .await); + )); } } }; @@ -371,8 +363,7 @@ pub async fn send_http_request( &*response.lock().await, format!("Invalid mime for multi-part entry {e:?}"), &update_source, - ) - .await); + )); } }; } else if !file_path.is_empty() { @@ -388,8 +379,7 @@ pub async fn send_http_request( &*response.lock().await, format!("Invalid mime for multi-part entry {e:?}"), &update_source, - ) - .await); + )); } }; } @@ -431,8 +421,7 @@ pub async fn send_http_request( &*response.lock().await, e.to_string(), &update_source, - ) - .await); + )); } }; @@ -463,8 +452,7 @@ pub async fn send_http_request( &*response.lock().await, e.to_string(), &update_source, - ) - .await); + )); } }; @@ -490,7 +478,7 @@ pub async fn send_http_request( Ok(r) = resp_rx => r, _ = cancelled_rx.changed() => { debug!("Request cancelled"); - return Ok(response_err(&app_handle, &*response.lock().await, "Request was cancelled".to_string(), &update_source).await); + return Ok(response_err(&app_handle, &*response.lock().await, "Request was cancelled".to_string(), &update_source)); } }; @@ -541,10 +529,7 @@ pub async fn send_http_request( r.state = HttpResponseState::Connected; app_handle - .queries() - .connect() - .await - .unwrap() + .db() .update_http_response_if_id(&r, &update_source) .expect("Failed to update response after connected"); } @@ -574,10 +559,7 @@ pub async fn send_http_request( written_bytes += bytes.len(); r.content_length = Some(written_bytes as i32); app_handle - .queries() - .connect() - .await - .unwrap() + .db() .update_http_response_if_id(&r, &update_source) .expect("Failed to update response"); } @@ -590,8 +572,7 @@ pub async fn send_http_request( &*response.lock().await, e.to_string(), &update_source, - ) - .await; + ); break; } } @@ -606,10 +587,7 @@ pub async fn send_http_request( }; r.state = HttpResponseState::Closed; app_handle - .queries() - .connect() - .await - .unwrap() + .db() .update_http_response_if_id(&r, &UpdateSource::from_window(&window)) .expect("Failed to update response"); }; @@ -636,10 +614,7 @@ pub async fn send_http_request( .collect::>(); cookie_jar.cookies = json_cookies; if let Err(e) = app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_cookie_jar(&cookie_jar, &UpdateSource::from_window(&window)) { error!("Failed to update cookie jar: {}", e); @@ -653,8 +628,7 @@ pub async fn send_http_request( &*response.lock().await, format!("{e} → {e:?}"), &update_source, - ) - .await; + ); } }; @@ -667,19 +641,14 @@ pub async fn send_http_request( Ok(tokio::select! { Ok(r) = done_rx => r, _ = cancelled_rx.changed() => { - match app_handle.queries().with_conn(|c| c.get_http_response(&response_id)).await { + match app_handle.with_db(|c| c.get_http_response(&response_id)) { Ok(mut r) => { r.state = HttpResponseState::Closed; - app_handle - .queries() - .connect() - .await - .unwrap() - .update_http_response_if_id(&r, &UpdateSource::from_window(window)) + app_handle.db().update_http_response_if_id(&r, &UpdateSource::from_window(window)) .expect("Failed to update response") }, _ => { - response_err(&app_handle, &*response.lock().await, "Ephemeral request was cancelled".to_string(), &update_source).await + response_err(&app_handle, &*response.lock().await, "Ephemeral request was cancelled".to_string(), &update_source) }.clone(), } } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index bc483252..6a77a2e5 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -30,13 +30,13 @@ use tokio::sync::Mutex; use tokio::task::block_in_place; use yaak_grpc::manager::{DynamicMessage, GrpcHandle}; use yaak_grpc::{deserialize_message, serialize_message, Code, ServiceDefinition}; -use yaak_models::manager::QueryManagerExt; use yaak_models::models::{ CookieJar, Environment, EnvironmentVariable, Folder, GrpcConnection, GrpcConnectionState, GrpcEvent, GrpcEventType, GrpcRequest, HttpRequest, HttpResponse, HttpResponseState, KeyValue, ModelType, Plugin, Settings, WebsocketRequest, Workspace, WorkspaceMeta, }; -use yaak_models::queries_legacy::{ +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::{ generate_model_id, get_workspace_export_resources, BatchUpsertResult, UpdateSource, }; use yaak_plugins::events::{ @@ -108,11 +108,10 @@ async fn cmd_render_template( environment_id: Option<&str>, ) -> YaakResult { let environment = match environment_id { - Some(id) => app_handle.queries().connect().await?.get_environment(id).ok(), + Some(id) => app_handle.db().get_environment(id).ok(), None => None, }; - let base_environment = - app_handle.queries().connect().await?.get_base_environment(&workspace_id)?; + let base_environment = app_handle.db().get_base_environment(&workspace_id)?; let result = render_template( template, &base_environment, @@ -143,12 +142,7 @@ async fn cmd_grpc_reflect( app_handle: AppHandle, grpc_handle: State<'_, Mutex>, ) -> YaakResult> { - let req = app_handle - .queries() - .connect() - .await? - .get_grpc_request(request_id)? - .ok_or(GenericError("Failed to find GRPC request".to_string()))?; + let req = app_handle.db().get_grpc_request(request_id)?; let uri = safe_uri(&req.url); @@ -175,20 +169,12 @@ async fn cmd_grpc_go( grpc_handle: State<'_, Mutex>, ) -> YaakResult { let environment = match environment_id { - Some(id) => app_handle.queries().connect().await?.get_environment(id).ok(), + Some(id) => app_handle.db().get_environment(id).ok(), None => None, }; - let unrendered_request = app_handle - .queries() - .connect() - .await? - .get_grpc_request(request_id)? - .ok_or(GenericError("Failed to get GRPC request".to_string()))?; - let base_environment = app_handle - .queries() - .connect() - .await? - .get_base_environment(&unrendered_request.workspace_id)?; + let unrendered_request = app_handle.db().get_grpc_request(request_id)?; + let base_environment = + app_handle.db().get_base_environment(&unrendered_request.workspace_id)?; let request = render_grpc_request( &unrendered_request, &base_environment, @@ -237,7 +223,7 @@ async fn cmd_grpc_go( } } - let conn = app_handle.queries().connect().await?.upsert_grpc_connection( + let conn = app_handle.db().upsert_grpc_connection( &GrpcConnection { workspace_id: request.workspace_id.clone(), request_id: request.id.clone(), @@ -289,7 +275,7 @@ async fn cmd_grpc_go( let connection = match connection { Ok(c) => c, Err(err) => { - app_handle.queries().connect().await?.upsert_grpc_connection( + app_handle.db().upsert_grpc_connection( &GrpcConnection { elapsed: start.elapsed().as_millis() as i32, error: Some(err.clone()), @@ -364,10 +350,7 @@ async fn cmd_grpc_go( Err(e) => { tauri::async_runtime::spawn(async move { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { event_type: GrpcEventType::Error, @@ -384,10 +367,7 @@ async fn cmd_grpc_go( in_msg_tx.try_send(d_msg).unwrap(); tauri::async_runtime::spawn(async move { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { content: msg, @@ -431,7 +411,7 @@ async fn cmd_grpc_go( ) .await?; - app_handle.queries().connect().await?.upsert_grpc_event( + app_handle.db().upsert_grpc_event( &GrpcEvent { content: format!("Connecting to {}", req.url), event_type: GrpcEventType::ConnectionStart, @@ -469,10 +449,7 @@ async fn cmd_grpc_go( if !method_desc.is_client_streaming() { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { event_type: GrpcEventType::ClientMessage, @@ -487,10 +464,7 @@ async fn cmd_grpc_go( match maybe_msg { Some(Ok(msg)) => { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { metadata: metadata_to_map(msg.metadata().clone()), @@ -507,10 +481,7 @@ async fn cmd_grpc_go( ) .unwrap(); app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { content: serialize_message(&msg.into_inner()).unwrap(), @@ -521,10 +492,7 @@ async fn cmd_grpc_go( ) .unwrap(); app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { content: "Connection complete".to_string(), @@ -538,10 +506,7 @@ async fn cmd_grpc_go( } Some(Err(e)) => { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &(match e.status { Some(s) => GrpcEvent { @@ -572,10 +537,7 @@ async fn cmd_grpc_go( let mut stream = match maybe_stream { Some(Ok(stream)) => { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { metadata: metadata_to_map(stream.metadata().clone()), @@ -596,10 +558,7 @@ async fn cmd_grpc_go( Some(Err(e)) => { warn!("GRPC stream error {e:?}"); app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &(match e.status { Some(s) => GrpcEvent { @@ -631,10 +590,7 @@ async fn cmd_grpc_go( Ok(Some(msg)) => { let message = serialize_message(&msg).unwrap(); app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { content: message, @@ -649,10 +605,7 @@ async fn cmd_grpc_go( let trailers = stream.trailers().await.unwrap_or_default().unwrap_or_default(); app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { content: "Connection complete".to_string(), @@ -668,10 +621,7 @@ async fn cmd_grpc_go( } Err(status) => { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_grpc_event( &GrpcEvent { content: status.to_string(), @@ -695,12 +645,12 @@ async fn cmd_grpc_go( let w = app_handle.clone(); tokio::select! { _ = grpc_listen => { - let events = w.queries().connect().await.unwrap().list_grpc_events(&conn_id).unwrap(); + let events = w.db().list_grpc_events(&conn_id).unwrap(); let closed_event = events .iter() .find(|e| GrpcEventType::ConnectionEnd == e.event_type); let closed_status = closed_event.and_then(|e| e.status).unwrap_or(Code::Unavailable as i32); - w.queries().with_conn(|c| { + w.with_tx(|c| { c.upsert_grpc_connection( &GrpcConnection{ elapsed: start.elapsed().as_millis() as i32, @@ -710,10 +660,10 @@ async fn cmd_grpc_go( }, &UpdateSource::from_window(&window), ) - }).await.unwrap(); + }).unwrap(); }, _ = cancelled_rx.changed() => { - w.queries().connect().await.unwrap().upsert_grpc_event( + w.db().upsert_grpc_event( &GrpcEvent { content: "Cancelled".to_string(), event_type: GrpcEventType::ConnectionEnd, @@ -722,7 +672,7 @@ async fn cmd_grpc_go( }, &UpdateSource::from_window(&window), ).unwrap(); - w.queries().with_conn(|c| { + w.with_tx(|c| { c.upsert_grpc_connection( &GrpcConnection{ elapsed: start.elapsed().as_millis() as i32, @@ -732,7 +682,7 @@ async fn cmd_grpc_go( }, &UpdateSource::from_window(&window), ) - }).await.unwrap(); + }).unwrap(); }, } w.unlisten(event_handler); @@ -753,11 +703,11 @@ async fn cmd_send_ephemeral_request( let response = HttpResponse::default(); request.id = "".to_string(); let environment = match environment_id { - Some(id) => Some(app_handle.queries().connect().await?.get_environment(id)?), + Some(id) => Some(app_handle.db().get_environment(id)?), None => None, }; let cookie_jar = match cookie_jar_id { - Some(id) => Some(app_handle.queries().connect().await?.get_cookie_jar(id)?), + Some(id) => Some(app_handle.db().get_cookie_jar(id)?), None => None, }; @@ -784,7 +734,7 @@ async fn cmd_filter_response( plugin_manager: State<'_, PluginManager>, filter: &str, ) -> YaakResult { - let response = app_handle.queries().connect().await?.get_http_response(response_id)?; + let response = app_handle.db().get_http_response(response_id)?; if let None = response.body_path { return Err(GenericError("Response body path not set".to_string())); @@ -940,20 +890,17 @@ async fn cmd_import_data( }) .collect(); - let upserted = app_handle - .queries() - .with_tx(|tx| { - tx.batch_upsert( - workspaces, - environments, - folders, - http_requests, - grpc_requests, - websocket_requests, - &UpdateSource::Import, - ) - }) - .await?; + let upserted = app_handle.with_tx(|tx| { + tx.batch_upsert( + workspaces, + environments, + folders, + http_requests, + grpc_requests, + websocket_requests, + &UpdateSource::Import, + ) + })?; Ok(upserted) } @@ -1077,7 +1024,7 @@ async fn cmd_save_response( response_id: &str, filepath: &str, ) -> YaakResult<()> { - let response = app_handle.queries().connect().await?.get_http_response(response_id)?; + let response = app_handle.db().get_http_response(response_id)?; let body_path = response.body_path.ok_or(GenericError("Response does not have a body".to_string()))?; @@ -1097,7 +1044,7 @@ async fn cmd_send_http_request( // that has not yet been saved in the DB. request: HttpRequest, ) -> YaakResult { - let response = app_handle.queries().connect().await?.upsert_http_response( + let response = app_handle.db().upsert_http_response( &HttpResponse { request_id: request.id.clone(), workspace_id: request.workspace_id.clone(), @@ -1114,7 +1061,7 @@ async fn cmd_send_http_request( }); let environment = match environment_id { - Some(id) => match app_handle.queries().connect().await?.get_environment(id) { + Some(id) => match app_handle.db().get_environment(id) { Ok(env) => Some(env), Err(e) => { warn!("Failed to find environment by id {id} {}", e); @@ -1125,14 +1072,14 @@ async fn cmd_send_http_request( }; let cookie_jar = match cookie_jar_id { - Some(id) => Some(app_handle.queries().connect().await?.get_cookie_jar(id)?), + Some(id) => Some(app_handle.db().get_cookie_jar(id)?), None => None, }; send_http_request(&window, &request, &response, environment, cookie_jar, &mut cancel_rx).await } -async fn response_err( +fn response_err( app_handle: &AppHandle, response: &HttpResponse, error: String, @@ -1143,10 +1090,7 @@ async fn response_err( response.state = HttpResponseState::Closed; response.error = Some(error.clone()); response = app_handle - .queries() - .connect() - .await - .unwrap() + .db() .update_http_response_if_id(&response, update_source) .expect("Failed to update response"); response @@ -1158,7 +1102,7 @@ async fn cmd_set_update_mode( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - let (key_value, _created) = app_handle.queries().connect().await?.set_key_value_raw( + let (key_value, _created) = app_handle.db().set_key_value_raw( "app", "update_mode", update_mode, @@ -1173,7 +1117,7 @@ async fn cmd_get_key_value( key: &str, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle.queries().connect().await?.get_key_value_raw(namespace, key)) + Ok(app_handle.db().get_key_value_raw(namespace, key)) } #[tauri::command] @@ -1184,7 +1128,7 @@ async fn cmd_set_key_value( key: &str, value: &str, ) -> YaakResult { - let (key_value, _created) = app_handle.queries().connect().await?.set_key_value_raw( + let (key_value, _created) = app_handle.db().set_key_value_raw( namespace, key, value, @@ -1205,7 +1149,7 @@ async fn cmd_install_plugin( .add_plugin_by_dir(&WindowContext::from_window(&window), &directory, true) .await?; - Ok(app_handle.queries().connect().await?.upsert_plugin( + Ok(app_handle.db().upsert_plugin( &Plugin { directory: directory.into(), url, @@ -1222,11 +1166,8 @@ async fn cmd_uninstall_plugin( window: WebviewWindow, app_handle: AppHandle, ) -> YaakResult { - let plugin = app_handle - .queries() - .connect() - .await? - .delete_plugin_by_id(plugin_id, &UpdateSource::from_window(&window))?; + let plugin = + app_handle.db().delete_plugin_by_id(plugin_id, &UpdateSource::from_window(&window))?; plugin_manager .uninstall(&WindowContext::from_window(&window), plugin.directory.as_str()) @@ -1241,11 +1182,7 @@ async fn cmd_update_cookie_jar( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_cookie_jar(&cookie_jar, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_cookie_jar(&cookie_jar, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1255,9 +1192,7 @@ async fn cmd_delete_cookie_jar( cookie_jar_id: &str, ) -> YaakResult { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_cookie_jar_by_id(cookie_jar_id, &UpdateSource::from_window(&window))?) } @@ -1268,7 +1203,7 @@ async fn cmd_create_cookie_jar( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle.queries().connect().await?.upsert_cookie_jar( + Ok(app_handle.db().upsert_cookie_jar( &CookieJar { name: name.to_string(), workspace_id: workspace_id.to_string(), @@ -1287,7 +1222,7 @@ async fn cmd_create_environment( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle.queries().connect().await?.upsert_environment( + Ok(app_handle.db().upsert_environment( &Environment { workspace_id: workspace_id.to_string(), environment_id: environment_id.map(|s| s.to_string()), @@ -1308,7 +1243,7 @@ async fn cmd_create_grpc_request( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle.queries().connect().await?.upsert_grpc_request( + Ok(app_handle.db().upsert_grpc_request( &GrpcRequest { workspace_id: workspace_id.to_string(), name: name.to_string(), @@ -1326,8 +1261,8 @@ async fn cmd_duplicate_grpc_request( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - let db = app_handle.queries().connect().await?; - let request = db.get_grpc_request(id)?.unwrap(); + let db = app_handle.db(); + let request = db.get_grpc_request(id)?; Ok(db.duplicate_grpc_request(&request, &UpdateSource::from_window(&window))?) } @@ -1337,7 +1272,7 @@ async fn cmd_duplicate_folder( window: WebviewWindow, id: &str, ) -> YaakResult { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); let folder = db.get_folder(id)?; Ok(db.duplicate_folder(&folder, &UpdateSource::from_window(&window))?) } @@ -1348,8 +1283,8 @@ async fn cmd_duplicate_http_request( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - let db = app_handle.queries().connect().await?; - let request = db.get_http_request(id)?.unwrap(); + let db = app_handle.db(); + let request = db.get_http_request(id)?; Ok(db.duplicate_http_request(&request, &UpdateSource::from_window(&window))?) } @@ -1359,11 +1294,7 @@ async fn cmd_update_workspace( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_workspace(&workspace, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_workspace(&workspace, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1373,9 +1304,7 @@ async fn cmd_update_workspace_meta( window: WebviewWindow, ) -> YaakResult { Ok(app_handle - .queries() - .connect() - .await? + .db() .upsert_workspace_meta(&workspace_meta, &UpdateSource::from_window(&window))?) } @@ -1385,11 +1314,7 @@ async fn cmd_update_environment( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_environment(&environment, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_environment(&environment, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1398,11 +1323,7 @@ async fn cmd_update_grpc_request( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_grpc_request(&request, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_grpc_request(&request, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1411,11 +1332,7 @@ async fn cmd_upsert_http_request( window: WebviewWindow, app_handle: AppHandle, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert(&request, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert(&request, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1425,9 +1342,7 @@ async fn cmd_delete_grpc_request( window: WebviewWindow, ) -> YaakResult { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_grpc_request_by_id(request_id, &UpdateSource::from_window(&window))?) } @@ -1438,9 +1353,7 @@ async fn cmd_delete_http_request( window: WebviewWindow, ) -> YaakResult { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_http_request_by_id(request_id, &UpdateSource::from_window(&window))?) } @@ -1449,7 +1362,7 @@ async fn cmd_list_folders( workspace_id: &str, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle.queries().connect().await?.list_folders(workspace_id)?) + Ok(app_handle.db().list_folders(workspace_id)?) } #[tauri::command] @@ -1458,11 +1371,7 @@ async fn cmd_update_folder( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_folder(&folder, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_folder(&folder, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1471,11 +1380,7 @@ async fn cmd_delete_folder( window: WebviewWindow, folder_id: &str, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .delete_folder_by_id(folder_id, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().delete_folder_by_id(folder_id, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1485,9 +1390,7 @@ async fn cmd_delete_environment( environment_id: &str, ) -> YaakResult { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_environment_by_id(environment_id, &UpdateSource::from_window(&window))?) } @@ -1496,11 +1399,7 @@ async fn cmd_list_grpc_connections( workspace_id: &str, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle - .queries() - .connect() - .await? - .list_grpc_connections_for_workspace(workspace_id, None)?) + Ok(app_handle.db().list_grpc_connections_for_workspace(workspace_id, None)?) } #[tauri::command] @@ -1508,7 +1407,7 @@ async fn cmd_list_grpc_events( connection_id: &str, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle.queries().connect().await?.list_grpc_events(connection_id)?) + Ok(app_handle.db().list_grpc_events(connection_id)?) } #[tauri::command] @@ -1516,7 +1415,7 @@ async fn cmd_list_grpc_requests( workspace_id: &str, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle.queries().connect().await?.list_grpc_requests(workspace_id)?) + Ok(app_handle.db().list_grpc_requests(workspace_id)?) } #[tauri::command] @@ -1524,7 +1423,7 @@ async fn cmd_list_http_requests( workspace_id: &str, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle.queries().connect().await?.list_http_requests(workspace_id)?) + Ok(app_handle.db().list_http_requests(workspace_id)?) } #[tauri::command] @@ -1533,14 +1432,14 @@ async fn cmd_list_environments( app_handle: AppHandle, ) -> YaakResult> { // Not sure of a better place to put this... - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); db.ensure_base_environment(workspace_id)?; Ok(db.list_environments(workspace_id)?) } #[tauri::command] async fn cmd_list_plugins(app_handle: AppHandle) -> YaakResult> { - Ok(app_handle.queries().connect().await?.list_plugins()?) + Ok(app_handle.db().list_plugins()?) } #[tauri::command] @@ -1562,7 +1461,7 @@ async fn cmd_plugin_info( app_handle: AppHandle, plugin_manager: State<'_, PluginManager>, ) -> YaakResult { - let plugin = app_handle.queries().connect().await?.get_plugin(id)?; + let plugin = app_handle.db().get_plugin(id)?; Ok(plugin_manager .get_plugin_by_dir(plugin.directory.as_str()) .await @@ -1573,11 +1472,7 @@ async fn cmd_plugin_info( #[tauri::command] async fn cmd_get_settings(window: WebviewWindow) -> YaakResult { - Ok(window - .queries() - .connect() - .await? - .get_or_create_settings(&UpdateSource::from_window(&window))?) + Ok(window.db().get_or_create_settings(&UpdateSource::from_window(&window))) } #[tauri::command] @@ -1586,40 +1481,12 @@ async fn cmd_update_settings( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_settings(&settings, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_settings(&settings, &UpdateSource::from_window(&window))?) } #[tauri::command] async fn cmd_get_folder(id: &str, app_handle: AppHandle) -> YaakResult { - Ok(app_handle.queries().connect().await?.get_folder(id)?) -} - -#[tauri::command] -async fn cmd_get_grpc_request( - id: &str, - app_handle: AppHandle, -) -> YaakResult> { - Ok(app_handle.queries().connect().await?.get_grpc_request(id)?) -} - -#[tauri::command] -async fn cmd_get_http_request( - id: &str, - app_handle: AppHandle, -) -> YaakResult> { - Ok(app_handle.queries().connect().await?.get_http_request(id)?) -} - -#[tauri::command] -async fn cmd_get_cookie_jar( - id: &str, - app_handle: AppHandle, -) -> YaakResult { - Ok(app_handle.queries().connect().await?.get_cookie_jar(id)?) + Ok(app_handle.db().get_folder(id)?) } #[tauri::command] @@ -1628,7 +1495,7 @@ async fn cmd_list_cookie_jars( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult> { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); let cookie_jars = db.list_cookie_jars(workspace_id)?; if cookie_jars.is_empty() { @@ -1648,7 +1515,7 @@ async fn cmd_list_cookie_jars( #[tauri::command] async fn cmd_list_key_values(app_handle: AppHandle) -> YaakResult> { - Ok(app_handle.queries().connect().await?.list_key_values_raw()?) + Ok(app_handle.db().list_key_values_raw()?) } #[tauri::command] @@ -1656,7 +1523,7 @@ async fn cmd_get_environment( id: &str, app_handle: AppHandle, ) -> YaakResult { - Ok(app_handle.queries().connect().await?.get_environment(id)?) + Ok(app_handle.db().get_environment(id)?) } #[tauri::command] @@ -1664,7 +1531,7 @@ async fn cmd_get_workspace( id: &str, app_handle: AppHandle, ) -> YaakResult { - Ok(app_handle.queries().connect().await?.get_workspace(id)?) + Ok(app_handle.db().get_workspace(id)?) } #[tauri::command] @@ -1673,11 +1540,7 @@ async fn cmd_list_http_responses( limit: Option, app_handle: AppHandle, ) -> YaakResult> { - Ok(app_handle - .queries() - .connect() - .await? - .list_http_responses_for_workspace(workspace_id, limit.map(|l| l as u64))?) + Ok(app_handle.db().list_http_responses_for_workspace(workspace_id, limit.map(|l| l as u64))?) } #[tauri::command] @@ -1686,7 +1549,7 @@ async fn cmd_delete_http_response( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); let http_response = db.get_http_response(id)?; Ok(db.delete_http_response(&http_response, &UpdateSource::from_window(&window))?) } @@ -1697,11 +1560,7 @@ async fn cmd_delete_grpc_connection( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .delete_grpc_connection_by_id(id, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().delete_grpc_connection_by_id(id, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1711,9 +1570,7 @@ async fn cmd_delete_all_grpc_connections( window: WebviewWindow, ) -> YaakResult<()> { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_all_grpc_connections_for_request(request_id, &UpdateSource::from_window(&window))?) } @@ -1723,16 +1580,13 @@ async fn cmd_delete_send_history( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult<()> { - Ok(app_handle - .queries() - .with_tx(|tx| { - let source = &UpdateSource::from_window(&window); - tx.delete_all_http_responses_for_workspace(workspace_id, source)?; - tx.delete_all_grpc_connections_for_workspace(workspace_id, source)?; - tx.delete_all_websocket_connections_for_workspace(workspace_id, source)?; - Ok(()) - }) - .await?) + Ok(app_handle.with_tx(|tx| { + let source = &UpdateSource::from_window(&window); + tx.delete_all_http_responses_for_workspace(workspace_id, source)?; + tx.delete_all_grpc_connections_for_workspace(workspace_id, source)?; + tx.delete_all_websocket_connections_for_workspace(workspace_id, source)?; + Ok(()) + })?) } #[tauri::command] @@ -1742,9 +1596,7 @@ async fn cmd_delete_all_http_responses( window: WebviewWindow, ) -> YaakResult<()> { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_all_http_responses_for_request(request_id, &UpdateSource::from_window(&window))?) } @@ -1753,7 +1605,7 @@ async fn cmd_list_workspaces( app_handle: AppHandle, window: WebviewWindow, ) -> YaakResult> { - let queries = app_handle.queries().connect().await?; + let queries = app_handle.db(); let workspaces = queries.find_all::()?; if workspaces.is_empty() { let workspace = queries.upsert_workspace( @@ -1777,7 +1629,7 @@ async fn cmd_get_workspace_meta( window: WebviewWindow, workspace_id: &str, ) -> YaakResult { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); let workspace = db.get_workspace(workspace_id)?; Ok(db.get_or_create_workspace_meta(&workspace, &UpdateSource::from_window(&window))?) } @@ -1806,11 +1658,7 @@ async fn cmd_delete_workspace( window: WebviewWindow, workspace_id: &str, ) -> YaakResult { - Ok(app_handle - .queries() - .connect() - .await? - .delete_workspace_by_id(workspace_id, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().delete_workspace_by_id(workspace_id, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -1928,13 +1776,10 @@ pub fn run() { cmd_export_data, cmd_filter_response, cmd_format_json, - cmd_get_cookie_jar, cmd_get_environment, cmd_get_folder, - cmd_get_grpc_request, cmd_get_http_authentication_summaries, cmd_get_http_authentication_config, - cmd_get_http_request, cmd_get_key_value, cmd_get_settings, cmd_get_sse_events, @@ -1996,7 +1841,7 @@ pub fn run() { // Cancel pending requests let h = app_handle.clone(); tauri::async_runtime::block_on(async move { - let db = h.queries().connect().await.unwrap(); + let db = h.db(); let _ = db.cancel_pending_http_responses(); let _ = db.cancel_pending_grpc_connections(); let _ = db.cancel_pending_websocket_connections(); @@ -2046,11 +1891,7 @@ pub fn run() { } async fn get_update_mode(window: &WebviewWindow) -> YaakResult { - let settings = window - .queries() - .connect() - .await? - .get_or_create_settings(&UpdateSource::from_window(window))?; + let settings = window.db().get_or_create_settings(&UpdateSource::from_window(window)); Ok(UpdateMode::new(settings.update_channel.as_str())) } @@ -2152,7 +1993,7 @@ fn workspace_id_from_window(window: &WebviewWindow) -> Option(window: &WebviewWindow) -> YaakResult { match workspace_id_from_window(&window) { None => Err(GenericError("Failed to get workspace ID from window".to_string())), - Some(id) => Ok(window.queries().connect().await?.get_workspace(id.as_str())?), + Some(id) => Ok(window.db().get_workspace(id.as_str())?), } } @@ -2165,7 +2006,7 @@ fn environment_id_from_window(window: &WebviewWindow) -> Option(window: &WebviewWindow) -> Option { match environment_id_from_window(&window) { None => None, - Some(id) => window.queries().connect().await.unwrap().get_environment(&id).ok(), + Some(id) => window.db().get_environment(&id).ok(), } } @@ -2178,6 +2019,6 @@ fn cookie_jar_id_from_window(window: &WebviewWindow) -> Option(window: &WebviewWindow) -> Option { match cookie_jar_id_from_window(&window) { None => None, - Some(id) => window.queries().connect().await.unwrap().get_cookie_jar(&id).ok(), + Some(id) => window.db().get_cookie_jar(&id).ok(), } } diff --git a/src-tauri/src/notifications.rs b/src-tauri/src/notifications.rs index 432f3cbc..914c8980 100644 --- a/src-tauri/src/notifications.rs +++ b/src-tauri/src/notifications.rs @@ -7,8 +7,8 @@ use reqwest::Method; use serde::{Deserialize, Serialize}; use serde_json::Value; use tauri::{AppHandle, Emitter, Manager, Runtime, WebviewWindow}; -use yaak_models::manager::QueryManagerExt; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::UpdateSource; // Check for updates every hour const MAX_UPDATE_CHECK_SECONDS: u64 = 60 * 60; @@ -54,7 +54,7 @@ impl YaakNotifier { seen.push(id.to_string()); debug!("Marked notification as seen {}", id); let seen_json = serde_json::to_string(&seen).map_err(|e| e.to_string())?; - window.queries().connect().await.map_err(|e| e.to_string())?.set_key_value_raw( + window.db().set_key_value_raw( KV_NAMESPACE, KV_KEY, seen_json.as_str(), @@ -118,13 +118,7 @@ impl YaakNotifier { } async fn get_kv(app_handle: &AppHandle) -> Result, String> { - match app_handle - .queries() - .connect() - .await - .map_err(|e| e.to_string())? - .get_key_value_raw("notifications", "seen") - { + match app_handle.db().get_key_value_raw("notifications", "seen") { None => Ok(Vec::new()), Some(v) => serde_json::from_str(&v.value).map_err(|e| e.to_string()), } diff --git a/src-tauri/src/plugin_events.rs b/src-tauri/src/plugin_events.rs index 95209639..d017cc31 100644 --- a/src-tauri/src/plugin_events.rs +++ b/src-tauri/src/plugin_events.rs @@ -9,9 +9,9 @@ use chrono::Utc; use log::warn; use tauri::{AppHandle, Emitter, Manager, Runtime, State}; use tauri_plugin_clipboard_manager::ClipboardExt; -use yaak_models::manager::QueryManagerExt; use yaak_models::models::{HttpResponse, Plugin}; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::UpdateSource; use yaak_plugins::events::{ Color, DeleteKeyValueResponse, EmptyPayload, FindHttpResponsesResponse, GetHttpRequestByIdResponse, GetKeyValueResponse, Icon, InternalEvent, InternalEventPayload, @@ -53,10 +53,7 @@ pub(crate) async fn handle_plugin_event( } InternalEventPayload::FindHttpResponsesRequest(req) => { let http_responses = app_handle - .queries() - .connect() - .await - .unwrap() + .db() .list_http_responses_for_request( req.request_id.as_str(), req.limit.map(|l| l as u64), @@ -67,13 +64,7 @@ pub(crate) async fn handle_plugin_event( })) } InternalEventPayload::GetHttpRequestByIdRequest(req) => { - let http_request = app_handle - .queries() - .connect() - .await - .unwrap() - .get_http_request(req.id.as_str()) - .unwrap(); + let http_request = app_handle.db().get_http_request(req.id.as_str()).ok(); Some(InternalEventPayload::GetHttpRequestByIdResponse(GetHttpRequestByIdResponse { http_request, })) @@ -87,10 +78,7 @@ pub(crate) async fn handle_plugin_event( .expect("Failed to get workspace_id from window URL"); let environment = environment_from_window(&window).await; let base_environment = app_handle - .queries() - .connect() - .await - .unwrap() + .db() .get_base_environment(&workspace.id) .expect("Failed to get base environment"); let cb = PluginTemplateCallback::new(app_handle, &window_context, req.purpose); @@ -115,10 +103,7 @@ pub(crate) async fn handle_plugin_event( .expect("Failed to get workspace_id from window URL"); let environment = environment_from_window(&window).await; let base_environment = app_handle - .queries() - .connect() - .await - .unwrap() + .db() .get_base_environment(&workspace.id) .expect("Failed to get base environment"); let cb = PluginTemplateCallback::new(app_handle, &window_context, req.purpose); @@ -149,7 +134,7 @@ pub(crate) async fn handle_plugin_event( InternalEventPayload::ReloadResponse(_) => { let window = get_window_from_window_context(app_handle, &window_context) .expect("Failed to find window for plugin reload"); - let plugins = app_handle.queries().connect().await.unwrap().list_plugins().unwrap(); + let plugins = app_handle.db().list_plugins().unwrap(); for plugin in plugins { if plugin.directory != plugin_handle.dir { continue; @@ -159,13 +144,7 @@ pub(crate) async fn handle_plugin_event( updated_at: Utc::now().naive_utc(), // TODO: Add reloaded_at field to use instead ..plugin }; - app_handle - .queries() - .connect() - .await - .unwrap() - .upsert_plugin(&new_plugin, &UpdateSource::Plugin) - .unwrap(); + app_handle.db().upsert_plugin(&new_plugin, &UpdateSource::Plugin).unwrap(); } let toast_event = plugin_handle.build_event_to_send( &WindowContext::from_window(&window), @@ -197,10 +176,7 @@ pub(crate) async fn handle_plugin_event( HttpResponse::default() } else { window - .queries() - .connect() - .await - .unwrap() + .db() .upsert_http_response( &HttpResponse { request_id: http_request.id.clone(), @@ -292,34 +268,17 @@ pub(crate) async fn handle_plugin_event( } InternalEventPayload::SetKeyValueRequest(req) => { let name = plugin_handle.name().await; - app_handle - .queries() - .connect() - .await - .unwrap() - .set_plugin_key_value(&name, &req.key, &req.value); + app_handle.db().set_plugin_key_value(&name, &req.key, &req.value); Some(InternalEventPayload::SetKeyValueResponse(SetKeyValueResponse {})) } InternalEventPayload::GetKeyValueRequest(req) => { let name = plugin_handle.name().await; - let value = app_handle - .queries() - .connect() - .await - .unwrap() - .get_plugin_key_value(&name, &req.key) - .map(|v| v.value); + let value = app_handle.db().get_plugin_key_value(&name, &req.key).map(|v| v.value); Some(InternalEventPayload::GetKeyValueResponse(GetKeyValueResponse { value })) } InternalEventPayload::DeleteKeyValueRequest(req) => { let name = plugin_handle.name().await; - let deleted = app_handle - .queries() - .connect() - .await - .unwrap() - .delete_plugin_key_value(&name, &req.key) - .unwrap(); + let deleted = app_handle.db().delete_plugin_key_value(&name, &req.key).unwrap(); Some(InternalEventPayload::DeleteKeyValueResponse(DeleteKeyValueResponse { deleted })) } _ => None, diff --git a/src-tauri/src/updates.rs b/src-tauri/src/updates.rs index 123b893e..0e7ac844 100644 --- a/src-tauri/src/updates.rs +++ b/src-tauri/src/updates.rs @@ -7,8 +7,8 @@ use tauri::{Manager, Runtime, WebviewWindow}; use tauri_plugin_dialog::{DialogExt, MessageDialogButtons}; use tauri_plugin_updater::UpdaterExt; use tokio::task::block_in_place; -use yaak_models::manager::QueryManagerExt; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::UpdateSource; use yaak_plugins::manager::PluginManager; use crate::is_dev; @@ -67,11 +67,7 @@ impl YaakUpdater { mode: UpdateMode, update_trigger: UpdateTrigger, ) -> Result { - let settings = window - .queries() - .connect() - .await? - .get_or_create_settings(&UpdateSource::from_window(window))?; + let settings = window.db().get_or_create_settings(&UpdateSource::from_window(window)); let update_key = format!("{:x}", md5::compute(settings.id)); self.last_update_check = SystemTime::now(); diff --git a/src-tauri/yaak-license/src/license.rs b/src-tauri/yaak-license/src/license.rs index c7e512bc..58323772 100644 --- a/src-tauri/yaak-license/src/license.rs +++ b/src-tauri/yaak-license/src/license.rs @@ -7,8 +7,8 @@ use std::ops::Add; use std::time::Duration; use tauri::{is_dev, AppHandle, Emitter, Manager, Runtime, WebviewWindow}; use ts_rs::TS; -use yaak_models::manager::QueryManagerExt; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::UpdateSource; const KV_NAMESPACE: &str = "license"; const KV_ACTIVATION_ID_KEY: &str = "activation_id"; @@ -81,7 +81,7 @@ pub async fn activate_license( } let body: ActivateLicenseResponsePayload = response.json().await?; - window.app_handle().queries().connect().await?.set_key_value_string( + window.app_handle().db().set_key_value_string( KV_ACTIVATION_ID_KEY, KV_NAMESPACE, body.activation_id.as_str(), @@ -118,7 +118,7 @@ pub async fn deactivate_license( return Err(ServerError); } - app_handle.queries().connect().await?.delete_key_value( + app_handle.db().delete_key_value( KV_ACTIVATION_ID_KEY, KV_NAMESPACE, &UpdateSource::from_window(&window), @@ -146,11 +146,7 @@ pub async fn check_license( payload: CheckActivationRequestPayload, ) -> Result { let activation_id = get_activation_id(window.app_handle()).await; - let settings = window - .queries() - .connect() - .await? - .get_or_create_settings(&UpdateSource::from_window(window))?; + let settings = window.db().get_or_create_settings(&UpdateSource::from_window(window)); let trial_end = settings.created_at.add(Duration::from_secs(TRIAL_SECONDS)); debug!("Trial ending at {trial_end:?}"); @@ -201,7 +197,7 @@ fn build_url(path: &str) -> String { } pub async fn get_activation_id(app_handle: &AppHandle) -> String { - app_handle.queries().connect().await.unwrap().get_key_value_string( + app_handle.db().get_key_value_string( KV_ACTIVATION_ID_KEY, KV_NAMESPACE, "", diff --git a/src-tauri/yaak-models/src/commands.rs b/src-tauri/yaak-models/src/commands.rs index a0d59750..befd5ad2 100644 --- a/src-tauri/yaak-models/src/commands.rs +++ b/src-tauri/yaak-models/src/commands.rs @@ -1,7 +1,7 @@ use crate::error::Result; -use crate::manager::QueryManagerExt; +use crate::query_manager::QueryManagerExt; use crate::models::AnyModel; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; use tauri::{Runtime, WebviewWindow}; #[tauri::command] @@ -9,9 +9,8 @@ pub(crate) async fn upsert( window: WebviewWindow, model: AnyModel, ) -> Result { - let queries = window.queries().connect().await?; let id = match model { - AnyModel::HttpRequest(r) => queries.upsert(&r, &UpdateSource::from_window(&window))?.id, + AnyModel::HttpRequest(r) => window.db().upsert(&r, &UpdateSource::from_window(&window))?.id, _ => todo!(), }; diff --git a/src-tauri/yaak-models/src/connection_or_tx.rs b/src-tauri/yaak-models/src/connection_or_tx.rs new file mode 100644 index 00000000..08422fab --- /dev/null +++ b/src-tauri/yaak-models/src/connection_or_tx.rs @@ -0,0 +1,25 @@ +use r2d2::PooledConnection; +use r2d2_sqlite::SqliteConnectionManager; +use rusqlite::{Connection, Statement, ToSql, Transaction}; + +pub enum ConnectionOrTx<'a> { + Connection(PooledConnection), + Transaction(&'a Transaction<'a>), +} + +impl<'a> ConnectionOrTx<'a> { + pub(crate) fn resolve(&self) -> &Connection { + match self { + ConnectionOrTx::Connection(c) => c, + ConnectionOrTx::Transaction(c) => c, + } + } + + pub(crate) fn prepare(&self, sql: &str) -> rusqlite::Result> { + self.resolve().prepare(sql) + } + + pub(crate) fn execute(&self, sql: &str, params: &[&dyn ToSql]) -> rusqlite::Result { + self.resolve().execute(sql, params) + } +} diff --git a/src-tauri/yaak-models/src/queries/base.rs b/src-tauri/yaak-models/src/db_context.rs similarity index 83% rename from src-tauri/yaak-models/src/queries/base.rs rename to src-tauri/yaak-models/src/db_context.rs index c6df8ae7..edd4fc4c 100644 --- a/src-tauri/yaak-models/src/queries/base.rs +++ b/src-tauri/yaak-models/src/db_context.rs @@ -1,38 +1,40 @@ +use crate::connection_or_tx::ConnectionOrTx; use crate::error::Error::RowNotFound; -use crate::error::Result; -use crate::manager::DbContext; use crate::models::{AnyModel, ModelType, UpsertModelInfo}; -use crate::queries_legacy::{generate_model_id, ModelChangeEvent, ModelPayload, UpdateSource}; +use crate::util::{generate_model_id, ModelChangeEvent, ModelPayload, UpdateSource}; use rusqlite::OptionalExtension; use sea_query::{ Asterisk, Expr, IntoColumnRef, IntoIden, IntoTableRef, OnConflict, Query, SimpleExpr, SqliteQueryBuilder, }; use sea_query_rusqlite::RusqliteBinder; +use tokio::sync::mpsc; -pub(crate) const MAX_HISTORY_ITEMS: usize = 20; +pub struct DbContext<'a> { + pub(crate) tx: mpsc::Sender, + pub(crate) conn: ConnectionOrTx<'a>, +} impl<'a> DbContext<'a> { pub(crate) fn find_one<'s, M>( &self, col: impl IntoColumnRef, value: impl Into, - ) -> Result + ) -> crate::error::Result where M: Into + Clone + UpsertModelInfo, { match self.find_optional::(col, value) { - Ok(Some(v)) => Ok(v), - Ok(None) => Err(RowNotFound), - Err(e) => Err(e), + Some(v) => Ok(v), + None => Err(RowNotFound), } } - pub fn find_optional<'s, M>( + pub(crate) fn find_optional<'s, M>( &self, col: impl IntoColumnRef, value: impl Into, - ) -> Result> + ) -> Option where M: Into + Clone + UpsertModelInfo, { @@ -41,11 +43,13 @@ impl<'a> DbContext<'a> { .column(Asterisk) .cond_where(Expr::col(col).eq(value)) .build_rusqlite(SqliteQueryBuilder); - let mut stmt = self.conn.prepare(sql.as_str())?; - Ok(stmt.query_row(&*params.as_params(), M::from_row).optional()?) + let mut stmt = self.conn.prepare(sql.as_str()).expect("Failed to prepare query"); + stmt.query_row(&*params.as_params(), M::from_row) + .optional() + .expect("Failed to run find on DB") } - pub fn find_all<'s, M>(&self) -> Result> + pub fn find_all<'s, M>(&self) -> crate::error::Result> where M: Into + Clone + UpsertModelInfo, { @@ -63,7 +67,7 @@ impl<'a> DbContext<'a> { col: impl IntoColumnRef, value: impl Into, limit: Option, - ) -> Result> + ) -> crate::error::Result> where M: Into + Clone + UpsertModelInfo, { @@ -88,7 +92,7 @@ impl<'a> DbContext<'a> { Ok(items.map(|v| v.unwrap()).collect()) } - pub fn upsert(&self, model: &M, source: &UpdateSource) -> Result + pub fn upsert(&self, model: &M, source: &UpdateSource) -> crate::error::Result where M: Into + From + UpsertModelInfo + Clone, { @@ -112,7 +116,7 @@ impl<'a> DbContext<'a> { other_values: Vec<(impl IntoIden + Eq, impl Into)>, update_columns: Vec, source: &UpdateSource, - ) -> Result + ) -> crate::error::Result where M: Into + From + UpsertModelInfo + Clone, { @@ -147,7 +151,11 @@ impl<'a> DbContext<'a> { Ok(m) } - pub(crate) fn delete<'s, M>(&self, m: &M, update_source: &UpdateSource) -> Result + pub(crate) fn delete<'s, M>( + &self, + m: &M, + update_source: &UpdateSource, + ) -> crate::error::Result where M: Into + Clone + UpsertModelInfo, { diff --git a/src-tauri/yaak-models/src/lib.rs b/src-tauri/yaak-models/src/lib.rs index 8d12790f..777838d6 100644 --- a/src-tauri/yaak-models/src/lib.rs +++ b/src-tauri/yaak-models/src/lib.rs @@ -1,6 +1,6 @@ use crate::commands::{delete, upsert}; -use crate::manager::QueryManager; -use crate::queries_legacy::ModelChangeEvent; +use crate::query_manager::QueryManager; +use crate::util::ModelChangeEvent; use log::info; use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; @@ -19,11 +19,13 @@ use tokio::sync::mpsc; mod commands; +mod connection_or_tx; +mod db_context; pub mod error; -pub mod manager; +pub mod query_manager; pub mod models; pub mod queries; -pub mod queries_legacy; +pub mod util; pub mod render; pub struct SqliteConnection(pub Mutex>); diff --git a/src-tauri/yaak-models/src/manager.rs b/src-tauri/yaak-models/src/manager.rs deleted file mode 100644 index de0f7693..00000000 --- a/src-tauri/yaak-models/src/manager.rs +++ /dev/null @@ -1,108 +0,0 @@ -use crate::error::Result; -use crate::queries_legacy::ModelPayload; -use r2d2::{Pool, PooledConnection}; -use r2d2_sqlite::SqliteConnectionManager; -use rusqlite::{Connection, Statement, ToSql, Transaction, TransactionBehavior}; -use std::sync::Arc; -use tauri::{Manager, Runtime}; -use tokio::sync::{mpsc, Mutex}; - -pub trait QueryManagerExt<'a, R> { - fn queries(&'a self) -> &'a QueryManager; -} - -impl<'a, R: Runtime, T: Manager> QueryManagerExt<'a, R> for T { - fn queries(&'a self) -> &'a QueryManager { - let qm = self.state::(); - qm.inner() - } -} - -#[derive(Clone)] -pub struct QueryManager { - pool: Arc>>, - events_tx: mpsc::Sender, -} - -impl QueryManager { - pub(crate) fn new( - pool: Pool, - events_tx: mpsc::Sender, - ) -> Self { - QueryManager { - pool: Arc::new(Mutex::new(pool)), - events_tx, - } - } - - pub async fn connect(&self) -> Result { - let conn = self.pool.lock().await.get()?; - Ok(DbContext { - tx: self.events_tx.clone(), - conn: ConnectionOrTx::Connection(conn), - }) - } - - pub async fn with_conn(&self, func: F) -> Result - where - F: FnOnce(&DbContext) -> Result, - { - let conn = self.pool.lock().await.get()?; - let db_context = DbContext { - tx: self.events_tx.clone(), - conn: ConnectionOrTx::Connection(conn), - }; - func(&db_context) - } - - pub async fn with_tx(&self, func: F) -> Result - where - F: FnOnce(&DbContext) -> Result, - { - let mut conn = self.pool.lock().await.get()?; - let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; - - let db_context = DbContext { - tx: self.events_tx.clone(), - conn: ConnectionOrTx::Transaction(&tx), - }; - - match func(&db_context) { - Ok(val) => { - tx.commit()?; - Ok(val) - } - Err(e) => { - tx.rollback()?; - Err(e) - } - } - } -} - -pub enum ConnectionOrTx<'a> { - Connection(PooledConnection), - Transaction(&'a Transaction<'a>), -} - -impl<'a> ConnectionOrTx<'a> { - pub(crate) fn resolve(&self) -> &Connection { - match self { - ConnectionOrTx::Connection(c) => c, - ConnectionOrTx::Transaction(c) => c, - } - } - - pub(crate) fn prepare(&self, sql: &str) -> rusqlite::Result> { - self.resolve().prepare(sql) - } - - pub(crate) fn execute(&self, sql: &str, params: &[&dyn ToSql]) -> rusqlite::Result { - self.resolve().execute(sql, params) - } -} - -pub struct DbContext<'a> { - pub(crate) tx: mpsc::Sender, - pub(crate) conn: ConnectionOrTx<'a>, -} diff --git a/src-tauri/yaak-models/src/models.rs b/src-tauri/yaak-models/src/models.rs index 1de6522f..4f8bc3f7 100644 --- a/src-tauri/yaak-models/src/models.rs +++ b/src-tauri/yaak-models/src/models.rs @@ -3,7 +3,7 @@ use crate::models::HttpRequestIden::{ Authentication, AuthenticationType, Body, BodyType, CreatedAt, Description, FolderId, Headers, Method, Name, SortPriority, UpdatedAt, Url, UrlParameters, WorkspaceId, }; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; use chrono::{NaiveDateTime, Utc}; use rusqlite::Row; use sea_query::{enum_def, IntoIden, IntoTableRef, SimpleExpr}; diff --git a/src-tauri/yaak-models/src/queries/batch.rs b/src-tauri/yaak-models/src/queries/batch.rs index 92135b8f..c1c29339 100644 --- a/src-tauri/yaak-models/src/queries/batch.rs +++ b/src-tauri/yaak-models/src/queries/batch.rs @@ -1,8 +1,8 @@ use crate::error::Result; -use crate::manager::DbContext; use crate::models::{Environment, Folder, GrpcRequest, HttpRequest, WebsocketRequest, Workspace}; -use crate::queries_legacy::{BatchUpsertResult, UpdateSource}; +use crate::util::{BatchUpsertResult, UpdateSource}; use log::info; +use crate::db_context::DbContext; impl<'a> DbContext<'a> { pub fn batch_upsert( diff --git a/src-tauri/yaak-models/src/queries/cookie_jars.rs b/src-tauri/yaak-models/src/queries/cookie_jars.rs index aefdf7c3..525e90ce 100644 --- a/src-tauri/yaak-models/src/queries/cookie_jars.rs +++ b/src-tauri/yaak-models/src/queries/cookie_jars.rs @@ -1,7 +1,7 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{CookieJar, CookieJarIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { pub fn get_cookie_jar(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/environments.rs b/src-tauri/yaak-models/src/queries/environments.rs index 8a8baf06..333157d6 100644 --- a/src-tauri/yaak-models/src/queries/environments.rs +++ b/src-tauri/yaak-models/src/queries/environments.rs @@ -1,11 +1,11 @@ use crate::error::Result; -use crate::manager::DbContext; use crate::models::{Environment, EnvironmentIden, UpsertModelInfo}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; use log::info; use sea_query::ColumnRef::Asterisk; use sea_query::{Cond, Expr, Query, SqliteQueryBuilder}; use sea_query_rusqlite::RusqliteBinder; +use crate::db_context::DbContext; impl<'a> DbContext<'a> { pub fn get_environment(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/folders.rs b/src-tauri/yaak-models/src/queries/folders.rs index 156b7338..bd9d17f0 100644 --- a/src-tauri/yaak-models/src/queries/folders.rs +++ b/src-tauri/yaak-models/src/queries/folders.rs @@ -1,10 +1,10 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{ Folder, FolderIden, GrpcRequest, GrpcRequestIden, HttpRequest, HttpRequestIden, WebsocketRequest, WebsocketRequestIden, }; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { pub fn get_folder(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/grpc_connections.rs b/src-tauri/yaak-models/src/queries/grpc_connections.rs index 4d442853..a8e9dfeb 100644 --- a/src-tauri/yaak-models/src/queries/grpc_connections.rs +++ b/src-tauri/yaak-models/src/queries/grpc_connections.rs @@ -1,11 +1,11 @@ use crate::error::Result; -use crate::manager::DbContext; use crate::models::{GrpcConnection, GrpcConnectionIden, GrpcConnectionState}; -use crate::queries::base::MAX_HISTORY_ITEMS; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; use log::debug; use sea_query::{Expr, Query, SqliteQueryBuilder}; use sea_query_rusqlite::RusqliteBinder; +use crate::db_context::DbContext; +use crate::queries::MAX_HISTORY_ITEMS; impl<'a> DbContext<'a> { pub fn get_grpc_connection(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/grpc_events.rs b/src-tauri/yaak-models/src/queries/grpc_events.rs index 4b68ba4f..1794d5f2 100644 --- a/src-tauri/yaak-models/src/queries/grpc_events.rs +++ b/src-tauri/yaak-models/src/queries/grpc_events.rs @@ -1,7 +1,7 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{GrpcEvent, GrpcEventIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { pub fn get_grpc_events(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/grpc_requests.rs b/src-tauri/yaak-models/src/queries/grpc_requests.rs index 377ca25e..7116fb89 100644 --- a/src-tauri/yaak-models/src/queries/grpc_requests.rs +++ b/src-tauri/yaak-models/src/queries/grpc_requests.rs @@ -1,11 +1,11 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{GrpcRequest, GrpcRequestIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { - pub fn get_grpc_request(&self, id: &str) -> Result> { - self.find_optional(GrpcRequestIden::Id, id) + pub fn get_grpc_request(&self, id: &str) -> Result { + self.find_one(GrpcRequestIden::Id, id) } pub fn list_grpc_requests(&self, workspace_id: &str) -> Result> { @@ -26,7 +26,7 @@ impl<'a> DbContext<'a> { id: &str, source: &UpdateSource, ) -> Result { - let request = self.get_grpc_request(id)?.unwrap(); + let request = self.get_grpc_request(id)?; self.delete_grpc_request(&request, source) } diff --git a/src-tauri/yaak-models/src/queries/http_requests.rs b/src-tauri/yaak-models/src/queries/http_requests.rs index 95c7c200..777a25b4 100644 --- a/src-tauri/yaak-models/src/queries/http_requests.rs +++ b/src-tauri/yaak-models/src/queries/http_requests.rs @@ -1,11 +1,11 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{HttpRequest, HttpRequestIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { - pub fn get_http_request(&self, id: &str) -> Result> { - self.find_optional(HttpRequestIden::Id, id) + pub fn get_http_request(&self, id: &str) -> Result { + self.find_one(HttpRequestIden::Id, id) } pub fn list_http_requests(&self, workspace_id: &str) -> Result> { @@ -26,7 +26,7 @@ impl<'a> DbContext<'a> { id: &str, source: &UpdateSource, ) -> Result { - let http_request = self.get_http_request(id)?.unwrap(); + let http_request = self.get_http_request(id)?; self.delete_http_request(&http_request, source) } diff --git a/src-tauri/yaak-models/src/queries/http_responses.rs b/src-tauri/yaak-models/src/queries/http_responses.rs index 860a9707..48008e35 100644 --- a/src-tauri/yaak-models/src/queries/http_responses.rs +++ b/src-tauri/yaak-models/src/queries/http_responses.rs @@ -1,12 +1,12 @@ use crate::error::Result; -use crate::manager::DbContext; use crate::models::{HttpResponse, HttpResponseIden, HttpResponseState}; -use crate::queries::base::MAX_HISTORY_ITEMS; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; use log::{debug, error}; use sea_query::{Expr, Query, SqliteQueryBuilder}; use sea_query_rusqlite::RusqliteBinder; use std::fs; +use crate::db_context::DbContext; +use crate::queries::MAX_HISTORY_ITEMS; impl<'a> DbContext<'a> { pub fn get_http_response(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/key_values.rs b/src-tauri/yaak-models/src/queries/key_values.rs index f601a4a1..c320f422 100644 --- a/src-tauri/yaak-models/src/queries/key_values.rs +++ b/src-tauri/yaak-models/src/queries/key_values.rs @@ -1,11 +1,11 @@ use crate::error::Result; -use crate::manager::DbContext; use crate::models::{KeyValue, KeyValueIden}; -use crate::queries_legacy::{ModelChangeEvent, ModelPayload, UpdateSource}; +use crate::util::{ModelChangeEvent, ModelPayload, UpdateSource}; use log::error; use sea_query::Keyword::CurrentTimestamp; use sea_query::{Asterisk, Cond, Expr, OnConflict, Query, SqliteQueryBuilder}; use sea_query_rusqlite::RusqliteBinder; +use crate::db_context::DbContext; impl<'a> DbContext<'a> { pub fn list_key_values_raw(&self) -> Result> { diff --git a/src-tauri/yaak-models/src/queries/mod.rs b/src-tauri/yaak-models/src/queries/mod.rs index a86d1e18..d05c40a4 100644 --- a/src-tauri/yaak-models/src/queries/mod.rs +++ b/src-tauri/yaak-models/src/queries/mod.rs @@ -1,4 +1,3 @@ -mod base; mod batch; mod cookie_jars; mod environments; @@ -18,3 +17,5 @@ mod websocket_events; mod websocket_requests; mod workspace_metas; mod workspaces; + +const MAX_HISTORY_ITEMS: usize = 20; \ No newline at end of file diff --git a/src-tauri/yaak-models/src/queries/plugin_key_values.rs b/src-tauri/yaak-models/src/queries/plugin_key_values.rs index 37d8760d..fe0bba0a 100644 --- a/src-tauri/yaak-models/src/queries/plugin_key_values.rs +++ b/src-tauri/yaak-models/src/queries/plugin_key_values.rs @@ -1,5 +1,5 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{PluginKeyValue, PluginKeyValueIden}; use sea_query::Keyword::CurrentTimestamp; use sea_query::{Asterisk, Cond, Expr, OnConflict, Query, SqliteQueryBuilder}; diff --git a/src-tauri/yaak-models/src/queries/plugins.rs b/src-tauri/yaak-models/src/queries/plugins.rs index 830c0f58..2355d11a 100644 --- a/src-tauri/yaak-models/src/queries/plugins.rs +++ b/src-tauri/yaak-models/src/queries/plugins.rs @@ -1,13 +1,13 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{Plugin, PluginIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { pub fn get_plugin(&self, id: &str) -> Result { self.find_one(PluginIden::Id, id) } - + pub fn list_plugins(&self) -> Result> { self.find_all() } @@ -20,7 +20,7 @@ impl<'a> DbContext<'a> { let plugin = self.get_plugin(id)?; self.delete_plugin(&plugin, source) } - + pub fn upsert_plugin(&self, plugin: &Plugin, source: &UpdateSource) -> Result { self.upsert(plugin, source) } diff --git a/src-tauri/yaak-models/src/queries/settings.rs b/src-tauri/yaak-models/src/queries/settings.rs index 63d8f6cd..ff4d3246 100644 --- a/src-tauri/yaak-models/src/queries/settings.rs +++ b/src-tauri/yaak-models/src/queries/settings.rs @@ -1,22 +1,24 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{Settings, SettingsIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { - pub fn get_or_create_settings(&self, source: &UpdateSource) -> Result { - let id = "default"; - if let Some(s) = self.find_optional::(SettingsIden::Id, id)? { - return Ok(s); + pub fn get_or_create_settings(&self, source: &UpdateSource) -> Settings { + let id = "default".to_string(); + + if let Some(s) = self.find_optional::(SettingsIden::Id, &id) { + return s; }; self.upsert( &Settings { - id: id.to_string(), + id, ..Default::default() }, source, ) + .expect("Failed to upsert settings") } pub fn upsert_settings(&self, settings: &Settings, source: &UpdateSource) -> Result { diff --git a/src-tauri/yaak-models/src/queries/sync_states.rs b/src-tauri/yaak-models/src/queries/sync_states.rs index fb84c5d3..6afca8ec 100644 --- a/src-tauri/yaak-models/src/queries/sync_states.rs +++ b/src-tauri/yaak-models/src/queries/sync_states.rs @@ -1,10 +1,10 @@ use crate::error::Result; -use crate::manager::DbContext; use crate::models::{SyncState, SyncStateIden, UpsertModelInfo}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; use sea_query::{Asterisk, Cond, Expr, Query, SqliteQueryBuilder}; use sea_query_rusqlite::RusqliteBinder; use std::path::Path; +use crate::db_context::DbContext; impl<'a> DbContext<'a> { pub fn get_sync_state(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/websocket_connections.rs b/src-tauri/yaak-models/src/queries/websocket_connections.rs index 4bcbd58e..c105139e 100644 --- a/src-tauri/yaak-models/src/queries/websocket_connections.rs +++ b/src-tauri/yaak-models/src/queries/websocket_connections.rs @@ -1,8 +1,8 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{WebsocketConnection, WebsocketConnectionIden, WebsocketConnectionState}; -use crate::queries::base::MAX_HISTORY_ITEMS; -use crate::queries_legacy::UpdateSource; +use crate::queries::MAX_HISTORY_ITEMS; +use crate::util::UpdateSource; use log::debug; use sea_query::{Expr, Query, SqliteQueryBuilder}; use sea_query_rusqlite::RusqliteBinder; diff --git a/src-tauri/yaak-models/src/queries/websocket_events.rs b/src-tauri/yaak-models/src/queries/websocket_events.rs index 08fee311..e0ca1575 100644 --- a/src-tauri/yaak-models/src/queries/websocket_events.rs +++ b/src-tauri/yaak-models/src/queries/websocket_events.rs @@ -1,10 +1,10 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{ WebsocketEvent, WebsocketEventIden, }; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { pub fn get_websocket_event(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/queries/websocket_requests.rs b/src-tauri/yaak-models/src/queries/websocket_requests.rs index dd3ffa23..3d4784dd 100644 --- a/src-tauri/yaak-models/src/queries/websocket_requests.rs +++ b/src-tauri/yaak-models/src/queries/websocket_requests.rs @@ -1,11 +1,11 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{WebsocketRequest, WebsocketRequestIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { - pub fn get_websocket_request(&self, id: &str) -> Result> { - self.find_optional(WebsocketRequestIden::Id, id) + pub fn get_websocket_request(&self, id: &str) -> Result { + self.find_one(WebsocketRequestIden::Id, id) } pub fn list_websocket_requests(&self, workspace_id: &str) -> Result> { @@ -26,7 +26,7 @@ impl<'a> DbContext<'a> { id: &str, source: &UpdateSource, ) -> Result { - let request = self.get_websocket_request(id)?.unwrap(); + let request = self.get_websocket_request(id)?; self.delete_websocket_request(&request, source) } diff --git a/src-tauri/yaak-models/src/queries/workspace_metas.rs b/src-tauri/yaak-models/src/queries/workspace_metas.rs index c9c2415a..614b54b1 100644 --- a/src-tauri/yaak-models/src/queries/workspace_metas.rs +++ b/src-tauri/yaak-models/src/queries/workspace_metas.rs @@ -1,10 +1,10 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{Workspace, WorkspaceMeta, WorkspaceMetaIden}; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { - pub fn get_workspace_meta(&self, workspace: &Workspace) -> Result> { + pub fn get_workspace_meta(&self, workspace: &Workspace) -> Option { self.find_optional(WorkspaceMetaIden::WorkspaceId, &workspace.id) } @@ -13,7 +13,7 @@ impl<'a> DbContext<'a> { workspace: &Workspace, source: &UpdateSource, ) -> Result { - let workspace_meta = self.get_workspace_meta(workspace)?; + let workspace_meta = self.get_workspace_meta(workspace); if let Some(workspace_meta) = workspace_meta { return Ok(workspace_meta); } diff --git a/src-tauri/yaak-models/src/queries/workspaces.rs b/src-tauri/yaak-models/src/queries/workspaces.rs index 743366ff..15ceb370 100644 --- a/src-tauri/yaak-models/src/queries/workspaces.rs +++ b/src-tauri/yaak-models/src/queries/workspaces.rs @@ -1,10 +1,10 @@ +use crate::db_context::DbContext; use crate::error::Result; -use crate::manager::DbContext; use crate::models::{ Folder, FolderIden, GrpcRequest, GrpcRequestIden, HttpRequest, HttpRequestIden, WebsocketRequest, WebsocketRequestIden, Workspace, WorkspaceIden, }; -use crate::queries_legacy::UpdateSource; +use crate::util::UpdateSource; impl<'a> DbContext<'a> { pub fn get_workspace(&self, id: &str) -> Result { diff --git a/src-tauri/yaak-models/src/query_manager.rs b/src-tauri/yaak-models/src/query_manager.rs new file mode 100644 index 00000000..2accfb57 --- /dev/null +++ b/src-tauri/yaak-models/src/query_manager.rs @@ -0,0 +1,124 @@ +use crate::connection_or_tx::ConnectionOrTx; +use crate::db_context::DbContext; +use crate::error::Result; +use crate::util::ModelPayload; +use r2d2::Pool; +use r2d2_sqlite::SqliteConnectionManager; +use rusqlite::TransactionBehavior; +use std::sync::{Arc, Mutex}; +use tauri::{Manager, Runtime}; +use tokio::sync::mpsc; + +pub trait QueryManagerExt<'a, R> { + fn db(&'a self) -> DbContext<'a>; + fn with_db(&'a self, func: F) -> T + where + F: FnOnce(&DbContext) -> T; + fn with_tx(&'a self, func: F) -> Result + where + F: FnOnce(&DbContext) -> Result; +} + +impl<'a, R: Runtime, M: Manager> QueryManagerExt<'a, R> for M { + fn db(&'a self) -> DbContext<'a> { + let qm = self.state::(); + qm.inner().connect_2() + } + + fn with_db(&'a self, func: F) -> T + where + F: FnOnce(&DbContext) -> T, + { + let qm = self.state::(); + qm.inner().with_conn(func) + } + + fn with_tx(&'a self, func: F) -> Result + where + F: FnOnce(&DbContext) -> Result, + { + let qm = self.state::(); + qm.inner().with_tx(func) + } +} + +#[derive(Clone)] +pub struct QueryManager { + pool: Arc>>, + events_tx: mpsc::Sender, +} + +impl QueryManager { + pub(crate) fn new( + pool: Pool, + events_tx: mpsc::Sender, + ) -> Self { + QueryManager { + pool: Arc::new(Mutex::new(pool)), + events_tx, + } + } + + pub fn connect_2(&self) -> DbContext { + let conn = self + .pool + .lock() + .expect("Failed to gain lock on DB") + .get() + .expect("Failed to get a new DB connection from the pool"); + DbContext { + tx: self.events_tx.clone(), + conn: ConnectionOrTx::Connection(conn), + } + } + + pub fn with_conn(&self, func: F) -> T + where + F: FnOnce(&DbContext) -> T, + { + let conn = self + .pool + .lock() + .expect("Failed to gain lock on DB for transaction") + .get() + .expect("Failed to get new DB connection from the pool"); + + let db_context = DbContext { + tx: self.events_tx.clone(), + conn: ConnectionOrTx::Connection(conn), + }; + + func(&db_context) + } + + pub fn with_tx(&self, func: F) -> Result + where + F: FnOnce(&DbContext) -> Result, + { + let mut conn = self + .pool + .lock() + .expect("Failed to gain lock on DB for transaction") + .get() + .expect("Failed to get new DB connection from the pool"); + let tx = conn + .transaction_with_behavior(TransactionBehavior::Immediate) + .expect("Failed to start DB transaction"); + + let db_context = DbContext { + tx: self.events_tx.clone(), + conn: ConnectionOrTx::Transaction(&tx), + }; + + match func(&db_context) { + Ok(val) => { + tx.commit()?; + Ok(val) + } + Err(e) => { + tx.rollback()?; + Err(e) + } + } + } +} diff --git a/src-tauri/yaak-models/src/queries_legacy.rs b/src-tauri/yaak-models/src/util.rs similarity index 95% rename from src-tauri/yaak-models/src/queries_legacy.rs rename to src-tauri/yaak-models/src/util.rs index f0b256fb..980523af 100644 --- a/src-tauri/yaak-models/src/queries_legacy.rs +++ b/src-tauri/yaak-models/src/util.rs @@ -1,12 +1,15 @@ use crate::error::Result; -use crate::manager::QueryManagerExt; -use crate::models::{AnyModel, Environment, Folder, GrpcRequest, HttpRequest, ModelType, WebsocketRequest, Workspace, WorkspaceIden}; +use crate::models::{ + AnyModel, Environment, Folder, GrpcRequest, HttpRequest, ModelType, WebsocketRequest, + Workspace, WorkspaceIden, +}; use chrono::{NaiveDateTime, Utc}; use log::warn; use nanoid::nanoid; use serde::{Deserialize, Serialize}; use tauri::{AppHandle, Listener, Runtime, WebviewWindow}; use ts_rs::TS; +use crate::query_manager::QueryManagerExt; pub fn generate_model_id(model: ModelType) -> String { let id = generate_id(); @@ -131,7 +134,7 @@ pub async fn get_workspace_export_resources( }, }; - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); for workspace_id in workspace_ids { data.resources.workspaces.push(db.find_one(WorkspaceIden::Id, workspace_id)?); data.resources.environments.append(&mut db.list_environments(workspace_id)?); diff --git a/src-tauri/yaak-plugins/src/manager.rs b/src-tauri/yaak-plugins/src/manager.rs index 6c8c5c0b..ab9ea393 100644 --- a/src-tauri/yaak-plugins/src/manager.rs +++ b/src-tauri/yaak-plugins/src/manager.rs @@ -26,8 +26,8 @@ use tokio::fs::read_dir; use tokio::net::TcpListener; use tokio::sync::{mpsc, Mutex}; use tokio::time::{timeout, Instant}; -use yaak_models::manager::QueryManagerExt; -use yaak_models::queries_legacy::generate_id; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::generate_id; use yaak_templates::error::Error::RenderError; use yaak_templates::error::Result as TemplateResult; @@ -160,7 +160,7 @@ impl PluginManager { .collect(); let plugins = - app_handle.queries().connect().await.unwrap().list_plugins().unwrap_or_default(); + app_handle.db().list_plugins().unwrap_or_default(); let installed_plugin_dirs: Vec = plugins .iter() .map(|p| PluginCandidate { diff --git a/src-tauri/yaak-sync/src/sync.rs b/src-tauri/yaak-sync/src/sync.rs index 111d0de7..d475d5a8 100644 --- a/src-tauri/yaak-sync/src/sync.rs +++ b/src-tauri/yaak-sync/src/sync.rs @@ -11,9 +11,9 @@ use tokio::fs; use tokio::fs::File; use tokio::io::AsyncWriteExt; use ts_rs::TS; -use yaak_models::manager::QueryManagerExt; use yaak_models::models::{SyncState, WorkspaceMeta}; -use yaak_models::queries_legacy::{get_workspace_export_resources, UpdateSource}; +use yaak_models::query_manager::QueryManagerExt; +use yaak_models::util::{get_workspace_export_resources, UpdateSource}; #[derive(Debug, Clone, Serialize, Deserialize, TS)] #[serde(rename_all = "camelCase", tag = "type")] @@ -112,9 +112,7 @@ pub(crate) async fn get_db_candidates( .map(|m| (m.id(), m)) .collect(); let sync_states: HashMap<_, _> = app_handle - .queries() - .connect() - .await? + .db() .list_sync_states_for_workspace(workspace_id, sync_dir)? .into_iter() .map(|s| (s.model_id.clone(), s)) @@ -440,27 +438,24 @@ pub(crate) async fn apply_sync_ops( }); } - let upserted_models = app_handle - .queries() - .with_tx(|tx| { - tx.batch_upsert( - workspaces_to_upsert, - environments_to_upsert, - folders_to_upsert, - http_requests_to_upsert, - grpc_requests_to_upsert, - websocket_requests_to_upsert, - &UpdateSource::Sync, - ) - }) - .await?; + let upserted_models = app_handle.with_tx(|tx| { + tx.batch_upsert( + workspaces_to_upsert, + environments_to_upsert, + folders_to_upsert, + http_requests_to_upsert, + grpc_requests_to_upsert, + websocket_requests_to_upsert, + &UpdateSource::Sync, + ) + })?; // Ensure we creat WorkspaceMeta models for each new workspace, with the appropriate sync dir let sync_dir_string = sync_dir.to_string_lossy().to_string(); - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); for workspace in upserted_models.workspaces { let r = match db.get_workspace_meta(&workspace) { - Ok(Some(m)) => { + Some(m) => { if m.setting_sync_dir == Some(sync_dir_string.clone()) { // We don't need to update if unchanged continue; @@ -473,7 +468,7 @@ pub(crate) async fn apply_sync_ops( &UpdateSource::Sync, ) } - Ok(None) => db.upsert_workspace_meta( + None => db.upsert_workspace_meta( &WorkspaceMeta { workspace_id: workspace_id.to_string(), setting_sync_dir: Some(sync_dir.to_string_lossy().to_string()), @@ -481,7 +476,6 @@ pub(crate) async fn apply_sync_ops( }, &UpdateSource::Sync, ), - Err(e) => Err(e), }; if let Err(e) = r { @@ -531,7 +525,7 @@ pub(crate) async fn apply_sync_state_ops( flushed_at: Utc::now().naive_utc(), ..Default::default() }; - app_handle.queries().connect().await?.upsert_sync_state(&sync_state)?; + app_handle.db().upsert_sync_state(&sync_state)?; } SyncStateOp::Update { state: sync_state, @@ -545,10 +539,10 @@ pub(crate) async fn apply_sync_state_ops( flushed_at: Utc::now().naive_utc(), ..sync_state }; - app_handle.queries().connect().await?.upsert_sync_state(&sync_state)?; + app_handle.db().upsert_sync_state(&sync_state)?; } SyncStateOp::Delete { state } => { - app_handle.queries().connect().await?.delete_sync_state(&state)?; + app_handle.db().delete_sync_state(&state)?; } } } @@ -561,7 +555,7 @@ fn derive_model_filename(m: &SyncModel) -> PathBuf { } async fn delete_model(app_handle: &AppHandle, model: &SyncModel) -> Result<()> { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); match model { SyncModel::Workspace(m) => { db.delete_workspace(&m, &UpdateSource::Sync)?; diff --git a/src-tauri/yaak-ws/src/commands.rs b/src-tauri/yaak-ws/src/commands.rs index 9e7afa4f..86698eb6 100644 --- a/src-tauri/yaak-ws/src/commands.rs +++ b/src-tauri/yaak-ws/src/commands.rs @@ -1,4 +1,3 @@ -use crate::error::Error::GenericError; use crate::error::Result; use crate::manager::WebsocketManager; use crate::render::render_request; @@ -10,12 +9,12 @@ use tokio::sync::{mpsc, Mutex}; use tokio_tungstenite::tungstenite::http::HeaderValue; use tokio_tungstenite::tungstenite::Message; use yaak_http::apply_path_placeholders; -use yaak_models::manager::QueryManagerExt; +use yaak_models::query_manager::QueryManagerExt; use yaak_models::models::{ HttpResponseHeader, WebsocketConnection, WebsocketConnectionState, WebsocketEvent, WebsocketEventType, WebsocketRequest, }; -use yaak_models::queries_legacy::UpdateSource; +use yaak_models::util::UpdateSource; use yaak_plugins::events::{ CallHttpAuthenticationRequest, HttpHeader, RenderPurpose, WindowContext, }; @@ -28,11 +27,7 @@ pub(crate) async fn upsert_request( app_handle: AppHandle, window: WebviewWindow, ) -> Result { - Ok(app_handle - .queries() - .connect() - .await? - .upsert_websocket_request(&request, &UpdateSource::from_window(&window))?) + Ok(app_handle.db().upsert_websocket_request(&request, &UpdateSource::from_window(&window))?) } #[tauri::command] @@ -41,8 +36,8 @@ pub(crate) async fn duplicate_request( app_handle: AppHandle, window: WebviewWindow, ) -> Result { - let db = app_handle.queries().connect().await?; - let request = db.get_websocket_request(request_id)?.unwrap(); + let db = app_handle.db(); + let request = db.get_websocket_request(request_id)?; Ok(db.duplicate_websocket_request(&request, &UpdateSource::from_window(&window))?) } @@ -53,9 +48,7 @@ pub(crate) async fn delete_request( window: WebviewWindow, ) -> Result { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_websocket_request_by_id(request_id, &UpdateSource::from_window(&window))?) } @@ -66,9 +59,7 @@ pub(crate) async fn delete_connection( window: WebviewWindow, ) -> Result { Ok(app_handle - .queries() - .connect() - .await? + .db() .delete_websocket_connection_by_id(connection_id, &UpdateSource::from_window(&window))?) } @@ -78,7 +69,7 @@ pub(crate) async fn delete_connections( app_handle: AppHandle, window: WebviewWindow, ) -> Result<()> { - Ok(app_handle.queries().connect().await?.delete_all_websocket_connections_for_request( + Ok(app_handle.db().delete_all_websocket_connections_for_request( request_id, &UpdateSource::from_window(&window), )?) @@ -89,7 +80,7 @@ pub(crate) async fn list_events( connection_id: &str, app_handle: AppHandle, ) -> Result> { - Ok(app_handle.queries().connect().await?.list_websocket_events(connection_id)?) + Ok(app_handle.db().list_websocket_events(connection_id)?) } #[tauri::command] @@ -97,7 +88,7 @@ pub(crate) async fn list_requests( workspace_id: &str, app_handle: AppHandle, ) -> Result> { - Ok(app_handle.queries().connect().await?.list_websocket_requests(workspace_id)?) + Ok(app_handle.db().list_websocket_requests(workspace_id)?) } #[tauri::command] @@ -105,11 +96,7 @@ pub(crate) async fn list_connections( workspace_id: &str, app_handle: AppHandle, ) -> Result> { - Ok(app_handle - .queries() - .connect() - .await? - .list_websocket_connections_for_workspace(workspace_id)?) + Ok(app_handle.db().list_websocket_connections_for_workspace(workspace_id)?) } #[tauri::command] @@ -121,22 +108,17 @@ pub(crate) async fn send( ws_manager: State<'_, Mutex>, ) -> Result { let (connection, unrendered_request) = { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); let connection = db.get_websocket_connection(connection_id)?; - let unrendered_request = db - .get_websocket_request(&connection.request_id)? - .ok_or(GenericError("WebSocket Request not found".to_string()))?; + let unrendered_request = db.get_websocket_request(&connection.request_id)?; (connection, unrendered_request) }; let environment = match environment_id { - Some(id) => Some(app_handle.queries().connect().await?.get_environment(id)?), + Some(id) => Some(app_handle.db().get_environment(id)?), None => None, }; - let base_environment = app_handle - .queries() - .connect() - .await? - .get_base_environment(&unrendered_request.workspace_id)?; + let base_environment = + app_handle.db().get_base_environment(&unrendered_request.workspace_id)?; let request = render_request( &unrendered_request, &base_environment, @@ -152,7 +134,7 @@ pub(crate) async fn send( let mut ws_manager = ws_manager.lock().await; ws_manager.send(&connection.id, Message::Text(request.message.clone().into())).await?; - app_handle.queries().connect().await?.upsert_websocket_event( + app_handle.db().upsert_websocket_event( &WebsocketEvent { connection_id: connection.id.clone(), request_id: request.id.clone(), @@ -176,7 +158,7 @@ pub(crate) async fn close( ws_manager: State<'_, Mutex>, ) -> Result { let connection = { - let db = app_handle.queries().connect().await?; + let db = app_handle.db(); let connection = db.get_websocket_connection(connection_id)?; db.upsert_websocket_connection( &WebsocketConnection { @@ -205,21 +187,13 @@ pub(crate) async fn connect( plugin_manager: State<'_, PluginManager>, ws_manager: State<'_, Mutex>, ) -> Result { - let unrendered_request = app_handle - .queries() - .connect() - .await? - .get_websocket_request(request_id)? - .ok_or(GenericError("Failed to find GRPC request".to_string()))?; + let unrendered_request = app_handle.db().get_websocket_request(request_id)?; let environment = match environment_id { - Some(id) => Some(app_handle.queries().connect().await?.get_environment(id)?), + Some(id) => Some(app_handle.db().get_environment(id)?), None => None, }; - let base_environment = app_handle - .queries() - .connect() - .await? - .get_base_environment(&unrendered_request.workspace_id)?; + let base_environment = + app_handle.db().get_base_environment(&unrendered_request.workspace_id)?; let request = render_request( &unrendered_request, &base_environment, @@ -262,11 +236,11 @@ pub(crate) async fn connect( // TODO: Handle cookies let _cookie_jar = match cookie_jar_id { - Some(id) => Some(app_handle.queries().connect().await?.get_cookie_jar(id)?), + Some(id) => Some(app_handle.db().get_cookie_jar(id)?), None => None, }; - let connection = app_handle.queries().connect().await?.upsert_websocket_connection( + let connection = app_handle.db().upsert_websocket_connection( &WebsocketConnection { workspace_id: request.workspace_id.clone(), request_id: request_id.to_string(), @@ -296,7 +270,7 @@ pub(crate) async fn connect( { Ok(r) => r, Err(e) => { - return Ok(app_handle.queries().connect().await?.upsert_websocket_connection( + return Ok(app_handle.db().upsert_websocket_connection( &WebsocketConnection { error: Some(format!("{e:?}")), state: WebsocketConnectionState::Closed, @@ -307,7 +281,7 @@ pub(crate) async fn connect( } }; - app_handle.queries().connect().await?.upsert_websocket_event( + app_handle.db().upsert_websocket_event( &WebsocketEvent { connection_id: connection.id.clone(), request_id: request.id.clone(), @@ -328,7 +302,7 @@ pub(crate) async fn connect( }) .collect::>(); - let connection = app_handle.queries().connect().await?.upsert_websocket_connection( + let connection = app_handle.db().upsert_websocket_connection( &WebsocketConnection { state: WebsocketConnectionState::Connected, headers: response_headers, @@ -352,10 +326,7 @@ pub(crate) async fn connect( } app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_websocket_event( &WebsocketEvent { connection_id: connection_id.clone(), @@ -381,10 +352,7 @@ pub(crate) async fn connect( info!("Websocket connection closed"); if !has_written_close { app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_websocket_event( &WebsocketEvent { connection_id: connection_id.clone(), @@ -399,10 +367,7 @@ pub(crate) async fn connect( .unwrap(); } app_handle - .queries() - .connect() - .await - .unwrap() + .db() .upsert_websocket_connection( &WebsocketConnection { workspace_id: request.workspace_id.clone(), diff --git a/src-web/lib/tauri.ts b/src-web/lib/tauri.ts index d0236f56..193fc17c 100644 --- a/src-web/lib/tauri.ts +++ b/src-web/lib/tauri.ts @@ -27,13 +27,10 @@ type TauriCmd = | 'cmd_export_data' | 'cmd_filter_response' | 'cmd_format_json' - | 'cmd_get_cookie_jar' | 'cmd_get_environment' | 'cmd_get_folder' - | 'cmd_get_grpc_request' | 'cmd_get_http_authentication_config' | 'cmd_get_http_authentication_summaries' - | 'cmd_get_http_request' | 'cmd_get_key_value' | 'cmd_get_settings' | 'cmd_get_sse_events'