mirror of
https://github.com/Jackzmc/storage.git
synced 2025-05-08 15:03:21 +00:00
Fix nested folders
This commit is contained in:
parent
403cf26426
commit
e4870bf88e
5 changed files with 58 additions and 20 deletions
|
@ -71,7 +71,7 @@ async fn rocket() -> _ {
|
||||||
api::library::move_file, api::library::upload_file, api::library::download_file, api::library::list_files, api::library::get_file, api::library::delete_file,
|
api::library::move_file, api::library::upload_file, api::library::download_file, api::library::list_files, api::library::get_file, api::library::delete_file,
|
||||||
])
|
])
|
||||||
.mount("/", routes![
|
.mount("/", routes![
|
||||||
ui::user::index, ui::user::list_library_files, ui::user::get_library_file
|
ui::user::index, ui::user::redirect_list_library_files, ui::user::list_library_files, ui::user::get_library_file
|
||||||
])
|
])
|
||||||
.attach(Template::custom(|engines| {
|
.attach(Template::custom(|engines| {
|
||||||
let hb = &mut engines.handlebars;
|
let hb = &mut engines.handlebars;
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use std::path::PathBuf;
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use rocket::{get, Response, State};
|
use log::debug;
|
||||||
|
use rocket::{get, uri, Response, State};
|
||||||
use rocket::fs::NamedFile;
|
use rocket::fs::NamedFile;
|
||||||
use rocket::http::{ContentType, Header};
|
use rocket::http::{ContentType, Header};
|
||||||
use rocket::http::hyper::body::Buf;
|
use rocket::http::hyper::body::Buf;
|
||||||
use rocket::response::{status, Responder};
|
use rocket::response::{status, Redirect, Responder};
|
||||||
use rocket::response::stream::ByteStream;
|
use rocket::response::stream::ByteStream;
|
||||||
use rocket::serde::json::Json;
|
use rocket::serde::json::{json, Json};
|
||||||
use rocket_dyn_templates::{context, Template};
|
use rocket_dyn_templates::{context, Template};
|
||||||
|
use serde::Serialize;
|
||||||
|
use serde_json::Value;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use crate::managers::libraries::LibraryManager;
|
use crate::managers::libraries::LibraryManager;
|
||||||
use crate::util::{JsonErrorResponse, ResponseError};
|
use crate::util::{JsonErrorResponse, ResponseError};
|
||||||
|
@ -18,24 +21,61 @@ pub async fn index() -> Template {
|
||||||
Template::render("index", context! { test: "value" })
|
Template::render("index", context! { test: "value" })
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/libraries/<library_id>/<_>/<path..>")]
|
#[get("/library/<library_id>")]
|
||||||
|
pub async fn redirect_list_library_files(libraries: &State<Arc<Mutex<LibraryManager>>>, library_id: &str)
|
||||||
|
-> Result<Redirect, ResponseError>
|
||||||
|
{
|
||||||
|
let libs = libraries.lock().await;
|
||||||
|
let library = libs.get(library_id).await?;
|
||||||
|
// let redirect_to = format!("/library/{}/{}/", library_id, library.model().name);
|
||||||
|
// debug!("{}", redirect_to);
|
||||||
|
Ok(Redirect::to(uri!(list_library_files(library_id, library.model().name, ""))))
|
||||||
|
// Ok(Redirect::to(redirect_to))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[get("/library/<library_id>/<_>/<path..>")]
|
||||||
pub async fn list_library_files(libraries: &State<Arc<Mutex<LibraryManager>>>, library_id: &str, path: PathBuf)
|
pub async fn list_library_files(libraries: &State<Arc<Mutex<LibraryManager>>>, library_id: &str, path: PathBuf)
|
||||||
-> Result<Template, ResponseError>
|
-> Result<Template, ResponseError>
|
||||||
{
|
{
|
||||||
let libs = libraries.lock().await;
|
let libs = libraries.lock().await;
|
||||||
let library = libs.get(library_id).await?;
|
let library = libs.get(library_id).await?;
|
||||||
let files = library.list_files(&PathBuf::from(path)).await
|
let files = library.list_files(&PathBuf::from(&path)).await
|
||||||
.map_err(|e| ResponseError::InternalServerError(JsonErrorResponse {
|
.map_err(|e| ResponseError::InternalServerError(JsonErrorResponse {
|
||||||
code: "STORAGE_ERROR".to_string(),
|
code: "STORAGE_ERROR".to_string(),
|
||||||
message: e.to_string(),
|
message: e.to_string(),
|
||||||
}))?;
|
}))?;
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// parent
|
||||||
|
let parent = path.clone();
|
||||||
|
let mut seg_path = PathBuf::new();
|
||||||
|
let segments: Vec<PathSegmentPiece> = path.iter()
|
||||||
|
.map(|segment| {
|
||||||
|
seg_path = seg_path.join(segment);
|
||||||
|
PathSegmentPiece {
|
||||||
|
path: seg_path.clone(),
|
||||||
|
segment: segment.to_string_lossy().into_owned(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
debug!("parent={:?}", parent);
|
||||||
|
debug!("segments={:?}", segments);
|
||||||
|
|
||||||
Ok(Template::render("libraries", context! {
|
Ok(Template::render("libraries", context! {
|
||||||
library: library.model(),
|
library: library.model(),
|
||||||
files: files
|
files: files,
|
||||||
|
parent,
|
||||||
|
path_segments: segments
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
struct PathSegmentPiece {
|
||||||
|
pub path: PathBuf,
|
||||||
|
pub segment: String
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Responder)]
|
#[derive(Responder)]
|
||||||
#[response(status = 200)]
|
#[response(status = 200)]
|
||||||
struct FileAttachment {
|
struct FileAttachment {
|
||||||
|
@ -61,15 +101,9 @@ pub async fn get_library_file<'a>(libraries: &State<Arc<Mutex<LibraryManager>>>,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
Some(contents) => {
|
Some(contents) => {
|
||||||
// TODO: headers?
|
|
||||||
let file_name = path.file_name().unwrap().to_string_lossy();
|
let file_name = path.file_name().unwrap().to_string_lossy();
|
||||||
let ext = path.extension().unwrap().to_string_lossy();
|
let ext = path.extension().unwrap().to_string_lossy();
|
||||||
let file_type = ContentType::from_extension(&ext);
|
let file_type = ContentType::from_extension(&ext);
|
||||||
// let res = Response::build()
|
|
||||||
// .header(file_type.unwrap_or(ContentType::Binary))
|
|
||||||
// .header(Header::new("Content-Disposition", format!("attachment; filename=\"{}\"", file_name)))
|
|
||||||
// .sized_body(contents.len(), Cursor::new(contents))
|
|
||||||
// .finalize();
|
|
||||||
Ok(FileAttachment {
|
Ok(FileAttachment {
|
||||||
content: contents,
|
content: contents,
|
||||||
content_type: file_type.unwrap_or(ContentType::Binary),
|
content_type: file_type.unwrap_or(ContentType::Binary),
|
||||||
|
|
|
@ -15,7 +15,7 @@ pub(crate) fn setup_logger() {
|
||||||
tracing_subscriber::registry()
|
tracing_subscriber::registry()
|
||||||
.with(
|
.with(
|
||||||
tracing_subscriber::filter::EnvFilter::try_from_default_env()
|
tracing_subscriber::filter::EnvFilter::try_from_default_env()
|
||||||
.unwrap_or_else(|_| format!("warn,rocket=trace,storage_server=trace").into()),
|
.unwrap_or_else(|_| format!("warn,rocket=warn,storage_server=trace").into()),
|
||||||
)
|
)
|
||||||
.with(tracing_subscriber::fmt::layer())
|
.with(tracing_subscriber::fmt::layer())
|
||||||
.init();
|
.init();
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="px-4 py-4">
|
<td class="px-4 py-4">
|
||||||
<a href="/libraries/dbabbf7d-9b63-487b-9908-57c2df11b2d2">My Library</a>
|
<a href="/library/dbabbf7d-9b63-487b-9908-57c2df11b2d2/My Library/">My Library</a>
|
||||||
</td>
|
</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
|
|
@ -2,8 +2,12 @@
|
||||||
<div class="">
|
<div class="">
|
||||||
<nav class="breadcrumb is-inline-block is-size-5 mb-0" aria-label="breadcrumbs">
|
<nav class="breadcrumb is-inline-block is-size-5 mb-0" aria-label="breadcrumbs">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a class="has-text-black" href="#">{{ library.name }}</a></li>
|
<li><a class="has-text-black" href="/library/{{library.id}}/{{library.name}}/">{{ library.name }}</a></li>
|
||||||
<li class="is-active"><a class="has-text-black" href="#" aria-current="page">test</a></li>
|
{{#each path_segments}}
|
||||||
|
<li>
|
||||||
|
<a class="has-text-black" href="/library/{{../library.id}}/{{../library.name}}/{{path}}" aria-current="page"> {{ segment }} </a>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
<div class="button is-small">
|
<div class="button is-small">
|
||||||
+
|
+
|
||||||
</div>
|
</div>
|
||||||
|
@ -61,10 +65,10 @@
|
||||||
</td>
|
</td>
|
||||||
<td class="filecell-label pl-4">
|
<td class="filecell-label pl-4">
|
||||||
{{#if (eq type "folder")}}
|
{{#if (eq type "folder")}}
|
||||||
<a href="{{ path }}">{{ path }}/</a>
|
<a href="{{../parent}}/{{ path }}">{{ path }}/</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if (eq type "file") }}
|
{{#if (eq type "file") }}
|
||||||
<a target="_blank" href="/file/{{../library.id}}/{{ path }}">{{ path }}</a>
|
<a target="_blank" href="/file/{{../library.id}}/{{../parent}}/{{ path }}">{{ path }}</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</td>
|
</td>
|
||||||
<td>{{ bytes size }}</td>
|
<td>{{ bytes size }}</td>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue