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 22
23 23 pub fn launch() -> Sender<(Arc<Pool>, Image)> {
24 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 27 actix_rt::spawn(async move {
28 28 let mut workers = FuturesUnordered::new();
... ... @@ -69,7 +69,8 @@ async fn store_original(context :&mut ImageContext) -> Result<(), Error> {
69 69 Ok(())
70 70 },
71 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 102
102 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 132 async fn worker(pool :Arc<Pool>, image :Image) -> Result<(), Error> {
126 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 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 163 web::block(move || finalize(pool, context.image)).await?;
147 164
148 165 Ok(())
... ...
Please register or login to post a comment