diesel working

This commit is contained in:
2026-04-12 19:39:57 +02:00
parent 23ccd3f793
commit 5a37834d4e
8 changed files with 106 additions and 5 deletions

View File

@ -1,25 +1,27 @@
#[cfg(feature = "server")] #[cfg(feature = "server")]
pub struct ServerConfig { pub struct ServerConfig {
pub upload_folder: String, pub upload_folder: String,
pub db_url: String,
} }
#[cfg(feature = "server")] #[cfg(feature = "server")]
impl ServerConfig { impl ServerConfig {
pub fn load() -> Self { pub fn load() -> Self {
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 struct ClientConfig {
pub upload_max_size: usize pub upload_max_size: usize,
} }
impl ClientConfig { impl ClientConfig {
pub fn load () -> Self { pub fn load() -> Self {
Self { Self {
upload_max_size: 1024 * 1024 * 1024 * 1 //1GB for testing upload_max_size: 1024 * 1024 * 1024 * 1, //1GB for testing
} }
} }
} }

33
src/lib.rs Normal file
View File

@ -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<ConnectionManager<PgConnection>> = {
let s_config = ServerConfig::load();
let db_url = s_config.db_url.clone();
let manager = ConnectionManager::<PgConnection>::new(&db_url);
diesel::r2d2::Pool::builder()
.build(manager)
.unwrap_or_else(|_| panic!("Error creating pool for {}", db_url))
};
}

View File

@ -17,6 +17,7 @@ enum Route {
Upload {}, Upload {},
} }
const FAVICON: Asset = asset!("/assets/favicon.ico"); const FAVICON: Asset = asset!("/assets/favicon.ico");
const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css");

View File

3
src/models/mod.rs Normal file
View File

@ -0,0 +1,3 @@
mod t_file;
pub use crate::models::t_file::{GetFile, NewFile};

26
src/models/t_file.rs Normal file
View File

@ -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,
}

15
src/schema.rs Normal file
View File

@ -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,
}
}

View File

@ -15,6 +15,17 @@ use std::fs::File;
use std::io::Write; use std::io::Write;
use futures::StreamExt; 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::{ use dioxus_primitives::toast::{
ToastOptions, ToastOptions,
consume_toast consume_toast
@ -36,6 +47,7 @@ pub fn byte_to_human_size(size: u64) -> String {
#[post("/api/upload")] #[post("/api/upload")]
async fn upload_file(mut upload: FileStream) -> Result<String, HttpError> { async fn upload_file(mut upload: FileStream) -> Result<String, HttpError> {
use httpserver::schema::file;
let s_config = ServerConfig::load(); let s_config = ServerConfig::load();
let c_config = ClientConfig::load(); let c_config = ClientConfig::load();
@ -82,7 +94,16 @@ async fn upload_file(mut upload: FileStream) -> Result<String, HttpError> {
fs::remove_file(s_config.upload_folder.clone() + &filename); fs::remove_file(s_config.upload_folder.clone() + &filename);
HttpError::internal_server_error(err)? 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)
}
} }
} }