mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-24 01:38:26 +02:00
Database access refactor (#190)
This commit is contained in:
@@ -49,7 +49,7 @@
|
||||
"minimum": 1.0
|
||||
},
|
||||
"description": {
|
||||
"description": "Human-readable description of what the permission does. Tauri convention is to use <h4> headings in markdown content for Tauri documentation generation purposes.",
|
||||
"description": "Human-readable description of what the permission does. Tauri convention is to use `<h4>` headings in markdown content for Tauri documentation generation purposes.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
@@ -111,7 +111,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"description": "Human-readable description of what the permission does. Tauri internal convention is to use <h4> headings in markdown content for Tauri documentation generation purposes.",
|
||||
"description": "Human-readable description of what the permission does. Tauri internal convention is to use `<h4>` headings in markdown content for Tauri documentation generation purposes.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
|
||||
@@ -126,7 +126,8 @@ impl TryFrom<AnyModel> for SyncModel {
|
||||
AnyModel::WebsocketConnection(m) => return Err(UnknownModel(m.model)),
|
||||
AnyModel::WebsocketEvent(m) => return Err(UnknownModel(m.model)),
|
||||
AnyModel::WorkspaceMeta(m) => return Err(UnknownModel(m.model)),
|
||||
AnyModel::SyncState(m) => return Err(UnknownModel(m.model)),
|
||||
};
|
||||
Ok(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,13 +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::{
|
||||
batch_upsert, delete_environment, delete_folder, delete_grpc_request, delete_http_request,
|
||||
delete_sync_state, delete_websocket_request, delete_workspace, get_workspace_export_resources,
|
||||
get_workspace_meta, list_sync_states_for_workspace, upsert_sync_state, upsert_workspace_meta,
|
||||
UpdateSource,
|
||||
};
|
||||
use yaak_models::queries_legacy::{get_workspace_export_resources, UpdateSource};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
|
||||
#[serde(rename_all = "camelCase", tag = "type")]
|
||||
@@ -115,12 +111,14 @@ pub(crate) async fn get_db_candidates<R: Runtime>(
|
||||
.into_iter()
|
||||
.map(|m| (m.id(), m))
|
||||
.collect();
|
||||
let sync_states: HashMap<_, _> =
|
||||
list_sync_states_for_workspace(app_handle, workspace_id, sync_dir)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|s| (s.model_id.clone(), s))
|
||||
.collect();
|
||||
let sync_states: HashMap<_, _> = app_handle
|
||||
.queries()
|
||||
.connect()
|
||||
.await?
|
||||
.list_sync_states_for_workspace(workspace_id, sync_dir)?
|
||||
.into_iter()
|
||||
.map(|s| (s.model_id.clone(), s))
|
||||
.collect();
|
||||
|
||||
// 1. Add candidates for models (created/modified/unmodified)
|
||||
let mut candidates: Vec<DbCandidate> = models
|
||||
@@ -442,41 +440,47 @@ pub(crate) async fn apply_sync_ops<R: Runtime>(
|
||||
});
|
||||
}
|
||||
|
||||
let upserted_models = batch_upsert(
|
||||
app_handle,
|
||||
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
|
||||
.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?;
|
||||
|
||||
// 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?;
|
||||
for workspace in upserted_models.workspaces {
|
||||
let r = match get_workspace_meta(app_handle, &workspace).await {
|
||||
let r = match db.get_workspace_meta(&workspace) {
|
||||
Ok(Some(m)) => {
|
||||
if m.setting_sync_dir == Some(sync_dir_string.clone()) {
|
||||
// We don't need to update if unchanged
|
||||
continue;
|
||||
}
|
||||
let wm = WorkspaceMeta {
|
||||
setting_sync_dir: Some(sync_dir.to_string_lossy().to_string()),
|
||||
..m
|
||||
};
|
||||
upsert_workspace_meta(app_handle, wm, &UpdateSource::Sync).await
|
||||
db.upsert_workspace_meta(
|
||||
&WorkspaceMeta {
|
||||
setting_sync_dir: Some(sync_dir.to_string_lossy().to_string()),
|
||||
..m
|
||||
},
|
||||
&UpdateSource::Sync,
|
||||
)
|
||||
}
|
||||
Ok(None) => {
|
||||
let wm = WorkspaceMeta {
|
||||
Ok(None) => db.upsert_workspace_meta(
|
||||
&WorkspaceMeta {
|
||||
workspace_id: workspace_id.to_string(),
|
||||
setting_sync_dir: Some(sync_dir.to_string_lossy().to_string()),
|
||||
..Default::default()
|
||||
};
|
||||
upsert_workspace_meta(app_handle, wm, &UpdateSource::Sync).await
|
||||
}
|
||||
},
|
||||
&UpdateSource::Sync,
|
||||
),
|
||||
Err(e) => Err(e),
|
||||
};
|
||||
|
||||
@@ -527,7 +531,7 @@ pub(crate) async fn apply_sync_state_ops<R: Runtime>(
|
||||
flushed_at: Utc::now().naive_utc(),
|
||||
..Default::default()
|
||||
};
|
||||
upsert_sync_state(app_handle, sync_state).await?;
|
||||
app_handle.queries().connect().await?.upsert_sync_state(&sync_state)?;
|
||||
}
|
||||
SyncStateOp::Update {
|
||||
state: sync_state,
|
||||
@@ -541,10 +545,10 @@ pub(crate) async fn apply_sync_state_ops<R: Runtime>(
|
||||
flushed_at: Utc::now().naive_utc(),
|
||||
..sync_state
|
||||
};
|
||||
upsert_sync_state(app_handle, sync_state).await?;
|
||||
app_handle.queries().connect().await?.upsert_sync_state(&sync_state)?;
|
||||
}
|
||||
SyncStateOp::Delete { state } => {
|
||||
delete_sync_state(app_handle, state.id.as_str()).await?;
|
||||
app_handle.queries().connect().await?.delete_sync_state(&state)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -557,24 +561,25 @@ fn derive_model_filename(m: &SyncModel) -> PathBuf {
|
||||
}
|
||||
|
||||
async fn delete_model<R: Runtime>(app_handle: &AppHandle<R>, model: &SyncModel) -> Result<()> {
|
||||
let db = app_handle.queries().connect().await?;
|
||||
match model {
|
||||
SyncModel::Workspace(m) => {
|
||||
delete_workspace(app_handle, m.id.as_str(), &UpdateSource::Sync).await?;
|
||||
db.delete_workspace(&m, &UpdateSource::Sync)?;
|
||||
}
|
||||
SyncModel::Environment(m) => {
|
||||
delete_environment(app_handle, m.id.as_str(), &UpdateSource::Sync).await?;
|
||||
db.delete_environment(&m, &UpdateSource::Sync)?;
|
||||
}
|
||||
SyncModel::Folder(m) => {
|
||||
delete_folder(app_handle, m.id.as_str(), &UpdateSource::Sync).await?;
|
||||
db.delete_folder(&m, &UpdateSource::Sync)?;
|
||||
}
|
||||
SyncModel::HttpRequest(m) => {
|
||||
delete_http_request(app_handle, m.id.as_str(), &UpdateSource::Sync).await?;
|
||||
db.delete_http_request(&m, &UpdateSource::Sync)?;
|
||||
}
|
||||
SyncModel::GrpcRequest(m) => {
|
||||
delete_grpc_request(app_handle, m.id.as_str(), &UpdateSource::Sync).await?;
|
||||
db.delete_grpc_request(&m, &UpdateSource::Sync)?;
|
||||
}
|
||||
SyncModel::WebsocketRequest(m) => {
|
||||
delete_websocket_request(app_handle, m.id.as_str(), &UpdateSource::Sync).await?;
|
||||
db.delete_websocket_request(&m, &UpdateSource::Sync)?;
|
||||
}
|
||||
};
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user