Merge pull request 'Refresh thumbnails after an upload or file move' (#25) from feature/refresh-thumbnails-improvements into master

Reviewed-on: #25
This commit was merged in pull request #25.
This commit is contained in:
2024-02-22 02:48:57 +00:00
2 changed files with 28 additions and 9 deletions

View File

@@ -1,3 +1,4 @@
use std::fmt::Debug; use std::fmt::Debug;
use std::fs::read_dir; use std::fs::read_dir;
use std::io; use std::io;
@@ -6,6 +7,7 @@ use std::path::{Path, PathBuf};
use std::sync::Mutex; use std::sync::Mutex;
use ::anyhow; use ::anyhow;
use actix::{Handler, Message};
use anyhow::{anyhow, Context}; use anyhow::{anyhow, Context};
use actix_web::web::Data; use actix_web::web::Data;
@@ -16,12 +18,13 @@ use actix_web::{
use log::{debug, error, info}; use log::{debug, error, info};
use crate::data::{Claims, FilesRequest, FilterMode, PhotosResponse}; use crate::data::{Claims, FilesRequest, FilterMode, PhotosResponse};
use crate::AppState; use crate::{AppState, create_thumbnails};
use crate::error::IntoHttpError; use crate::error::IntoHttpError;
use crate::tags::TagDao; use crate::tags::TagDao;
use path_absolutize::*; use path_absolutize::*;
use serde::Deserialize; use serde::Deserialize;
use crate::video::StreamActor;
pub async fn list_photos<TagD: TagDao, FS: FileSystemAccess>( pub async fn list_photos<TagD: TagDao, FS: FileSystemAccess>(
_: Claims, _: Claims,
@@ -211,6 +214,7 @@ pub async fn move_file<FS: FileSystemAccess>(
{ {
Ok(_) => { Ok(_) => {
info!("Moved file: {} -> {}", request.source, request.destination,); info!("Moved file: {} -> {}", request.source, request.destination,);
app_state.stream_manager.do_send(RefreshThumbnailsMessage);
HttpResponse::Ok().finish() HttpResponse::Ok().finish()
} }
@@ -272,6 +276,21 @@ impl FileSystemAccess for RealFileSystem {
} }
} }
pub struct RefreshThumbnailsMessage;
impl Message for RefreshThumbnailsMessage {
type Result = ();
}
impl Handler<RefreshThumbnailsMessage> 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)] #[cfg(test)]
mod tests { mod tests {
use std::collections::HashMap; use std::collections::HashMap;
@@ -372,7 +391,7 @@ mod tests {
Data::new(RealFileSystem::new(String::from("/tmp"))), Data::new(RealFileSystem::new(String::from("/tmp"))),
Data::new(Mutex::new(SqliteTagDao::default())), Data::new(Mutex::new(SqliteTagDao::default())),
) )
.await; .await;
let status = response.status(); let status = response.status();
assert_eq!(status, 200); assert_eq!(status, 200);
@@ -412,7 +431,7 @@ mod tests {
Data::new(RealFileSystem::new(String::from("./"))), Data::new(RealFileSystem::new(String::from("./"))),
Data::new(Mutex::new(SqliteTagDao::default())), Data::new(Mutex::new(SqliteTagDao::default())),
) )
.await; .await;
assert_eq!(response.status(), 400); assert_eq!(response.status(), 400);
} }
@@ -458,7 +477,7 @@ mod tests {
Data::new(FakeFileSystem::new(files)), Data::new(FakeFileSystem::new(files)),
Data::new(Mutex::new(tag_dao)), Data::new(Mutex::new(tag_dao)),
) )
.await; .await;
assert_eq!(200, response.status()); assert_eq!(200, response.status());
@@ -502,7 +521,7 @@ mod tests {
"path=&tag_ids={},{}&tag_filter_mode=All", "path=&tag_ids={},{}&tag_filter_mode=All",
tag1.id, tag3.id tag1.id, tag3.id
)) ))
.unwrap(); .unwrap();
let response: HttpResponse = list_photos( let response: HttpResponse = list_photos(
claims, claims,
@@ -515,7 +534,7 @@ mod tests {
Data::new(FakeFileSystem::new(files)), Data::new(FakeFileSystem::new(files)),
Data::new(Mutex::new(tag_dao)), Data::new(Mutex::new(tag_dao)),
) )
.await; .await;
assert_eq!(200, response.status()); assert_eq!(200, response.status());

View File

@@ -36,7 +36,7 @@ use log::{debug, error, info, warn};
use crate::auth::login; use crate::auth::login;
use crate::data::*; use crate::data::*;
use crate::database::*; 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::service::ServiceBuilder;
use crate::state::AppState; use crate::state::AppState;
use crate::tags::*; use crate::tags::*;
@@ -185,8 +185,6 @@ async fn upload_image(
let mut file = File::create(new_path).unwrap(); let mut file = File::create(new_path).unwrap();
file.write_all(&file_content).unwrap(); file.write_all(&file_content).unwrap();
return HttpResponse::Ok().finish();
} }
} else { } else {
error!("Invalid path for upload: {:?}", full_path); error!("Invalid path for upload: {:?}", full_path);
@@ -196,6 +194,8 @@ async fn upload_image(
return HttpResponse::BadRequest().body("No file body read"); return HttpResponse::BadRequest().body("No file body read");
} }
app_state.stream_manager.do_send(RefreshThumbnailsMessage);
HttpResponse::Ok().finish() HttpResponse::Ok().finish()
} }