From 5a37834d4ed2d3c38878e036c81e990e91b11b46 Mon Sep 17 00:00:00 2001 From: tomoron Date: Sun, 12 Apr 2026 19:39:57 +0200 Subject: [PATCH] diesel working --- src/config.rs | 10 ++++++---- src/lib.rs | 33 +++++++++++++++++++++++++++++++++ src/main.rs | 1 + src/models/file.rs | 0 src/models/mod.rs | 3 +++ src/models/t_file.rs | 26 ++++++++++++++++++++++++++ src/schema.rs | 15 +++++++++++++++ src/views/upload.rs | 23 ++++++++++++++++++++++- 8 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 src/lib.rs delete mode 100644 src/models/file.rs create mode 100644 src/models/mod.rs create mode 100644 src/models/t_file.rs create mode 100644 src/schema.rs diff --git a/src/config.rs b/src/config.rs index 82e7dbb..4abf866 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,25 +1,27 @@ #[cfg(feature = "server")] pub struct ServerConfig { pub upload_folder: String, + pub db_url: String, } #[cfg(feature = "server")] impl ServerConfig { pub fn load() -> Self { Self { - upload_folder: "./test/".to_string() + upload_folder: "./test/".to_string(), + db_url: std::env::var("DATABASE_URL").expect("missing DATABASE_URL"), } } } pub struct ClientConfig { - pub upload_max_size: usize + pub upload_max_size: usize, } impl ClientConfig { - pub fn load () -> Self { + pub fn load() -> Self { Self { - upload_max_size: 1024 * 1024 * 1024 * 1 //1GB for testing + upload_max_size: 1024 * 1024 * 1024 * 1, //1GB for testing } } } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..f1d74a1 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,33 @@ +#[cfg(feature = "server")] +use diesel::pg::PgConnection; +#[cfg(feature = "server")] +use diesel::prelude::*; + +pub mod config; + +#[cfg(feature = "server")] +use crate::config::ServerConfig; + +#[cfg(feature = "server")] +pub mod models; + +#[cfg(feature = "server")] +pub mod schema; + +#[cfg(feature = "server")] +use diesel::r2d2::{ConnectionManager, Pool}; +#[cfg(feature = "server")] +use diesel::result::Error; + +#[cfg(feature = "server")] +thread_local! { + pub static DB: diesel::r2d2::Pool> = { + let s_config = ServerConfig::load(); + let db_url = s_config.db_url.clone(); + + let manager = ConnectionManager::::new(&db_url); + diesel::r2d2::Pool::builder() + .build(manager) + .unwrap_or_else(|_| panic!("Error creating pool for {}", db_url)) + }; +} diff --git a/src/main.rs b/src/main.rs index 0ff363a..9eef16e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,7 @@ enum Route { Upload {}, } + const FAVICON: Asset = asset!("/assets/favicon.ico"); const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); diff --git a/src/models/file.rs b/src/models/file.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..3faa1ae --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1,3 @@ +mod t_file; + +pub use crate::models::t_file::{GetFile, NewFile}; diff --git a/src/models/t_file.rs b/src/models/t_file.rs new file mode 100644 index 0000000..8cc61ea --- /dev/null +++ b/src/models/t_file.rs @@ -0,0 +1,26 @@ +use std::time::SystemTime; + +use diesel::prelude::*; + +use crate::schema::file; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = file)] +#[diesel(check_for_backend(diesel::pg::Pg))] +pub struct GetFile { + pub id: i64, + pub created_at: SystemTime, + pub downloads: i64, + pub filename: String, + pub file_size: i64, + pub stored_filename: String, + pub deleted: bool, +} + +#[derive(Insertable)] +#[diesel(table_name = file)] +pub struct NewFile<'a> { + pub filename: &'a str, + pub stored_filename: &'a str, + pub file_size: &'a i64, +} diff --git a/src/schema.rs b/src/schema.rs new file mode 100644 index 0000000..2387d05 --- /dev/null +++ b/src/schema.rs @@ -0,0 +1,15 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + file (id) { + id -> Int8, + created_at -> Timestamp, + downloads -> Int8, + #[max_length = 255] + filename -> Varchar, + file_size -> Int8, + #[max_length = 30] + stored_filename -> Varchar, + deleted -> Bool, + } +} diff --git a/src/views/upload.rs b/src/views/upload.rs index d3bec58..8ace0f2 100644 --- a/src/views/upload.rs +++ b/src/views/upload.rs @@ -15,6 +15,17 @@ use std::fs::File; use std::io::Write; use futures::StreamExt; + + +#[cfg(feature = "server")] +use httpserver::models::{GetFile,NewFile}; +#[cfg(feature = "server")] +use diesel::prelude::*; +#[cfg(feature = "server")] +use httpserver::DB; + + + use dioxus_primitives::toast::{ ToastOptions, consume_toast @@ -36,6 +47,7 @@ pub fn byte_to_human_size(size: u64) -> String { #[post("/api/upload")] async fn upload_file(mut upload: FileStream) -> Result { + use httpserver::schema::file; let s_config = ServerConfig::load(); let c_config = ClientConfig::load(); @@ -82,7 +94,16 @@ async fn upload_file(mut upload: FileStream) -> Result { fs::remove_file(s_config.upload_folder.clone() + &filename); HttpError::internal_server_error(err)? } - None => { Ok(filename) } + None => { + let new_file = NewFile{filename: upload.file_name(), file_size: &(total_len as i64), stored_filename: &filename}; + + DB.with(|pool| diesel::insert_into(file::table) + .values(&new_file) + .returning(GetFile::as_returning()) + .get_result(&mut pool.get().unwrap()) + .expect("Failed to save the file in db")); + Ok(filename) + } } }