diesel working
This commit is contained in:
@ -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
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 {},
|
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");
|
||||||
|
|
||||||
|
|||||||
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 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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user