2022-06-03 17:24:34 +01:00
|
|
|
use actix_web::{get, web, HttpResponse};
|
|
|
|
|
|
|
|
use crate::args::ARGS;
|
|
|
|
use crate::endpoints::errors::ErrorTemplate;
|
2022-07-31 19:18:07 +01:00
|
|
|
use crate::pasta::PastaFile;
|
2022-06-03 17:24:34 +01:00
|
|
|
use crate::util::animalnumbers::to_u64;
|
2022-11-01 21:15:13 +08:00
|
|
|
use crate::util::hashids::to_u64 as hashid_to_u64;
|
2022-06-03 17:24:34 +01:00
|
|
|
use crate::util::misc::remove_expired;
|
|
|
|
use crate::AppState;
|
|
|
|
use askama::Template;
|
2022-07-31 19:18:07 +01:00
|
|
|
use std::fs;
|
2022-06-03 17:24:34 +01:00
|
|
|
|
2023-02-17 22:32:21 +01:00
|
|
|
/// Endpoint to remove a pasta.
|
2022-06-03 17:24:34 +01:00
|
|
|
#[get("/remove/{id}")]
|
|
|
|
pub async fn remove(data: web::Data<AppState>, id: web::Path<String>) -> HttpResponse {
|
|
|
|
if ARGS.readonly {
|
2022-06-04 22:21:22 +01:00
|
|
|
return HttpResponse::Found()
|
2022-10-12 17:13:21 +02:00
|
|
|
.append_header(("Location", format!("{}/", ARGS.public_path)))
|
2022-06-04 22:21:22 +01:00
|
|
|
.finish();
|
2022-06-03 17:24:34 +01:00
|
|
|
}
|
|
|
|
|
2023-02-17 22:14:43 +01:00
|
|
|
let mut pastas = data.pastas.lock().await;
|
2022-06-03 17:24:34 +01:00
|
|
|
|
2022-11-01 21:15:13 +08:00
|
|
|
let id = if ARGS.hash_ids {
|
2022-11-08 16:30:16 -05:00
|
|
|
hashid_to_u64(&id).unwrap_or(0)
|
2022-11-01 21:15:13 +08:00
|
|
|
} else {
|
2022-11-08 16:30:16 -05:00
|
|
|
to_u64(&id.into_inner()).unwrap_or(0)
|
2022-11-01 21:15:13 +08:00
|
|
|
};
|
2022-06-03 17:24:34 +01:00
|
|
|
|
|
|
|
for (i, pasta) in pastas.iter().enumerate() {
|
|
|
|
if pasta.id == id {
|
2022-07-31 19:18:07 +01:00
|
|
|
// remove the file itself
|
|
|
|
if let Some(PastaFile { name, .. }) = &pasta.file {
|
2022-11-01 21:15:13 +08:00
|
|
|
if fs::remove_file(format!(
|
|
|
|
"./pasta_data/public/{}/{}",
|
|
|
|
pasta.id_as_animals(),
|
|
|
|
name
|
|
|
|
))
|
|
|
|
.is_err()
|
2022-07-31 19:18:07 +01:00
|
|
|
{
|
|
|
|
log::error!("Failed to delete file {}!", name)
|
|
|
|
}
|
|
|
|
|
|
|
|
// and remove the containing directory
|
2022-11-01 21:15:13 +08:00
|
|
|
if fs::remove_dir(format!("./pasta_data/public/{}/", pasta.id_as_animals()))
|
|
|
|
.is_err()
|
|
|
|
{
|
2022-07-31 19:18:07 +01:00
|
|
|
log::error!("Failed to delete directory {}!", name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// remove it from in-memory pasta list
|
2022-06-03 17:24:34 +01:00
|
|
|
pastas.remove(i);
|
2022-06-04 22:21:22 +01:00
|
|
|
return HttpResponse::Found()
|
2022-10-12 17:13:21 +02:00
|
|
|
.append_header(("Location", format!("{}/pastalist", ARGS.public_path)))
|
2022-06-03 17:24:34 +01:00
|
|
|
.finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-31 19:18:07 +01:00
|
|
|
remove_expired(&mut pastas);
|
|
|
|
|
2022-06-04 21:50:34 +01:00
|
|
|
HttpResponse::Ok()
|
2022-06-03 17:24:34 +01:00
|
|
|
.content_type("text/html")
|
|
|
|
.body(ErrorTemplate { args: &ARGS }.render().unwrap())
|
|
|
|
}
|