From 30dba33e4797e14b4c00e1a5ba1686032c2a53d2 Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Wed, 21 Feb 2024 17:24:16 -0500 Subject: [PATCH] Refresh thumbnails after an upload or file move --- src/files.rs | 31 +++++++++++++++++++++++++------ src/main.rs | 6 +++--- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/files.rs b/src/files.rs index 94d2347..031420d 100644 --- a/src/files.rs +++ b/src/files.rs @@ -1,3 +1,4 @@ + use std::fmt::Debug; use std::fs::read_dir; use std::io; @@ -6,6 +7,7 @@ use std::path::{Path, PathBuf}; use std::sync::Mutex; use ::anyhow; +use actix::{Handler, Message}; use anyhow::{anyhow, Context}; use actix_web::web::Data; @@ -16,12 +18,13 @@ use actix_web::{ use log::{debug, error, info}; use crate::data::{Claims, FilesRequest, FilterMode, PhotosResponse}; -use crate::AppState; +use crate::{AppState, create_thumbnails}; use crate::error::IntoHttpError; use crate::tags::TagDao; use path_absolutize::*; use serde::Deserialize; +use crate::video::StreamActor; pub async fn list_photos( _: Claims, @@ -211,6 +214,7 @@ pub async fn move_file( { Ok(_) => { info!("Moved file: {} -> {}", request.source, request.destination,); + app_state.stream_manager.do_send(RefreshThumbnailsMessage); HttpResponse::Ok().finish() } @@ -272,6 +276,21 @@ impl FileSystemAccess for RealFileSystem { } } +pub struct RefreshThumbnailsMessage; + +impl Message for RefreshThumbnailsMessage { + type Result = (); +} + +impl Handler for StreamActor { + type Result = (); + + fn handle(&mut self, _msg: RefreshThumbnailsMessage, _ctx: &mut Self::Context) -> Self::Result { + debug!("Refreshing thumbnails after upload"); + create_thumbnails() + } +} + #[cfg(test)] mod tests { use std::collections::HashMap; @@ -372,7 +391,7 @@ mod tests { Data::new(RealFileSystem::new(String::from("/tmp"))), Data::new(Mutex::new(SqliteTagDao::default())), ) - .await; + .await; let status = response.status(); assert_eq!(status, 200); @@ -412,7 +431,7 @@ mod tests { Data::new(RealFileSystem::new(String::from("./"))), Data::new(Mutex::new(SqliteTagDao::default())), ) - .await; + .await; assert_eq!(response.status(), 400); } @@ -458,7 +477,7 @@ mod tests { Data::new(FakeFileSystem::new(files)), Data::new(Mutex::new(tag_dao)), ) - .await; + .await; assert_eq!(200, response.status()); @@ -502,7 +521,7 @@ mod tests { "path=&tag_ids={},{}&tag_filter_mode=All", tag1.id, tag3.id )) - .unwrap(); + .unwrap(); let response: HttpResponse = list_photos( claims, @@ -515,7 +534,7 @@ mod tests { Data::new(FakeFileSystem::new(files)), Data::new(Mutex::new(tag_dao)), ) - .await; + .await; assert_eq!(200, response.status()); diff --git a/src/main.rs b/src/main.rs index 045e2cd..6209288 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,7 +36,7 @@ use log::{debug, error, info, warn}; use crate::auth::login; use crate::data::*; use crate::database::*; -use crate::files::{is_image_or_video, is_valid_full_path, move_file, RealFileSystem}; +use crate::files::{is_image_or_video, is_valid_full_path, move_file, RealFileSystem, RefreshThumbnailsMessage}; use crate::service::ServiceBuilder; use crate::state::AppState; use crate::tags::*; @@ -185,8 +185,6 @@ async fn upload_image( let mut file = File::create(new_path).unwrap(); file.write_all(&file_content).unwrap(); - - return HttpResponse::Ok().finish(); } } else { error!("Invalid path for upload: {:?}", full_path); @@ -196,6 +194,8 @@ async fn upload_image( return HttpResponse::BadRequest().body("No file body read"); } + app_state.stream_manager.do_send(RefreshThumbnailsMessage); + HttpResponse::Ok().finish() }