Skip to content

Commit 05ef8cf

Browse files
committed
refactor: proejcts
1 parent 78d18e8 commit 05ef8cf

File tree

9 files changed

+148
-87
lines changed

9 files changed

+148
-87
lines changed

common/src/drivers/postgresql.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use serde::{Deserialize, Serialize};
22

3-
#[derive(Clone, Default, Serialize, Deserialize)]
3+
#[derive(Clone, Default, PartialEq, Serialize, Deserialize)]
44
pub struct Postgresql {
55
pub user: String,
66
pub password: String,

common/src/enums.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
44

55
use super::projects::postgresql::Postgresql;
66

7-
#[derive(Clone, Serialize, Deserialize)]
7+
#[derive(Clone, PartialEq, Serialize, Deserialize)]
88
pub enum Project {
99
POSTGRESQL(Postgresql),
1010
}
@@ -22,7 +22,7 @@ impl Display for Drivers {
2222
}
2323
}
2424

25-
#[derive(Clone, Default, Serialize, Deserialize)]
25+
#[derive(Clone, Default, PartialEq, Serialize, Deserialize)]
2626
pub enum ProjectConnectionStatus {
2727
Connected,
2828
#[default]

common/src/projects/postgresql.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,23 @@ use std::collections::BTreeMap;
33

44
use crate::{drivers::postgresql::Postgresql as PostgresqlDriver, enums::ProjectConnectionStatus};
55

6-
#[derive(Clone, Default, Serialize, Deserialize)]
6+
#[derive(Clone, PartialEq, Serialize, Deserialize)]
77
pub struct Postgresql {
88
pub name: String,
99
pub driver: PostgresqlDriver,
10-
pub schmeas: Vec<String>,
11-
pub tables: BTreeMap<String, Vec<(String, String)>>,
10+
pub schmemas: Option<Vec<String>>,
11+
pub tables: Option<BTreeMap<String, Vec<(String, String)>>>,
1212
pub connection_status: ProjectConnectionStatus,
1313
}
14+
15+
impl Default for Postgresql {
16+
fn default() -> Self {
17+
Self {
18+
name: String::default(),
19+
driver: PostgresqlDriver::default(),
20+
schmemas: None,
21+
tables: None,
22+
connection_status: ProjectConnectionStatus::Disconnected,
23+
}
24+
}
25+
}

common/src/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::enums::Project;
22

3-
pub fn project_matcher(project_name: String, project: Project) -> (String, Project) {
3+
pub fn project_matcher(project: Project) -> (String, Project) {
44
match project {
5-
Project::POSTGRESQL(project) => (project_name, Project::POSTGRESQL(project)),
5+
Project::POSTGRESQL(project) => (project.name.clone(), Project::POSTGRESQL(project)),
66
}
77
}

src-tauri/src/dbs/project.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,9 @@ pub async fn select_projects(app_state: State<'_, AppState>) -> Result<Vec<(Stri
5454
}
5555

5656
#[tauri::command(rename_all = "snake_case")]
57-
pub async fn insert_project<'a, 'b>(
58-
project: Project,
59-
app_state: State<'a, AppState>,
60-
) -> Result<Project> {
57+
pub async fn insert_project(project: Project, app_state: State<'_, AppState>) -> Result<Project> {
6158
let project_db = app_state.project_db.lock().await;
62-
let ref mut db = project_db.clone().unwrap();
59+
let db = project_db.clone().unwrap();
6360
match project {
6461
Project::POSTGRESQL(project) => {
6562
let driver = &project.driver;

src/invoke.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ impl Display for Invoke {
3333
}
3434

3535
#[derive(Serialize, Deserialize)]
36-
pub struct InvokePostgresConnectionArgs {
37-
pub project: String,
38-
pub key: String,
36+
pub struct InvokePostgresConnectionArgs<'a> {
37+
pub project_name: &'a str,
38+
pub key: &'a str,
3939
}
4040

4141
#[derive(Serialize, Deserialize)]
42-
pub struct InvokeSchemaTablesArgs {
43-
pub project: String,
44-
pub schema: String,
42+
pub struct InvokeSchemaTablesArgs<'a> {
43+
pub project_name: &'a str,
44+
pub schema: &'a str,
4545
}
4646

4747
#[derive(Serialize, Deserialize)]

src/modals/connection.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use common::enums::Project;
1+
use common::{
2+
drivers::postgresql::Postgresql as PostgresqlDriver,
3+
enums::{Drivers, Project},
4+
projects::postgresql::Postgresql,
5+
};
26
use leptos::{html::*, *};
37
use thaw::{Modal, ModalFooter, ModalProps};
48

@@ -10,20 +14,21 @@ use crate::{
1014

1115
pub fn component(show: RwSignal<bool>) -> impl IntoView {
1216
let projects_store = use_context::<ProjectsStore>().unwrap();
17+
let (driver, _set_driver) = create_signal(Drivers::POSTGRESQL);
1318
let (project, set_project) = create_signal(String::new());
1419
let (db_user, set_db_user) = create_signal(String::new());
1520
let (db_password, set_db_password) = create_signal(String::new());
1621
let (db_host, set_db_host) = create_signal(String::new());
1722
let (db_port, set_db_port) = create_signal(String::new());
18-
let save_project = create_action(move |project_details: &Postgresql| {
23+
let save_project = create_action(move |project_details: &Project| {
1924
let project_details = project_details.clone();
2025
async move {
2126
let args = serde_wasm_bindgen::to_value(&InvokeInsertProjectArgs {
2227
project: project_details,
2328
})
2429
.unwrap();
2530
let project = invoke(&Invoke::insert_project.to_string(), args).await;
26-
let project = serde_wasm_bindgen::from_value::<(String, Project)>(project).unwrap();
31+
let project = serde_wasm_bindgen::from_value::<Project>(project).unwrap();
2732
projects_store.insert_project(project).unwrap();
2833
show.set(false);
2934
}
@@ -93,12 +98,12 @@ pub fn component(show: RwSignal<bool>) -> impl IntoView {
9398
|| db_port().is_empty()
9499
})
95100
.on(ev::click, move |_| {
96-
let project_details = Postgresql {
97-
name: project(),
98-
user: db_user(),
99-
password: db_password(),
100-
host: db_host(),
101-
port: db_port(),
101+
let project_details = match driver() {
102+
Drivers::POSTGRESQL => Project::POSTGRESQL(Postgresql {
103+
name: project(),
104+
driver: PostgresqlDriver::new(db_user(), db_password(), db_host(), db_port()),
105+
..Postgresql::default()
106+
}),
102107
};
103108
save_project.dispatch(project_details);
104109
}),

src/sidebar/index.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use common::enums::Project;
12
use leptos::{html::*, IntoView, *};
23
use leptos_use::{use_document, use_event_listener};
34

@@ -23,7 +24,7 @@ pub fn component() -> impl IntoView {
2324
move |_| async move {
2425
let args = serde_wasm_bindgen::to_value(&InvokeSelectProjectsArgs).unwrap_or_default();
2526
let projects = invoke(&Invoke::select_projects.to_string(), args).await;
26-
let projects = serde_wasm_bindgen::from_value::<Vec<Postgresql>>(projects).unwrap();
27+
let projects = serde_wasm_bindgen::from_value::<Vec<Project>>(projects).unwrap();
2728
projects_state.set_projects(projects).unwrap()
2829
},
2930
);

src/store/projects.rs

Lines changed: 104 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
use std::{borrow::Borrow, collections::BTreeMap};
1+
use std::collections::BTreeMap;
22

3-
use common::{enums::Project, utils::project_matcher};
3+
use common::{
4+
enums::{Project, ProjectConnectionStatus},
5+
utils::project_matcher,
6+
};
47
use leptos::{
58
create_rw_signal, error::Result, RwSignal, SignalGet, SignalGetUntracked, SignalUpdate,
69
};
@@ -27,7 +30,7 @@ impl ProjectsStore {
2730
pub fn set_projects(&self, projects: Vec<Project>) -> Result<BTreeMap<String, Project>> {
2831
let projects = projects
2932
.into_iter()
30-
.map(|project| project_matcher(project))
33+
.map(project_matcher)
3134
.collect::<BTreeMap<String, Project>>();
3235
self.0.update(|prev| {
3336
*prev = projects;
@@ -39,7 +42,6 @@ impl ProjectsStore {
3942
self.0.update(|prev| {
4043
let project = match project {
4144
Project::POSTGRESQL(project) => (project.name.clone(), Project::POSTGRESQL(project)),
42-
_ => unreachable!(),
4345
};
4446
prev.insert(project.0, project.1);
4547
});
@@ -52,77 +54,93 @@ impl ProjectsStore {
5254
Ok(projects)
5355
}
5456

55-
pub fn create_project_connection_string(&self, project_key: &str) -> String {
57+
pub fn create_project_connection_string(&self, project_name: &str) -> String {
5658
let projects = self.0.get_untracked();
57-
let (_, project) = projects.get_key_value(project_key).unwrap();
59+
let (_, project) = projects.get_key_value(project_name).unwrap();
5860

59-
format!(
60-
"user={} password={} host={} port={}",
61-
project.user, project.password, project.host, project.port,
62-
)
61+
match project {
62+
Project::POSTGRESQL(project) => {
63+
let driver = project.driver.clone();
64+
format!(
65+
"user={}:password={}:host={}:port={}",
66+
driver.user, driver.password, driver.host, driver.port,
67+
)
68+
}
69+
}
6370
}
6471

65-
pub async fn connect(&self, project: &str) -> Result<Vec<String>> {
72+
pub async fn connect(&self, project_name: &str) -> Result<Vec<String>> {
6673
let projects = self.0;
74+
let _projects = projects.get_untracked();
75+
let project = _projects.get(project_name).unwrap();
76+
77+
match project {
78+
Project::POSTGRESQL(project) => {
79+
if project.connection_status == ProjectConnectionStatus::Connected {
80+
return Ok(project.schmemas.clone().unwrap());
81+
}
6782

68-
if let Some(project) = projects.get_untracked().get(project) {
69-
if !project.schemas.is_empty() {
70-
return Ok(project.schemas.clone());
83+
let schemas = self.postgresql_schema_selector(&project.name).await?;
84+
projects.update(|prev| {
85+
let project = prev.get_mut(project_name).unwrap();
86+
match project {
87+
Project::POSTGRESQL(project) => {
88+
project.schmemas = Some(schemas.clone());
89+
project.connection_status = ProjectConnectionStatus::Connected;
90+
}
91+
}
92+
});
93+
Ok(schemas)
7194
}
7295
}
73-
74-
let connection_string = self.create_project_connection_string(project);
75-
let args = serde_wasm_bindgen::to_value(&InvokePostgresConnectionArgs {
76-
project: project.to_string(),
77-
key: connection_string,
78-
})
79-
.unwrap();
80-
let schemas = invoke(&Invoke::postgresql_connector.to_string(), args).await;
81-
let mut schemas = serde_wasm_bindgen::from_value::<Vec<String>>(schemas).unwrap();
82-
schemas.sort();
83-
projects.update(|prev| {
84-
let project = prev.get_mut(project).unwrap();
85-
project.schemas = schemas;
86-
project.status = ProjectConnectionStatus::Connected;
87-
});
88-
let schemas = self.0.get_untracked().get(project).unwrap().schemas.clone();
89-
Ok(schemas)
9096
}
9197

9298
pub async fn retrieve_tables(
9399
&self,
94-
project: &str,
100+
project_name: &str,
95101
schema: &str,
96102
) -> Result<Vec<(String, String)>> {
97103
let projects = self.0;
98-
let p = projects.borrow().get_untracked();
99-
let p = p.get(project).unwrap();
100-
if let Some(tables) = p.tables.get(schema) {
101-
if !tables.is_empty() {
102-
return Ok(tables.clone());
104+
let _projects = projects.get_untracked();
105+
let project = _projects.get(project_name).unwrap();
106+
107+
match project {
108+
Project::POSTGRESQL(project) => {
109+
if let Some(tables) = project.tables.as_ref().unwrap().get(schema) {
110+
if !tables.is_empty() {
111+
return Ok(tables.clone());
112+
}
113+
}
114+
115+
let tables = self
116+
.postgresql_table_selector(&project.name, schema)
117+
.await
118+
.unwrap();
119+
120+
projects.update(|prev| {
121+
let project = prev.get_mut(project_name).unwrap();
122+
match project {
123+
Project::POSTGRESQL(project) => {
124+
let _tables = project.tables.as_mut().unwrap();
125+
_tables.insert(schema.to_string(), tables.clone());
126+
project.tables = Some(_tables.clone());
127+
}
128+
}
129+
});
130+
131+
let schemas = self.postgresql_schema_selector(&project.name).await?;
132+
projects.update(|prev| {
133+
let project = prev.get_mut(project_name).unwrap();
134+
match project {
135+
Project::POSTGRESQL(project) => {
136+
project.schmemas = Some(schemas.clone());
137+
}
138+
}
139+
});
140+
141+
Ok(tables)
103142
}
104143
}
105-
let args = serde_wasm_bindgen::to_value(&InvokeSchemaTablesArgs {
106-
project: project.to_string(),
107-
schema: schema.to_string(),
108-
})
109-
.unwrap();
110-
let tables = invoke(&Invoke::select_schema_tables.to_string(), args).await;
111-
let tables = serde_wasm_bindgen::from_value::<Vec<(String, String)>>(tables).unwrap();
112-
projects.update(|prev| {
113-
let project = prev.get_mut(project).unwrap();
114-
project.tables.insert(schema.to_string(), tables.clone());
115-
});
116-
let tables = self
117-
.0
118-
.get_untracked()
119-
.get(project)
120-
.unwrap()
121-
.tables
122-
.get(schema)
123-
.unwrap()
124-
.clone();
125-
Ok(tables)
126144
}
127145

128146
pub async fn delete_project(&self, project: &str) -> Result<()> {
@@ -137,4 +155,32 @@ impl ProjectsStore {
137155
});
138156
Ok(())
139157
}
158+
159+
async fn postgresql_schema_selector(&self, project_name: &str) -> Result<Vec<String>> {
160+
let connection_string = self.create_project_connection_string(project_name);
161+
let args = serde_wasm_bindgen::to_value(&InvokePostgresConnectionArgs {
162+
project_name,
163+
key: &connection_string,
164+
})
165+
.unwrap();
166+
let schemas = invoke(&Invoke::postgresql_connector.to_string(), args).await;
167+
let mut schemas = serde_wasm_bindgen::from_value::<Vec<String>>(schemas).unwrap();
168+
schemas.sort();
169+
Ok(schemas)
170+
}
171+
172+
async fn postgresql_table_selector(
173+
&self,
174+
project_name: &str,
175+
schema: &str,
176+
) -> Result<Vec<(String, String)>> {
177+
let args = serde_wasm_bindgen::to_value(&InvokeSchemaTablesArgs {
178+
project_name,
179+
schema,
180+
})
181+
.unwrap();
182+
let tables = invoke(&Invoke::select_schema_tables.to_string(), args).await;
183+
let tables = serde_wasm_bindgen::from_value::<Vec<(String, String)>>(tables).unwrap();
184+
Ok(tables)
185+
}
140186
}

0 commit comments

Comments
 (0)