show deleted file info and add download count
All checks were successful
build docker container automatically / build (push) Successful in 3m25s

This commit is contained in:
2026-04-22 17:45:36 +02:00
parent 90c9db4f89
commit 026af42b56
2 changed files with 23 additions and 12 deletions

View File

@ -6,6 +6,8 @@ use diesel::prelude::*;
#[cfg(feature = "server")] #[cfg(feature = "server")]
use httpserver::DB; use httpserver::DB;
#[cfg(feature = "server")]
use httpserver::models::GetFile;
#[cfg(feature = "server")] #[cfg(feature = "server")]
use httpserver::schema; use httpserver::schema;
@ -37,10 +39,10 @@ async fn download_file(id: String) -> Result<FileStream, HttpError> {
use schema::file; use schema::file;
let s_config = ServerConfig::load(); let s_config = ServerConfig::load();
let result = DB.with(|pool| schema::file::table.select(file::filename) let result = DB.with(|pool| GetFile::query()
.filter(file::stored_filename.eq(id.clone())) .filter(file::stored_filename.eq(id.clone()))
.filter(file::deleted.eq(false)) .filter(file::deleted.eq(false))
.load::<String>(&mut pool.get().unwrap())); .load(&mut pool.get().unwrap()));
if let Err(_) = result { if let Err(_) = result {
return HttpError::internal_server_error("Database request failed"); return HttpError::internal_server_error("Database request failed");
@ -56,10 +58,12 @@ async fn download_file(id: String) -> Result<FileStream, HttpError> {
let path = Path::new(&file_path); let path = Path::new(&file_path);
// create a filestream from raw to set the filename to the uploaded filename // create a filestream from raw to set the filename to the uploaded filename
let fstream = create_filestream(db_file[0].clone(), path.into()).await; let fstream = create_filestream(db_file[0].filename.clone(), path.into()).await;
match fstream { match fstream {
Ok(stream) => { Ok(stream) => {
DB.with(|pool| diesel::update(&db_file[0]).set(file::downloads.eq(file::downloads + 1))
.execute(&mut pool.get().unwrap()));
Ok(stream) Ok(stream)
}, },
Err(err) => { Err(err) => {

View File

@ -22,16 +22,17 @@ struct FetchedInfo {
filename: String, filename: String,
size: i64, size: i64,
created_at: DateTime<Utc>, created_at: DateTime<Utc>,
downloads: i64,
deleted: bool
} }
#[get("/api/upload/info?filename")] #[get("/api/upload/info?filename")]
async fn get_file_info(filename: String) -> Result<FetchedInfo, HttpError> { async fn get_file_info(filename: String) -> Result<FetchedInfo, HttpError> {
use schema::file; use schema::file;
let result = DB.with(|pool| schema::file::table.select((file::filename, file::file_size, file::created_at)) let result = DB.with(|pool| schema::file::table.select((file::filename, file::file_size, file::created_at, file::downloads, file::deleted))
.filter(file::stored_filename.eq(filename)) .filter(file::stored_filename.eq(filename))
.filter(file::deleted.eq(false)) .load::<(String, i64, SystemTime, i64, bool)>(&mut pool.get().unwrap()));
.load::<(String, i64, SystemTime)>(&mut pool.get().unwrap()));
if let Err(_) = result { if let Err(_) = result {
return HttpError::internal_server_error("Database request failed"); return HttpError::internal_server_error("Database request failed");
@ -43,7 +44,7 @@ async fn get_file_info(filename: String) -> Result<FetchedInfo, HttpError> {
let db_file = &db_file[0]; let db_file = &db_file[0];
Ok(FetchedInfo { filename: db_file.0.clone(), size: db_file.1, created_at: db_file.2.into()}) Ok(FetchedInfo { filename: db_file.0.clone(), size: db_file.1, created_at: db_file.2.into(), downloads: db_file.3, deleted: db_file.4})
} }
fn show_file_info(file_id: String, file_info: &FetchedInfo) -> Element { fn show_file_info(file_id: String, file_info: &FetchedInfo) -> Element {
@ -55,6 +56,11 @@ fn show_file_info(file_id: String, file_info: &FetchedInfo) -> Element {
p { "File name : {file_info.filename}" } p { "File name : {file_info.filename}" }
p { "This file was uploaded on the {creation_date}" } p { "This file was uploaded on the {creation_date}" }
p { "File size : {byte_to_human_size(file_info.size.try_into().unwrap())}" } p { "File size : {byte_to_human_size(file_info.size.try_into().unwrap())}" }
p { "This file was downloaded {file_info.downloads} times "}
if file_info.deleted {
p { "This was deleted" }
}
else {
a { a {
class: "height-20px text-blue-800 underline", class: "height-20px text-blue-800 underline",
rel: "noopener noreferrer", rel: "noopener noreferrer",
@ -64,6 +70,7 @@ fn show_file_info(file_id: String, file_info: &FetchedInfo) -> Element {
} }
} }
} }
}
} }
#[component] #[component]