From 39233e9447996865762155fb614565e75acc1c81 Mon Sep 17 00:00:00 2001 From: dvdsk Date: Wed, 13 Jul 2022 23:50:10 +0200 Subject: [PATCH] fixes #6 adding the size of the attached file --- Cargo.toml | 1 + src/endpoints/create.rs | 13 +++++++++---- src/pasta.rs | 8 +++++++- src/util/misc.rs | 23 ++++++++++------------- templates/pasta.html | 6 +++--- templates/pastalist.html | 4 ++-- 6 files changed, 32 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d76653c..302557f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ actix-web="4" actix-files="0.6.0" serde={ version = "1.0", features = ["derive"] } serde_json = "1.0.80" +bytesize = { version = "1.1", features = ["serde"] } askama="0.10" askama-filters={ version = "0.1.3", features = ["chrono"] } chrono="0.4.19" diff --git a/src/endpoints/create.rs b/src/endpoints/create.rs index 1cbc20d..a3c4fe4 100644 --- a/src/endpoints/create.rs +++ b/src/endpoints/create.rs @@ -1,10 +1,12 @@ use crate::dbio::save_to_file; +use crate::pasta::PastaFile; use crate::util::animalnumbers::to_animal_names; use crate::util::misc::is_valid_url; use crate::{AppState, Pasta, ARGS}; use actix_multipart::Multipart; use actix_web::{get, web, Error, HttpResponse, Responder}; use askama::Template; +use bytesize::ByteSize; use futures::TryStreamExt; use rand::Rng; use std::io::Write; @@ -46,7 +48,7 @@ pub async fn create( let mut new_pasta = Pasta { id: rand::thread_rng().gen::() as u64, content: String::from("No Text Content"), - file: String::from("no-file"), + file: None, extension: String::from(""), private: false, editable: false, @@ -115,15 +117,18 @@ pub async fn create( .unwrap(); let filepath = format!("./pasta_data/{}/{}", &new_pasta.id_as_animals(), &filename); - - new_pasta.file = filename; - let mut f = web::block(|| std::fs::File::create(filepath)).await??; + let mut size = 0; while let Some(chunk) = field.try_next().await? { + size += chunk.len(); f = web::block(move || f.write_all(&chunk).map(|_| f)).await??; } + new_pasta.file = Some(PastaFile { + name: filename, + size: ByteSize::b(size as u64), + }); new_pasta.pasta_type = String::from("text"); } _ => {} diff --git a/src/pasta.rs b/src/pasta.rs index 66cd342..b58f395 100644 --- a/src/pasta.rs +++ b/src/pasta.rs @@ -2,15 +2,21 @@ use std::fmt; use chrono::{DateTime, Datelike, NaiveDateTime, Timelike, Utc}; use serde::{Deserialize, Serialize}; +use bytesize::ByteSize; use crate::util::animalnumbers::to_animal_names; use crate::util::syntaxhighlighter::html_highlight; +#[derive(Serialize, Deserialize, PartialEq, Eq)] +pub struct PastaFile { + pub name: String, pub size: ByteSize , +} + #[derive(Serialize, Deserialize)] pub struct Pasta { pub id: u64, pub content: String, - pub file: String, + pub file: Option, pub extension: String, pub private: bool, pub editable: bool, diff --git a/src/util/misc.rs b/src/util/misc.rs index 449f97f..1d326ba 100644 --- a/src/util/misc.rs +++ b/src/util/misc.rs @@ -3,7 +3,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use linkify::{LinkFinder, LinkKind}; use std::fs; -use crate::{dbio, Pasta}; +use crate::{dbio, pasta::PastaFile, Pasta}; pub fn remove_expired(pastas: &mut Vec) { // get current time - this will be needed to check which pastas have expired @@ -22,20 +22,17 @@ pub fn remove_expired(pastas: &mut Vec) { true } else { // remove the file itself - match fs::remove_file(format!("./pasta_data/{}/{}", p.id_as_animals(), p.file)) { - Ok(_) => {} - Err(_) => { - log::error!("Failed to delete file {}!", p.file) + if let Some(PastaFile { name, .. }) = &p.file { + if fs::remove_file(format!("./pasta_data/{}/{}", p.id_as_animals(), name)).is_err() + { + log::error!("Failed to delete file {}!", name) + } + + // and remove the containing directory + if fs::remove_dir(format!("./pasta_data/{}/", p.id_as_animals())).is_err() { + log::error!("Failed to delete directory {}!", name) } } - // and remove the containing directory - match fs::remove_dir(format!("./pasta_data/{}/", p.id_as_animals())) { - Ok(_) => {} - Err(_) => { - log::error!("Failed to delete directory {}!", p.file) - } - } - // remove false } }); diff --git a/templates/pasta.html b/templates/pasta.html index f868520..a3eee04 100644 --- a/templates/pasta.html +++ b/templates/pasta.html @@ -1,8 +1,8 @@ {% include "header.html" %} Raw Text Content -{% if pasta.file != "no-file" %} -Attached file - '{{pasta.file}}' +{% if pasta.file.is_some() %} +Attached file + '{{pasta.file.as_ref().unwrap().name}}' [{{pasta.file.as_ref().unwrap().size}}] {%- endif %} {% if pasta.editable %} Edit diff --git a/templates/pastalist.html b/templates/pastalist.html index fd48207..6f6dd37 100644 --- a/templates/pastalist.html +++ b/templates/pastalist.html @@ -48,8 +48,8 @@ Raw - {% if pasta.file != "no-file" %} - File + {% if pasta.file.is_some() %} + File {%- endif %} {% if pasta.editable %} Edit