added file expiration and fleshed out the API a bit
This commit is contained in:
parent
cc0aaaab94
commit
f52aa0f08b
9 changed files with 296 additions and 103 deletions
55
src/main.rs
55
src/main.rs
|
@ -1,5 +1,5 @@
|
|||
mod download;
|
||||
mod state;
|
||||
mod store;
|
||||
mod upload;
|
||||
mod util;
|
||||
mod zip;
|
||||
|
@ -10,42 +10,13 @@ use actix_web::{
|
|||
get, middleware::Logger, web, App, HttpRequest, HttpResponse, HttpServer, Responder,
|
||||
};
|
||||
use actix_web_actors::ws;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use state::PersistentState;
|
||||
use time::OffsetDateTime;
|
||||
use log::error;
|
||||
use store::FileStore;
|
||||
use tokio::sync::RwLock;
|
||||
|
||||
const APP_NAME: &str = "transbeam";
|
||||
|
||||
pub struct UploadedFile {
|
||||
name: String,
|
||||
size: u64,
|
||||
modtime: OffsetDateTime,
|
||||
}
|
||||
|
||||
impl UploadedFile {
|
||||
fn new(name: &str, size: u64, modtime: OffsetDateTime) -> Self {
|
||||
Self {
|
||||
name: sanitise_file_name::sanitise(name),
|
||||
size,
|
||||
modtime,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
pub struct DownloadableFile {
|
||||
name: String,
|
||||
size: u64,
|
||||
#[serde(with = "state::timestamp")]
|
||||
modtime: OffsetDateTime,
|
||||
}
|
||||
|
||||
type AppData = web::Data<RwLock<PersistentState>>;
|
||||
|
||||
fn storage_dir() -> PathBuf {
|
||||
PathBuf::from(std::env::var("STORAGE_DIR").unwrap_or_else(|_| String::from("storage")))
|
||||
}
|
||||
type AppData = web::Data<RwLock<FileStore>>;
|
||||
|
||||
#[get("/download/{file_code}")]
|
||||
async fn handle_download(
|
||||
|
@ -60,7 +31,7 @@ async fn handle_download(
|
|||
let data = data.read().await;
|
||||
let info = data.lookup_file(&file_code);
|
||||
if let Some(info) = info {
|
||||
let storage_path = storage_dir().join(file_code);
|
||||
let storage_path = store::storage_dir().join(file_code);
|
||||
let file = File::open(&storage_path)?;
|
||||
Ok(download::DownloadingFile {
|
||||
file,
|
||||
|
@ -82,7 +53,8 @@ async fn handle_upload(req: HttpRequest, stream: web::Payload, data: AppData) ->
|
|||
async fn main() -> std::io::Result<()> {
|
||||
env_logger::init();
|
||||
|
||||
let data: AppData = web::Data::new(RwLock::new(PersistentState::load().await?));
|
||||
let data: AppData = web::Data::new(RwLock::new(FileStore::load().await?));
|
||||
start_reaper(data.clone());
|
||||
|
||||
let static_dir =
|
||||
PathBuf::from(std::env::var("STATIC_DIR").unwrap_or_else(|_| String::from("static")));
|
||||
|
@ -104,3 +76,16 @@ async fn main() -> std::io::Result<()> {
|
|||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn start_reaper(data: AppData) {
|
||||
std::thread::spawn(move || {
|
||||
actix_web::rt::System::new().block_on(async {
|
||||
loop {
|
||||
actix_web::rt::time::sleep(core::time::Duration::from_secs(86400)).await;
|
||||
if let Err(e) = data.write().await.remove_expired_files().await {
|
||||
error!("Error reaping expired files: {}", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue