diesel working
This commit is contained in:
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
33
src/lib.rs
Normal file
33
src/lib.rs
Normal 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))
|
||||
};
|
||||
}
|
||||
@ -17,6 +17,7 @@ enum Route {
|
||||
Upload {},
|
||||
}
|
||||
|
||||
|
||||
const FAVICON: Asset = asset!("/assets/favicon.ico");
|
||||
const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css");
|
||||
|
||||
|
||||
3
src/models/mod.rs
Normal file
3
src/models/mod.rs
Normal file
@ -0,0 +1,3 @@
|
||||
mod t_file;
|
||||
|
||||
pub use crate::models::t_file::{GetFile, NewFile};
|
||||
26
src/models/t_file.rs
Normal file
26
src/models/t_file.rs
Normal 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
15
src/schema.rs
Normal 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,
|
||||
}
|
||||
}
|
||||
@ -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<String, HttpError> {
|
||||
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<String, HttpError> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user