|
|
@@ -1,4 +1,5 @@
|
|
|
use crate::{
|
|
|
+ auth::{expand_auth_vars, Auth, AuthType, Authentication, BasicAuth, OAuth},
|
|
|
db::{self, Update},
|
|
|
request::{
|
|
|
self,
|
|
|
@@ -111,13 +112,10 @@ pub async fn expand_url(
|
|
|
mut url: String,
|
|
|
) -> Result<String, UrlError> {
|
|
|
if let Some(env_id) = env_id {
|
|
|
- let vars = match parse_vars(&url) {
|
|
|
- Ok(vars) => vars.iter().map(|v| v.name).collect::<Vec<_>>(),
|
|
|
- Err(e) => return Err(UrlError::Var(e.to_string())),
|
|
|
- };
|
|
|
+ let vars = parse_vars(&url).iter().map(|v| v.name).collect::<Vec<_>>();
|
|
|
|
|
|
if !vars.is_empty() {
|
|
|
- let vars = match db::get_env_variables(state.db.clone(), env_id, &vars).await {
|
|
|
+ let vars = match db::get_env_variables(&state.db, env_id, &vars).await {
|
|
|
Ok(v) => v,
|
|
|
Err(e) => return Err(UrlError::Db(e.to_string())),
|
|
|
};
|
|
|
@@ -142,10 +140,7 @@ pub async fn expand_url(
|
|
|
|
|
|
let url = url.to_string();
|
|
|
|
|
|
- let vars = match parse_vars(&url) {
|
|
|
- Ok(vars) => vars.iter().map(|v| v.name).collect::<Vec<_>>(),
|
|
|
- Err(e) => return Err(UrlError::Var(e.to_string())),
|
|
|
- };
|
|
|
+ let vars = parse_vars(&url).iter().map(|v| v.name).collect::<Vec<_>>();
|
|
|
|
|
|
if vars.is_empty() {
|
|
|
return Ok(url);
|
|
|
@@ -155,7 +150,7 @@ pub async fn expand_url(
|
|
|
return Ok(url);
|
|
|
};
|
|
|
|
|
|
- let vars = match db::get_env_variables(state.db.clone(), env_id, &vars).await {
|
|
|
+ let vars = match db::get_env_variables(&state.db, env_id, &vars).await {
|
|
|
Ok(v) => v,
|
|
|
Err(e) => return Err(UrlError::Db(e.to_string())),
|
|
|
};
|
|
|
@@ -190,33 +185,35 @@ pub async fn update_url(
|
|
|
let mut subs = vec![];
|
|
|
|
|
|
for seg in url_parsed.path.iter_mut() {
|
|
|
- if let Segment::Dynamic(seg, position) = seg {
|
|
|
- let Some(path_param) = path_params
|
|
|
- .iter()
|
|
|
- .find(|pp| pp.position as usize == *position || &pp.name == seg)
|
|
|
- else {
|
|
|
- update.push(RequestPathUpdate {
|
|
|
- position: *position,
|
|
|
- name: seg.to_string(),
|
|
|
- value: None,
|
|
|
- });
|
|
|
- continue;
|
|
|
- };
|
|
|
-
|
|
|
- if use_path_params {
|
|
|
- update.push(RequestPathUpdate {
|
|
|
- position: *position,
|
|
|
- name: path_param.name.clone(),
|
|
|
- value: Some(path_param.value.clone()),
|
|
|
- });
|
|
|
- subs.push(Segment::Dynamic(&path_param.name, *position));
|
|
|
- } else {
|
|
|
- update.push(RequestPathUpdate {
|
|
|
- position: *position,
|
|
|
- name: seg.to_string(),
|
|
|
- value: Some(path_param.value.clone()),
|
|
|
- })
|
|
|
- }
|
|
|
+ let Segment::Dynamic(seg, position) = seg else {
|
|
|
+ continue;
|
|
|
+ };
|
|
|
+
|
|
|
+ let Some(path_param) = path_params
|
|
|
+ .iter()
|
|
|
+ .find(|pp| pp.position as usize == *position || &pp.name == seg)
|
|
|
+ else {
|
|
|
+ update.push(RequestPathUpdate {
|
|
|
+ position: *position,
|
|
|
+ name: seg.to_string(),
|
|
|
+ value: None,
|
|
|
+ });
|
|
|
+ continue;
|
|
|
+ };
|
|
|
+
|
|
|
+ if use_path_params {
|
|
|
+ update.push(RequestPathUpdate {
|
|
|
+ position: *position,
|
|
|
+ name: path_param.name.clone(),
|
|
|
+ value: Some(path_param.value.clone()),
|
|
|
+ });
|
|
|
+ subs.push(Segment::Dynamic(&path_param.name, *position));
|
|
|
+ } else {
|
|
|
+ update.push(RequestPathUpdate {
|
|
|
+ position: *position,
|
|
|
+ name: seg.to_string(),
|
|
|
+ value: Some(path_param.value.clone()),
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -267,12 +264,12 @@ pub async fn send_request(
|
|
|
};
|
|
|
|
|
|
req.url = if let Some(env_id) = env_id {
|
|
|
- let vars = match parse_vars(&req.url) {
|
|
|
- Ok(vars) => vars.iter().map(|v| v.name).collect::<Vec<_>>(),
|
|
|
- Err(e) => return Err(e.to_string()),
|
|
|
- };
|
|
|
+ let vars = parse_vars(&req.url)
|
|
|
+ .iter()
|
|
|
+ .map(|v| v.name)
|
|
|
+ .collect::<Vec<_>>();
|
|
|
|
|
|
- let vars = match db::get_env_variables(state.db.clone(), env_id, &vars).await {
|
|
|
+ let vars = match db::get_env_variables(&state.db, env_id, &vars).await {
|
|
|
Ok(v) => v,
|
|
|
Err(e) => return Err(e.to_string()),
|
|
|
};
|
|
|
@@ -289,6 +286,8 @@ pub async fn send_request(
|
|
|
Err(e) => return Err(e.to_string()),
|
|
|
};
|
|
|
|
|
|
+ // Populate path placeholders
|
|
|
+
|
|
|
url.populate_path(
|
|
|
params
|
|
|
.iter()
|
|
|
@@ -296,23 +295,56 @@ pub async fn send_request(
|
|
|
.collect(),
|
|
|
);
|
|
|
|
|
|
+ // Expand any remaining parameters that are variables
|
|
|
+
|
|
|
req.url = url.to_string();
|
|
|
|
|
|
- let vars = match parse_vars(&req.url) {
|
|
|
- Ok(vars) => vars.iter().map(|v| v.name).collect::<Vec<_>>(),
|
|
|
- Err(e) => return Err(e.to_string()),
|
|
|
- };
|
|
|
+ if let Some(env_id) = env_id {
|
|
|
+ let vars = parse_vars(&req.url)
|
|
|
+ .iter()
|
|
|
+ .map(|v| v.name)
|
|
|
+ .collect::<Vec<_>>();
|
|
|
|
|
|
- req.url = if let Some(env_id) = env_id {
|
|
|
- let vars = match db::get_env_variables(state.db.clone(), env_id, &vars).await {
|
|
|
+ let vars = match db::get_env_variables(&state.db, env_id, &vars).await {
|
|
|
Ok(v) => v,
|
|
|
Err(e) => return Err(e.to_string()),
|
|
|
};
|
|
|
|
|
|
- expand_vars(&url.to_string(), &vars)
|
|
|
- } else {
|
|
|
- req.url
|
|
|
- };
|
|
|
+ req.url = expand_vars(&req.url, &vars)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check auth and append to the appropriate params
|
|
|
+
|
|
|
+ if req.entry.auth_inherit {
|
|
|
+ if let Some(auth) = db::get_auth_inherited(state.db.clone(), req.entry.parent_id)
|
|
|
+ .await
|
|
|
+ .map_err(|e| e.to_string())?
|
|
|
+ {
|
|
|
+ let mut auth = db::get_auth(state.db.clone(), auth)
|
|
|
+ .await
|
|
|
+ .map_err(|e| e.to_string())?;
|
|
|
+
|
|
|
+ if let Some(env_id) = env_id {
|
|
|
+ expand_auth_vars(&mut auth.params, &state.db, env_id)
|
|
|
+ .await
|
|
|
+ .map_err(|e| e.to_string())?;
|
|
|
+ }
|
|
|
+
|
|
|
+ req.resolve_auth(auth.params).map_err(|e| e.to_string())?;
|
|
|
+ }
|
|
|
+ } else if let Some(auth) = req.entry.auth {
|
|
|
+ let mut auth = db::get_auth(state.db.clone(), auth)
|
|
|
+ .await
|
|
|
+ .map_err(|e| e.to_string())?;
|
|
|
+
|
|
|
+ if let Some(env_id) = env_id {
|
|
|
+ expand_auth_vars(&mut auth.params, &state.db, env_id)
|
|
|
+ .await
|
|
|
+ .map_err(|e| e.to_string())?;
|
|
|
+ }
|
|
|
+
|
|
|
+ req.resolve_auth(auth.params).map_err(|e| e.to_string())?;
|
|
|
+ }
|
|
|
|
|
|
HttpRequestParameters::try_from(req)?
|
|
|
}
|
|
|
@@ -435,3 +467,46 @@ pub async fn delete_header(
|
|
|
}
|
|
|
Ok(())
|
|
|
}
|
|
|
+
|
|
|
+#[tauri::command]
|
|
|
+pub async fn set_workspace_entry_auth(
|
|
|
+ state: tauri::State<'_, AppState>,
|
|
|
+ entry_id: i64,
|
|
|
+ auth_id: Option<i64>,
|
|
|
+) -> Result<(), String> {
|
|
|
+ if let Err(e) = db::set_workspace_entry_auth(state.db.clone(), entry_id, auth_id).await {
|
|
|
+ return Err(e.to_string());
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+}
|
|
|
+
|
|
|
+#[tauri::command]
|
|
|
+pub async fn insert_auth(
|
|
|
+ state: tauri::State<'_, AppState>,
|
|
|
+ workspace_id: i64,
|
|
|
+ r#type: AuthType,
|
|
|
+) -> Result<Authentication, String> {
|
|
|
+ match db::insert_auth(state.db.clone(), workspace_id, r#type.into()).await {
|
|
|
+ Ok(auth) => Ok(auth),
|
|
|
+ Err(e) => Err(e.to_string()),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[tauri::command]
|
|
|
+pub async fn list_auth(
|
|
|
+ state: tauri::State<'_, AppState>,
|
|
|
+ workspace_id: i64,
|
|
|
+) -> Result<Vec<Authentication>, String> {
|
|
|
+ match db::list_auth(state.db.clone(), workspace_id).await {
|
|
|
+ Ok(auth) => Ok(auth),
|
|
|
+ Err(e) => Err(e.to_string()),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#[tauri::command]
|
|
|
+pub async fn delete_auth(state: tauri::State<'_, AppState>, id: i64) -> Result<(), String> {
|
|
|
+ match db::delete_auth(state.db.clone(), id).await {
|
|
|
+ Ok(_) => Ok(()),
|
|
|
+ Err(e) => Err(e.to_string()),
|
|
|
+ }
|
|
|
+}
|