Create file metadata endpoint

This allows retrieving create/modify date as well as file size for any
file in the BASE_PATH.
This commit is contained in:
Cameron Cordes
2021-05-19 08:53:20 -04:00
parent 9a40614d1e
commit 9d823fdc51
4 changed files with 62 additions and 13 deletions

View File

@@ -8,11 +8,13 @@ use database::{DbError, DbErrorKind, FavoriteDao, SqliteFavoriteDao, SqliteUserD
use futures::stream::StreamExt;
use lazy_static::lazy_static;
use prometheus::{self, IntGauge};
use std::path::{Path, PathBuf};
use std::sync::mpsc::channel;
use std::sync::Arc;
use std::sync::{mpsc::channel, Arc};
use std::{collections::HashMap, io::prelude::*};
use std::{env, fs::File};
use std::{
io::ErrorKind,
path::{Path, PathBuf},
};
use walkdir::{DirEntry, WalkDir};
use actix::prelude::*;
@@ -29,7 +31,7 @@ use notify::{watcher, DebouncedEvent, RecursiveMode, Watcher};
use rayon::prelude::*;
use serde::Serialize;
use data::{AddFavoriteRequest, ThumbnailRequest};
use data::{AddFavoriteRequest, MetadataResponse, ThumbnailRequest};
use log::{debug, error, info};
use crate::data::Claims;
@@ -61,7 +63,7 @@ async fn list_photos(_claims: Claims, req: Query<ThumbnailRequest>) -> impl Resp
let path = &req.path;
if let Some(path) = is_valid_path(path) {
let files = list_files(path).unwrap_or_default();
let files = list_files(&path).unwrap_or_default();
let photos = &files
.iter()
@@ -119,6 +121,24 @@ async fn get_image(
}
}
#[get("/image/metadata")]
async fn get_file_metadata(_: Claims, path: web::Query<ThumbnailRequest>) -> impl Responder {
match is_valid_path(&path.path)
.ok_or_else(|| ErrorKind::InvalidData.into())
.and_then(File::open)
.and_then(|file| file.metadata())
{
Ok(metadata) => {
let response: MetadataResponse = metadata.into();
HttpResponse::Ok().json(response)
}
Err(e) => {
error!("Error getting metadata for file '{}': {:?}", path.path, e);
HttpResponse::InternalServerError().finish()
}
}
}
#[post("/image")]
async fn upload_image(_: Claims, mut payload: mp::Multipart) -> impl Responder {
let mut file_content: BytesMut = BytesMut::new();
@@ -370,7 +390,7 @@ fn create_thumbnails() {
update_media_counts(&images);
}
fn update_media_counts(media_dir: &PathBuf) {
fn update_media_counts(media_dir: &Path) {
let mut image_count = 0;
let mut video_count = 0;
for ref entry in WalkDir::new(media_dir).into_iter().filter_map(|e| e.ok()) {
@@ -485,6 +505,7 @@ fn main() -> std::io::Result<()> {
.service(favorites)
.service(put_add_favorite)
.service(delete_favorite)
.service(get_file_metadata)
.app_data(app_data.clone())
.data::<Box<dyn UserDao>>(Box::new(user_dao))
.data::<Box<dyn FavoriteDao>>(Box::new(favorites_dao))