Extract base environment (#149)

This commit is contained in:
Gregory Schier
2024-12-21 05:44:55 -08:00
committed by GitHub
parent ecabe9b6ef
commit dd8ccfe21f
28 changed files with 425 additions and 387 deletions

View File

@@ -110,7 +110,6 @@ pub struct Workspace {
pub updated_at: NaiveDateTime,
pub name: String,
pub description: String,
pub variables: Vec<EnvironmentVariable>,
// Settings
#[serde(default = "default_true")]
@@ -134,14 +133,12 @@ pub enum WorkspaceIden {
SettingFollowRedirects,
SettingRequestTimeout,
SettingValidateCertificates,
Variables,
}
impl<'s> TryFrom<&Row<'s>> for Workspace {
type Error = rusqlite::Error;
fn try_from(r: &Row<'s>) -> Result<Self, Self::Error> {
let variables: String = r.get("variables")?;
Ok(Workspace {
id: r.get("id")?,
model: r.get("model")?,
@@ -149,7 +146,6 @@ impl<'s> TryFrom<&Row<'s>> for Workspace {
updated_at: r.get("updated_at")?,
name: r.get("name")?,
description: r.get("description")?,
variables: serde_json::from_str(variables.as_str()).unwrap_or_default(),
setting_validate_certificates: r.get("setting_validate_certificates")?,
setting_follow_redirects: r.get("setting_follow_redirects")?,
setting_request_timeout: r.get("setting_request_timeout")?,
@@ -248,6 +244,7 @@ pub struct Environment {
pub model: String,
pub id: String,
pub workspace_id: String,
pub environment_id: Option<String>,
pub created_at: NaiveDateTime,
pub updated_at: NaiveDateTime,
@@ -263,6 +260,7 @@ pub enum EnvironmentIden {
Id,
CreatedAt,
UpdatedAt,
EnvironmentId,
WorkspaceId,
Name,
@@ -278,6 +276,7 @@ impl<'s> TryFrom<&Row<'s>> for Environment {
id: r.get("id")?,
model: r.get("model")?,
workspace_id: r.get("workspace_id")?,
environment_id: r.get("environment_id")?,
created_at: r.get("created_at")?,
updated_at: r.get("updated_at")?,
name: r.get("name")?,

View File

@@ -10,7 +10,7 @@ use crate::models::{
Settings, SettingsIden, Workspace, WorkspaceIden,
};
use crate::plugin::SqliteConnection;
use log::{debug, error};
use log::{debug, error, info};
use rand::distributions::{Alphanumeric, DistString};
use rusqlite::OptionalExtension;
use sea_query::ColumnRef::Asterisk;
@@ -191,7 +191,6 @@ pub async fn upsert_workspace<R: Runtime>(
WorkspaceIden::UpdatedAt,
WorkspaceIden::Name,
WorkspaceIden::Description,
WorkspaceIden::Variables,
WorkspaceIden::SettingRequestTimeout,
WorkspaceIden::SettingFollowRedirects,
WorkspaceIden::SettingValidateCertificates,
@@ -202,7 +201,6 @@ pub async fn upsert_workspace<R: Runtime>(
CurrentTimestamp.into(),
trimmed_name.into(),
workspace.description.into(),
serde_json::to_string(&workspace.variables)?.into(),
workspace.setting_request_timeout.into(),
workspace.setting_follow_redirects.into(),
workspace.setting_validate_certificates.into(),
@@ -213,7 +211,6 @@ pub async fn upsert_workspace<R: Runtime>(
WorkspaceIden::UpdatedAt,
WorkspaceIden::Name,
WorkspaceIden::Description,
WorkspaceIden::Variables,
WorkspaceIden::SettingRequestTimeout,
WorkspaceIden::SettingFollowRedirects,
WorkspaceIden::SettingValidateCertificates,
@@ -739,21 +736,41 @@ pub async fn upsert_cookie_jar<R: Runtime>(
}
pub async fn list_environments<R: Runtime>(
mgr: &impl Manager<R>,
window: &WebviewWindow<R>,
workspace_id: &str,
) -> Result<Vec<Environment>> {
let dbm = &*mgr.state::<SqliteConnection>();
let db = dbm.0.lock().await.get().unwrap();
let mut environments: Vec<Environment> = {
let dbm = &*window.state::<SqliteConnection>();
let db = dbm.0.lock().await.get().unwrap();
let (sql, params) = Query::select()
.from(EnvironmentIden::Table)
.cond_where(Expr::col(EnvironmentIden::WorkspaceId).eq(workspace_id))
.column(Asterisk)
.order_by(EnvironmentIden::CreatedAt, Order::Desc)
.build_rusqlite(SqliteQueryBuilder);
let mut stmt = db.prepare(sql.as_str())?;
let items = stmt.query_map(&*params.as_params(), |row| row.try_into())?;
items.map(|v| v.unwrap()).collect()
};
let (sql, params) = Query::select()
.from(EnvironmentIden::Table)
.cond_where(Expr::col(EnvironmentIden::WorkspaceId).eq(workspace_id))
.column(Asterisk)
.order_by(EnvironmentIden::CreatedAt, Order::Desc)
.build_rusqlite(SqliteQueryBuilder);
let mut stmt = db.prepare(sql.as_str())?;
let items = stmt.query_map(&*params.as_params(), |row| row.try_into())?;
Ok(items.map(|v| v.unwrap()).collect())
let base_environment =
environments.iter().find(|e| e.environment_id == None && e.workspace_id == workspace_id);
if let None = base_environment {
let base_environment = upsert_environment(
window,
Environment {
workspace_id: workspace_id.to_string(),
name: "Global Variables".to_string(),
..Default::default()
},
)
.await?;
info!("Created base environment for {workspace_id}");
environments.push(base_environment);
}
Ok(environments)
}
pub async fn delete_environment<R: Runtime>(
@@ -839,7 +856,7 @@ pub async fn update_settings<R: Runtime>(
None => None,
Some(p) => Some(serde_json::to_string(&p)?),
})
.into(),
.into(),
),
])
.returning_all()
@@ -869,6 +886,7 @@ pub async fn upsert_environment<R: Runtime>(
EnvironmentIden::Id,
EnvironmentIden::CreatedAt,
EnvironmentIden::UpdatedAt,
EnvironmentIden::EnvironmentId,
EnvironmentIden::WorkspaceId,
EnvironmentIden::Name,
EnvironmentIden::Variables,
@@ -877,7 +895,8 @@ pub async fn upsert_environment<R: Runtime>(
id.as_str().into(),
CurrentTimestamp.into(),
CurrentTimestamp.into(),
environment.workspace_id.as_str().into(),
environment.environment_id.into(),
environment.workspace_id.into(),
trimmed_name.into(),
serde_json::to_string(&environment.variables)?.into(),
])
@@ -911,6 +930,26 @@ pub async fn get_environment<R: Runtime>(mgr: &impl Manager<R>, id: &str) -> Res
Ok(stmt.query_row(&*params.as_params(), |row| row.try_into())?)
}
pub async fn get_base_environment<R: Runtime>(
mgr: &impl Manager<R>,
workspace_id: &str,
) -> Result<Environment> {
let dbm = &*mgr.state::<SqliteConnection>();
let db = dbm.0.lock().await.get().unwrap();
let (sql, params) = Query::select()
.from(EnvironmentIden::Table)
.column(Asterisk)
.cond_where(
Cond::all()
.add(Expr::col(EnvironmentIden::WorkspaceId).eq(workspace_id))
.add(Expr::col(EnvironmentIden::EnvironmentId).is_null()),
)
.build_rusqlite(SqliteQueryBuilder);
let mut stmt = db.prepare(sql.as_str())?;
Ok(stmt.query_row(&*params.as_params(), |row| row.try_into())?)
}
pub async fn get_plugin<R: Runtime>(mgr: &impl Manager<R>, id: &str) -> Result<Plugin> {
let dbm = &*mgr.state::<SqliteConnection>();
let db = dbm.0.lock().await.get().unwrap();
@@ -1142,7 +1181,7 @@ pub async fn duplicate_folder<R: Runtime>(
..src_folder.clone()
},
)
.await?;
.await?;
for m in http_requests {
upsert_http_request(
@@ -1154,7 +1193,7 @@ pub async fn duplicate_folder<R: Runtime>(
..m
},
)
.await?;
.await?;
}
for m in grpc_requests {
upsert_grpc_request(
@@ -1166,7 +1205,7 @@ pub async fn duplicate_folder<R: Runtime>(
..m
},
)
.await?;
.await?;
}
for m in folders {
// Recurse down
@@ -1177,7 +1216,7 @@ pub async fn duplicate_folder<R: Runtime>(
..m
},
))
.await?;
.await?;
}
Ok(())
}
@@ -1336,7 +1375,7 @@ pub async fn create_default_http_response<R: Runtime>(
None,
None,
)
.await
.await
}
#[allow(clippy::too_many_arguments)]