Commit 88cfb041f44fad42920b1ec8395b0fec84905075
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