2022-05-09 21:04:46 +00:00
|
|
|
use std::fs;
|
2022-05-07 13:19:36 +00:00
|
|
|
|
2022-07-02 10:36:02 +00:00
|
|
|
use axum::{extract::Query, Extension};
|
2022-05-07 13:19:36 +00:00
|
|
|
use axum_auth::AuthBearer;
|
|
|
|
use homedisk_database::Database;
|
2022-07-12 20:15:27 +00:00
|
|
|
use homedisk_types::errors::FsError;
|
2022-05-07 13:19:36 +00:00
|
|
|
use homedisk_types::fs::upload::Pagination;
|
2022-06-08 19:16:12 +00:00
|
|
|
use homedisk_types::{config::Config, errors::ServerError};
|
2022-05-07 13:19:36 +00:00
|
|
|
|
2022-05-09 21:04:46 +00:00
|
|
|
use crate::middleware::{find_user, validate_jwt};
|
2022-05-07 13:19:36 +00:00
|
|
|
|
2022-06-16 14:58:37 +00:00
|
|
|
use super::validate_path;
|
|
|
|
|
2022-05-07 13:19:36 +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
|
2022-05-07 13:19:36 +00:00
|
|
|
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?;
|
2022-05-07 13:19:36 +00:00
|
|
|
|
|
|
|
// 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-05-07 13:19:36 +00:00
|
|
|
|
2022-06-11 08:19:47 +00:00
|
|
|
// send file content in Response
|
2022-05-07 13:19:36 +00:00
|
|
|
Ok(content)
|
|
|
|
}
|