refactor(paste): associate directories with the paste types

This commit is contained in:
orhun 2021-08-26 21:09:33 +03:00
parent 47f6ff57bd
commit 3223c6379c
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
3 changed files with 32 additions and 10 deletions

View file

@ -1,6 +1,7 @@
use actix_web::middleware::Logger; use actix_web::middleware::Logger;
use actix_web::{App, HttpServer}; use actix_web::{App, HttpServer};
use rustypaste::config::Config; use rustypaste::config::Config;
use rustypaste::paste::PasteType;
use rustypaste::server; use rustypaste::server;
use std::env; use std::env;
use std::fs; use std::fs;
@ -14,7 +15,7 @@ async fn main() -> IoResult<()> {
.expect("failed to parse config"); .expect("failed to parse config");
let server_config = config.server.clone(); let server_config = config.server.clone();
fs::create_dir_all(&server_config.upload_path)?; fs::create_dir_all(&server_config.upload_path)?;
fs::create_dir_all(&server_config.upload_path.join("url"))?; fs::create_dir_all(PasteType::Url.get_path(&server_config.upload_path))?;
let mut http_server = HttpServer::new(move || { let mut http_server = HttpServer::new(move || {
App::new() App::new()
.data(config.clone()) .data(config.clone())

View file

@ -3,7 +3,7 @@ use crate::header::ContentDisposition;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::{Error as IoError, ErrorKind as IoErrorKind, Result as IoResult, Write}; use std::io::{Error as IoError, ErrorKind as IoErrorKind, Result as IoResult, Write};
use std::path::PathBuf; use std::path::{Path, PathBuf};
use std::str; use std::str;
use url::Url; use url::Url;
@ -29,6 +29,21 @@ impl<'a> TryFrom<&'a ContentDisposition> for PasteType {
} }
} }
impl PasteType {
/// Returns the corresponding directory of the paste type.
pub fn get_dir(&self) -> String {
match self {
Self::File => String::new(),
Self::Url => String::from("url"),
}
}
/// Returns the given path with [`directory`](Self::get_dir) adjoined.
pub fn get_path(&self, path: &Path) -> PathBuf {
path.join(self.get_dir())
}
}
/// Representation of a single paste. /// Representation of a single paste.
#[derive(Debug)] #[derive(Debug)]
pub struct Paste { pub struct Paste {
@ -110,8 +125,10 @@ impl Paste {
.paste .paste
.random_url .random_url
.generate() .generate()
.unwrap_or_else(|| String::from("url")); .unwrap_or_else(|| PasteType::Url.get_dir());
let path = config.server.upload_path.join("url").join(&file_name); let path = PasteType::Url
.get_path(&config.server.upload_path)
.join(&file_name);
fs::write(&path, url.to_string())?; fs::write(&path, url.to_string())?;
Ok(file_name) Ok(file_name)
} }
@ -182,7 +199,7 @@ mod tests {
assert_eq!("test", fs::read_to_string(&file_name)?); assert_eq!("test", fs::read_to_string(&file_name)?);
fs::remove_file(file_name)?; fs::remove_file(file_name)?;
fs::create_dir_all(config.server.upload_path.join("url"))?; fs::create_dir_all(PasteType::Url.get_path(&config.server.upload_path))?;
config.paste.random_url.enabled = true; config.paste.random_url.enabled = true;
let url = String::from("https://orhun.dev/"); let url = String::from("https://orhun.dev/");
@ -191,7 +208,9 @@ mod tests {
type_: PasteType::Url, type_: PasteType::Url,
}; };
let file_name = paste.store_url(&config)?; let file_name = paste.store_url(&config)?;
let file_path = config.server.upload_path.join("url").join(&file_name); let file_path = PasteType::Url
.get_path(&config.server.upload_path)
.join(&file_name);
assert_eq!(url, fs::read_to_string(&file_path)?); assert_eq!(url, fs::read_to_string(&file_path)?);
fs::remove_file(file_path)?; fs::remove_file(file_path)?;
@ -202,7 +221,7 @@ mod tests {
}; };
assert!(paste.store_url(&config).is_err()); assert!(paste.store_url(&config).is_err());
fs::remove_dir(config.server.upload_path.join("url"))?; fs::remove_dir(PasteType::Url.get_path(&config.server.upload_path))?;
Ok(()) Ok(())
} }

View file

@ -29,9 +29,11 @@ async fn serve(
) -> Result<HttpResponse, Error> { ) -> Result<HttpResponse, Error> {
let mut path = config.server.upload_path.join(&*file); let mut path = config.server.upload_path.join(&*file);
let mut paste_type = PasteType::File; let mut paste_type = PasteType::File;
for (type_, alt_path) in &[(PasteType::Url, "url")] { for type_ in &[PasteType::Url] {
if !path.exists() || path.file_name().map(|v| v.to_str()).flatten() == Some(alt_path) { if !path.exists()
path = config.server.upload_path.join(alt_path).join(&*file); || path.file_name().map(|v| v.to_str()).flatten() == Some(&type_.get_dir())
{
path = config.server.upload_path.join(type_.get_dir()).join(&*file);
paste_type = *type_; paste_type = *type_;
break; break;
} }