Commit 88cfb041f44fad42920b1ec8395b0fec84905075

Authored by Georg Hopp
1 parent 28f4e90b

Ensure uploads of same files will be cleaned from the database

Showing 1 changed file with 48 additions and 31 deletions
@@ -22,7 +22,7 @@ use image::{ io::Reader as ImageReader @@ -22,7 +22,7 @@ use image::{ io::Reader as ImageReader
22 22
23 pub fn launch() -> Sender<(Arc<Pool>, Image)> { 23 pub fn launch() -> Sender<(Arc<Pool>, Image)> {
24 let (tx_upload_worker, rx_upload_worker) 24 let (tx_upload_worker, rx_upload_worker)
25 - : (Sender<(Arc<Pool>, Image)>, Receiver<(Arc<Pool>, Image)>) = bounded(32); 25 + : (Sender<(Arc<Pool>, Image)>, Receiver<(Arc<Pool>, Image)>) = bounded(100);
26 26
27 actix_rt::spawn(async move { 27 actix_rt::spawn(async move {
28 let mut workers = FuturesUnordered::new(); 28 let mut workers = FuturesUnordered::new();
@@ -69,7 +69,8 @@ async fn store_original(context :&mut ImageContext) -> Result<(), Error> { @@ -69,7 +69,8 @@ async fn store_original(context :&mut ImageContext) -> Result<(), Error> {
69 Ok(()) 69 Ok(())
70 }, 70 },
71 Err(e) => Err(e)?, 71 Err(e) => Err(e)?,
72 - Ok(_) => Ok(()), 72 + Ok(_) => Err(Error::new( "File already exists"
  73 + , StatusCode::CONFLICT )),
73 } 74 }
74 } 75 }
75 76
@@ -101,48 +102,64 @@ async fn save_resized( original :&DynamicImage @@ -101,48 +102,64 @@ async fn save_resized( original :&DynamicImage
101 102
102 let original = original.to_owned(); 103 let original = original.to_owned();
103 104
104 - spawn_blocking(move || -> Result<(), Error> {  
105 - let mut scaled = original.resize(width, height, Lanczos3);  
106 - overlay(&mut scaled, CONFIG.copyright_image(), 0_u32, 0_u32);  
107 -  
108 - if let Size::Thumbnail = size {  
109 - scaled.save_with_format(&path, Jpeg)?;  
110 - } else {  
111 - let stegonography = CONFIG.copyright_steganography().as_bytes();  
112 - let encoder = Encoder::new(stegonography, scaled);  
113 - let scaled = encoder.encode_alpha();  
114 - scaled.save_with_format(&path, Jpeg)?;  
115 - } 105 + match metadata(&path).await {
  106 + Err(e) if e.kind() == ErrorKind::NotFound =>
  107 + spawn_blocking(move || -> Result<(), Error> {
  108 + let mut scaled = original.resize(width, height, Lanczos3);
  109 + overlay(&mut scaled, CONFIG.copyright_image(), 0_u32, 0_u32);
  110 +
  111 + if let Size::Thumbnail = size {
  112 + scaled.save_with_format(&path, Jpeg)?;
  113 + } else {
  114 + let stegonography = CONFIG.copyright_steganography().as_bytes();
  115 + let encoder = Encoder::new(stegonography, scaled);
  116 + let scaled = encoder.encode_alpha();
  117 + scaled.save_with_format(&path, Jpeg)?;
  118 + }
116 119
117 - let exiv = Metadata::new_from_path(&path)?;  
118 - exiv.set_tag_string("Exif.Image.Copyright", CONFIG.copyright_exiv())?;  
119 - exiv.save_to_file(&path)?; 120 + let exiv = Metadata::new_from_path(&path)?;
  121 + exiv.set_tag_string("Exif.Image.Copyright", CONFIG.copyright_exiv())?;
  122 + exiv.save_to_file(&path)?;
120 123
121 - Ok(())  
122 - }).await 124 + Ok(())
  125 + }).await,
  126 + Err(e) => Err(e)?,
  127 + Ok(_) => Err(Error::new( "File already exists"
  128 + , StatusCode::CONFLICT )),
  129 + }
123 } 130 }
124 131
125 async fn worker(pool :Arc<Pool>, image :Image) -> Result<(), Error> { 132 async fn worker(pool :Arc<Pool>, image :Image) -> Result<(), Error> {
126 let mut context = image.context(); 133 let mut context = image.context();
  134 + let base_path = context.base_path().await
  135 + . ok_or(Error::new( "Missing base_path"
  136 + , StatusCode::INTERNAL_SERVER_ERROR ))?;
127 137
128 DirBuilder::new() . recursive(true) 138 DirBuilder::new() . recursive(true)
129 - . create(context.base_path().await.unwrap())  
130 - . await  
131 - . unwrap(); 139 + . create(base_path)
  140 + . await?;
  141 +
  142 + store_original(&mut context).await.unwrap_or(());
132 143
133 - store_original(&mut context).await.unwrap(); 144 + if let Ok(original) = load_original(&mut context).await {
  145 + let (dim_x, dim_y) = original.dimensions();
134 146
135 - let original = load_original(&mut context).await.unwrap();  
136 - let (dim_x, dim_y) = original.dimensions(); 147 + context.image.dim_x = Some(dim_x as i32);
  148 + context.image.dim_y = Some(dim_y as i32);
137 149
138 - context.image.dim_x = Some(dim_x as i32);  
139 - context.image.dim_y = Some(dim_y as i32); 150 + macro_rules! save_resized{
  151 + ($s:expr) => { save_resized(&original, &mut context, $s) }
  152 + }
140 153
141 - save_resized(&original, &mut context, Size::Large).await?;  
142 - save_resized(&original, &mut context, Size::Medium).await?;  
143 - save_resized(&original, &mut context, Size::Small).await?;  
144 - save_resized(&original, &mut context, Size::Thumbnail).await?; 154 + save_resized!(Size::Large).await.unwrap_or(());
  155 + save_resized!(Size::Medium).await.unwrap_or(());
  156 + save_resized!(Size::Small).await.unwrap_or(());
  157 + save_resized!(Size::Thumbnail).await.unwrap_or(());
  158 + }
145 159
  160 + // TODO Think about two simpler functions than finanlize...
  161 + // One to update one do remove the new entry depending if the
  162 + // entry exists already...
146 web::block(move || finalize(pool, context.image)).await?; 163 web::block(move || finalize(pool, context.image)).await?;
147 164
148 Ok(()) 165 Ok(())
Please register or login to post a comment