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")]
use httpserver::DB;
#[cfg(feature = "server")]
use httpserver::models::GetFile;
#[cfg(feature = "server")]
use httpserver::schema;
@ -37,10 +39,10 @@ async fn download_file(id: String) -> Result<FileStream, HttpError> {
use schema::file;
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::deleted.eq(false))
.load::<String>(&mut pool.get().unwrap()));
.load(&mut pool.get().unwrap()));
if let Err(_) = result {
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);
// 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 {
Ok(stream) => {
DB.with(|pool| diesel::update(&db_file[0]).set(file::downloads.eq(file::downloads + 1))
.execute(&mut pool.get().unwrap()));
Ok(stream)
},
Err(err) => {

View File

@ -22,16 +22,17 @@ struct FetchedInfo {
filename: String,
size: i64,
created_at: DateTime<Utc>,
downloads: i64,
deleted: bool
}
#[get("/api/upload/info?filename")]
async fn get_file_info(filename: String) -> Result<FetchedInfo, HttpError> {
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::deleted.eq(false))
.load::<(String, i64, SystemTime)>(&mut pool.get().unwrap()));
.load::<(String, i64, SystemTime, i64, bool)>(&mut pool.get().unwrap()));
if let Err(_) = result {
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];
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 {
@ -55,6 +56,11 @@ fn show_file_info(file_id: String, file_info: &FetchedInfo) -> Element {
p { "File name : {file_info.filename}" }
p { "This file was uploaded on the {creation_date}" }
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 {
class: "height-20px text-blue-800 underline",
rel: "noopener noreferrer",
@ -65,6 +71,7 @@ fn show_file_info(file_id: String, file_info: &FetchedInfo) -> Element {
}
}
}
}
#[component]
pub fn FileInfo(file: String) -> Element {