Skip to content

Commit 620b8fb

Browse files
feat: add working forms
1 parent ddf9e11 commit 620b8fb

48 files changed

Lines changed: 1589 additions & 260 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ node_modules
66
/.svelte-kit
77
/build
88
coverage
9+
utils/fake-data*
910

1011
# OS
1112
.DS_Store

episko_gui_backend/src/commands.rs

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,67 @@
1+
use serde::Serialize;
12
use std::path::Path;
23
use tokio::sync::Mutex;
34
use uuid::Uuid;
45

56
use episko_lib::{
7+
database::retrieve_metadata::Pagination,
68
files::File,
7-
metadata::{Metadata, metadata_handler::MetadataHandler},
9+
metadata::{Metadata, MetadataPreview, metadata_handler::MetadataHandler},
810
};
911

1012
use crate::{AppState, Error, model::MetadataDco, model::MetadataDto};
1113

14+
static PAGE_SIZE: u32 = 10;
15+
16+
#[derive(Serialize, Debug)]
17+
pub struct PagedData<T> {
18+
total_size: u32,
19+
page_size: u32,
20+
page_number: u32,
21+
data: Vec<T>,
22+
}
23+
1224
#[tauri::command]
13-
pub async fn get_all(state: tauri::State<'_, Mutex<AppState>>) -> Result<Vec<MetadataDto>, Error> {
25+
pub async fn init_cache(state: tauri::State<'_, Mutex<AppState>>) -> Result<(), Error> {
1426
let state = state.lock().await;
1527

16-
let projects = Metadata::all_from_db(&state.db)
17-
.await?
18-
.into_iter()
19-
.map(Into::into)
20-
.collect();
28+
let files = state.config_handler.files();
29+
for file in files {
30+
Metadata::from_file(file)?.write_to_db(&state.db).await?;
31+
}
2132

22-
Ok(projects)
33+
let dirs = state.config_handler.dirs();
34+
for dir in dirs {
35+
let files = MetadataHandler::search_directory(dir)?;
36+
for file in &files {
37+
Metadata::from_file(file)?.write_to_db(&state.db).await?;
38+
}
39+
}
40+
41+
Ok(())
42+
}
43+
44+
#[tauri::command]
45+
pub async fn get_all(
46+
page_number: u32,
47+
query: Option<String>,
48+
state: tauri::State<'_, Mutex<AppState>>,
49+
) -> Result<PagedData<MetadataPreview>, Error> {
50+
let state = state.lock().await;
51+
52+
let projects = Metadata::all_preview_from_db(
53+
Some(Pagination::new(page_number, PAGE_SIZE)),
54+
query.clone(),
55+
&state.db,
56+
)
57+
.await?;
58+
59+
Ok(PagedData {
60+
total_size: Metadata::amount_cached(query, &state.db).await?,
61+
page_size: PAGE_SIZE,
62+
page_number,
63+
data: projects,
64+
})
2365
}
2466

2567
#[tauri::command]
@@ -44,18 +86,18 @@ pub async fn update_metadata(
4486

4587
let metadata = updated.update(metadata)?;
4688

47-
metadata.write_to_db(&state.db).await?;
89+
metadata.update_in_db(&state.db).await?;
4890
metadata.write_file(&metadata.directory)?;
4991

5092
Ok(metadata.into())
5193
}
5294

5395
#[tauri::command]
5496
pub async fn create_metadata(
55-
new: MetadataDco,
97+
created: MetadataDco,
5698
state: tauri::State<'_, Mutex<AppState>>,
57-
) -> Result<MetadataDto, Error> {
58-
let metadata = new.create()?;
99+
) -> Result<Uuid, Error> {
100+
let metadata = created.create()?;
59101

60102
let mut state = state.lock().await;
61103

@@ -66,7 +108,7 @@ pub async fn create_metadata(
66108
state.config_handler.add_saved_file(&metadata.directory);
67109
state.config_handler.save_config()?;
68110

69-
Ok(metadata.into())
111+
Ok(metadata.id)
70112
}
71113

72114
#[tauri::command]

episko_gui_backend/src/lib.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,15 @@
33
use episko_lib::{
44
config::ConfigHandler,
55
database::DatabaseHandler,
6-
files::File as _,
7-
metadata::{
8-
Metadata,
9-
metadata_handler::MetadataHandler,
10-
},
116
};
127
use state::AppState;
138
use tauri::Manager;
149
use tokio::sync::Mutex;
1510

1611
mod commands;
1712
use commands::{
18-
create_metadata, get_all, get_with_id, load_from_directory, load_from_file, update_metadata,
13+
create_metadata, get_all, get_with_id, init_cache, load_from_directory, load_from_file,
14+
update_metadata,
1915
};
2016

2117
pub mod model;
@@ -35,19 +31,6 @@ pub async fn run() -> Result<(), Box<dyn std::error::Error>> {
3531

3632
let db = DatabaseHandler::with_config(config_handler.config()).await?;
3733

38-
let files = config_handler.files();
39-
for file in files {
40-
Metadata::from_file(file)?.write_to_db(&db).await?;
41-
}
42-
43-
let dirs = config_handler.dirs();
44-
for dir in dirs {
45-
let files = MetadataHandler::search_directory(dir)?;
46-
for file in &files {
47-
Metadata::from_file(file)?.write_to_db(&db).await?;
48-
}
49-
}
50-
5134
tauri::async_runtime::set(tokio::runtime::Handle::current());
5235

5336
tauri::Builder::default()
@@ -58,6 +41,7 @@ pub async fn run() -> Result<(), Box<dyn std::error::Error>> {
5841
})
5942
.plugin(tauri_plugin_shell::init())
6043
.invoke_handler(tauri::generate_handler![
44+
init_cache,
6145
get_all,
6246
get_with_id,
6347
update_metadata,

episko_gui_backend/src/model/dco.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use episko_lib::{
2+
metadata::{
3+
property::Property, BuildSystem, Category, Ide, Language, Metadata, MetadataBuilder,
4+
},
25
ApplyIf as _,
3-
metadata::{BuildSystem, Category, Ide, Language, Metadata, MetadataBuilder},
46
};
57
use serde::{Deserialize, Serialize};
68
use std::path::PathBuf;
@@ -26,7 +28,12 @@ impl MetadataDco {
2628
///
2729
/// # Errors
2830
/// !TODO!
29-
pub fn create(self) -> Result<Metadata, Error> {
31+
pub fn create(mut self) -> Result<Metadata, Error> {
32+
self.categories.iter_mut().for_each(Property::update_id);
33+
self.build_systems.iter_mut().for_each(Property::update_id);
34+
self.languages.iter_mut().for_each(Property::update_id);
35+
self.preffered_ide.iter_mut().for_each(Property::update_id);
36+
3037
Ok(Metadata::builder()
3138
.directory_path(&self.directory)
3239
.title(&self.title)
@@ -46,7 +53,12 @@ impl MetadataDco {
4653
///
4754
/// # Errors
4855
/// !TODO!
49-
pub fn update(self, metadata: Metadata) -> Result<Metadata, Error> {
56+
pub fn update(mut self, metadata: Metadata) -> Result<Metadata, Error> {
57+
self.categories.iter_mut().for_each(Property::update_id);
58+
self.build_systems.iter_mut().for_each(Property::update_id);
59+
self.languages.iter_mut().for_each(Property::update_id);
60+
self.preffered_ide.iter_mut().for_each(Property::update_id);
61+
5062
Ok(metadata
5163
.update()
5264
.directory_path(&self.directory)
@@ -68,7 +80,7 @@ impl MetadataDco {
6880
mod tests {
6981
use super::*;
7082
use episko_lib::metadata::{
71-
BuildSystem, Category, Ide, Language, Metadata, property::Property as _,
83+
property::Property as _, BuildSystem, Category, Ide, Language, Metadata,
7284
};
7385
use std::path::PathBuf;
7486

episko_gui_backend/src/model/dto.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ mod tests {
4747
use super::*;
4848
use chrono::Utc;
4949
use episko_lib::metadata::{
50-
BuildSystem, Category, Ide, Language, Metadata, property::Property as _,
50+
property::Property as _, BuildSystem, Category, Ide, Language, Metadata,
5151
};
5252
use uuid::Uuid;
5353

episko_lib/src/database.rs

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,22 +78,89 @@ pub enum Error {
7878
}
7979

8080
#[cfg(test)]
81-
pub async fn setup_db() -> DatabaseHandler {
82-
use sqlx::migrate::Migrator;
83-
static MIGRATOR: Migrator = sqlx::migrate!();
81+
pub mod db_test {
82+
use std::collections::HashSet;
8483

85-
let db = DatabaseHandler::new("sqlite://").await.unwrap();
86-
MIGRATOR.run(db.conn()).await.unwrap();
84+
use super::*;
85+
use crate::{
86+
ApplyIf as _,
87+
metadata::{Metadata, property::Property as _, *},
88+
};
89+
use chrono::{TimeDelta, Utc};
90+
91+
pub async fn fill_db(amount: usize, db: &DatabaseHandler) {
92+
let test_data = generate_test_metadata(amount);
93+
94+
for el in test_data {
95+
el.write_to_db(db).await.expect("writing test data");
96+
}
97+
}
98+
99+
pub fn generate_test_metadata(count: usize) -> Vec<Metadata> {
100+
let base_time = Utc::now();
101+
let ides = ["VSCode", "IntelliJ", "Sublime", "Vim"];
102+
let categories = ["Web", "CLI", "GUI", "Embedded", "AI"];
103+
let languages = ["Rust", "Python", "JavaScript", "Go", "C++"];
104+
let build_systems = ["Cargo", "Make", "CMake", "NPM", "Bazel"];
105+
106+
(0..count)
107+
.map(|i| {
108+
let offset = TimeDelta::try_days(i as i64).unwrap();
109+
110+
Metadata::builder()
111+
.title(&format!("Test Project {}", i + 1))
112+
.directory(".")
113+
.apply_if(
114+
Some(categories[i % categories.len()]),
115+
MetadataBuilder::add_category,
116+
)
117+
.add_language(Language::with_version(
118+
languages[i % languages.len()],
119+
&format!("1.{}", i),
120+
))
121+
.apply_if(
122+
(i % 2 == 0).then_some(Ide::new(ides[i % ides.len()])),
123+
MetadataBuilder::preffered_ide,
124+
)
125+
.add_build_system(BuildSystem::with_version(
126+
build_systems[i % build_systems.len()],
127+
&format!("2.{}", i),
128+
))
129+
.apply_if(
130+
(i % 3 == 0).then_some("Sample description"),
131+
MetadataBuilder::description,
132+
)
133+
.apply_if(
134+
(i % 4 == 0).then_some("https://github.com/example/project"),
135+
MetadataBuilder::repository_url,
136+
)
137+
.created(base_time - offset)
138+
.updated(base_time)
139+
.build()
140+
.expect("Should generate valid metadata")
141+
})
142+
.collect()
143+
}
87144

88-
db
145+
#[test]
146+
fn test_generated_metadata() {
147+
let test_data = generate_test_metadata(5);
148+
assert_eq!(test_data.len(), 5);
149+
150+
let ids: HashSet<Uuid> = test_data.iter().map(|m| m.id).collect();
151+
assert_eq!(ids.len(), 5);
152+
}
89153
}
90154

91155
#[cfg(test)]
92156
mod test {
93-
use super::*;
157+
use sqlx::SqlitePool;
158+
159+
use crate::database::{DatabaseHandler, db_test::fill_db};
94160

95-
#[tokio::test]
96-
async fn setup_test_db() {
97-
setup_db().await;
161+
#[sqlx::test]
162+
async fn setup_test_db(conn: SqlitePool) {
163+
let db = DatabaseHandler::with_conn(conn);
164+
fill_db(25, &db).await;
98165
}
99166
}

0 commit comments

Comments
 (0)