HomeDisk/server/src/fs/download.rs

43 lines
1.1 KiB
Rust
Raw Normal View History

2022-05-09 21:04:46 +00:00
use std::fs;
2022-07-02 10:36:02 +00:00
use axum::{extract::Query, Extension};
use axum_auth::AuthBearer;
use homedisk_database::Database;
2022-08-15 19:34:23 +00:00
use homedisk_types::{
config::Config,
errors::{FsError, ServerError},
fs::upload::Pagination,
};
2022-07-25 21:02:25 +00:00
use crate::middleware::{find_user, validate_jwt, validate_path};
2022-06-16 14:58:37 +00:00
pub async fn handle(
Extension(db): Extension<Database>,
Extension(config): Extension<Config>,
AuthBearer(token): AuthBearer,
query: Query<Pagination>,
) -> Result<Vec<u8>, ServerError> {
2022-06-07 20:36:26 +00:00
// validate user token
let token = validate_jwt(config.jwt.secret.as_bytes(), &token)?;
// validate the `path` can be used
validate_path(&query.path)?;
// search for a user by UUID from a token
2022-06-14 20:37:42 +00:00
let user = find_user(&db, &token.claims.sub).await?;
// directory where the file will be placed
let path = format!(
"{user_dir}/{req_dir}",
user_dir = user.user_dir(&config.storage.path),
req_dir = query.path
);
// read file content
2022-07-12 20:15:27 +00:00
let content =
fs::read(path).map_err(|err| ServerError::FsError(FsError::ReadFile(err.to_string())))?;
2022-07-25 21:02:25 +00:00
// send file content in response
Ok(content)
}