29
29
import java .util .Map ;
30
30
import java .util .Objects ;
31
31
32
+ import javax .servlet .http .HttpServletRequest ;
32
33
import javax .servlet .http .HttpServletResponse ;
33
34
import javax .validation .Valid ;
34
35
import javax .validation .groups .Default ;
62
63
import ru .mystamps .web .controller .dto .AddImageForm ;
63
64
import ru .mystamps .web .controller .dto .AddSeriesForm ;
64
65
import ru .mystamps .web .controller .dto .AddSeriesSalesForm ;
66
+ import ru .mystamps .web .controller .dto .NullableImageUrl ;
67
+ import ru .mystamps .web .controller .interceptor .DownloadImageInterceptor ;
65
68
import ru .mystamps .web .dao .dto .EntityWithIdDto ;
66
69
import ru .mystamps .web .dao .dto .LinkEntityDto ;
67
70
import ru .mystamps .web .dao .dto .PurchaseAndSaleDto ;
72
75
import ru .mystamps .web .service .SeriesSalesService ;
73
76
import ru .mystamps .web .service .SeriesService ;
74
77
import ru .mystamps .web .service .TransactionParticipantService ;
78
+ import ru .mystamps .web .service .dto .DownloadResult ;
75
79
import ru .mystamps .web .service .dto .FirstLevelCategoryDto ;
76
80
import ru .mystamps .web .service .dto .SeriesDto ;
77
81
import ru .mystamps .web .support .spring .security .Authority ;
@@ -176,15 +180,34 @@ public View showFormWithCountry(
176
180
return view ;
177
181
}
178
182
179
- @ PostMapping (Url .ADD_SERIES_PAGE )
183
+ @ PostMapping (path = Url .ADD_SERIES_PAGE , params = "imageUrl" )
184
+ public String processInputWithImageUrl (
185
+ @ Validated ({ Default .class ,
186
+ AddSeriesForm .ImageUrlChecks .class ,
187
+ AddSeriesForm .ReleaseDateChecks .class ,
188
+ AddSeriesForm .ImageChecks .class }) AddSeriesForm form ,
189
+ BindingResult result ,
190
+ @ CurrentUser Integer currentUserId ,
191
+ Locale userLocale ,
192
+ Model model ,
193
+ HttpServletRequest request ) {
194
+
195
+ return processInput (form , result , currentUserId , userLocale , model , request );
196
+ }
197
+
198
+ @ PostMapping (path = Url .ADD_SERIES_PAGE , params = "!imageUrl" )
180
199
public String processInput (
181
200
@ Validated ({ Default .class ,
201
+ AddSeriesForm .RequireImageCheck .class ,
182
202
AddSeriesForm .ReleaseDateChecks .class ,
183
203
AddSeriesForm .ImageChecks .class }) AddSeriesForm form ,
184
204
BindingResult result ,
185
205
@ CurrentUser Integer currentUserId ,
186
206
Locale userLocale ,
187
- Model model ) {
207
+ Model model ,
208
+ HttpServletRequest request ) {
209
+
210
+ loadErrorsFromDownloadInterceptor (form , result , request );
188
211
189
212
if (result .hasErrors ()) {
190
213
String lang = LocaleUtils .getLanguageOrNull (userLocale );
@@ -199,6 +222,7 @@ public String processInput(
199
222
200
223
// don't try to re-display file upload field
201
224
form .setImage (null );
225
+ form .setDownloadedImage (null );
202
226
return null ;
203
227
}
204
228
@@ -242,14 +266,47 @@ public String showInfo(
242
266
return "series/info" ;
243
267
}
244
268
245
- @ PostMapping (Url .ADD_IMAGE_SERIES_PAGE )
269
+ @ SuppressWarnings ("checkstyle:parameternumber" )
270
+ @ PostMapping (path = Url .ADD_IMAGE_SERIES_PAGE , params = "imageUrl" )
271
+ public String processImageWithImageUrl (
272
+ @ Validated ({
273
+ AddImageForm .ImageUrlChecks .class ,
274
+ AddImageForm .ImageChecks .class
275
+ }) AddImageForm form ,
276
+ BindingResult result ,
277
+ @ PathVariable ("id" ) Integer seriesId ,
278
+ Model model ,
279
+ @ CurrentUser Integer currentUserId ,
280
+ Locale userLocale ,
281
+ HttpServletRequest request ,
282
+ HttpServletResponse response )
283
+ throws IOException {
284
+
285
+ return processImage (
286
+ form ,
287
+ result ,
288
+ seriesId ,
289
+ model ,
290
+ currentUserId ,
291
+ userLocale ,
292
+ request ,
293
+ response
294
+ );
295
+ }
296
+
297
+ @ SuppressWarnings ("checkstyle:parameternumber" )
298
+ @ PostMapping (path = Url .ADD_IMAGE_SERIES_PAGE , params = "!imageUrl" )
246
299
public String processImage (
247
- @ Valid AddImageForm form ,
300
+ @ Validated ({
301
+ AddImageForm .RequireImageCheck .class ,
302
+ AddImageForm .ImageChecks .class })
303
+ AddImageForm form ,
248
304
BindingResult result ,
249
305
@ PathVariable ("id" ) Integer seriesId ,
250
306
Model model ,
251
307
@ CurrentUser Integer currentUserId ,
252
308
Locale userLocale ,
309
+ HttpServletRequest request ,
253
310
HttpServletResponse response )
254
311
throws IOException {
255
312
@@ -265,6 +322,8 @@ public String processImage(
265
322
return null ;
266
323
}
267
324
325
+ loadErrorsFromDownloadInterceptor (form , result , request );
326
+
268
327
boolean maxQuantityOfImagesExceeded = !isAdmin () && !isAllowedToAddingImages (series );
269
328
model .addAttribute ("maxQuantityOfImagesExceeded" , maxQuantityOfImagesExceeded );
270
329
@@ -475,6 +534,48 @@ private void addSeriesSalesFormToModel(Model model) {
475
534
model .addAttribute ("buyers" , buyers );
476
535
}
477
536
537
+ private static void loadErrorsFromDownloadInterceptor (
538
+ NullableImageUrl form ,
539
+ BindingResult result ,
540
+ HttpServletRequest request ) {
541
+
542
+ Object downloadResultErrorCode =
543
+ request .getAttribute (DownloadImageInterceptor .ERROR_CODE_ATTR_NAME );
544
+
545
+ if (downloadResultErrorCode == null ) {
546
+ return ;
547
+ }
548
+
549
+ if (downloadResultErrorCode instanceof DownloadResult .Code ) {
550
+ DownloadResult .Code code = (DownloadResult .Code )downloadResultErrorCode ;
551
+ switch (code ) {
552
+ case INVALID_URL :
553
+ // Url is being validated by @URL, to avoid showing an error message
554
+ // twice we're skipping error from an interceptor.
555
+ break ;
556
+ case INSUFFICIENT_PERMISSIONS :
557
+ // A user without permissions has tried to download a file. It means that he
558
+ // didn't specify a file but somehow provide a URL to an image. In this case,
559
+ // let's show an error message that file is required.
560
+ result .rejectValue (
561
+ "image" ,
562
+ "ru.mystamps.web.support.beanvalidation.NotEmptyFilename.message"
563
+ );
564
+ form .nullifyImageUrl ();
565
+ break ;
566
+ default :
567
+ result .rejectValue (
568
+ DownloadImageInterceptor .DOWNLOADED_IMAGE_FIELD_NAME ,
569
+ DownloadResult .class .getName () + "." + code .toString (),
570
+ "Could not download image"
571
+ );
572
+ break ;
573
+ }
574
+ }
575
+
576
+ request .removeAttribute (DownloadImageInterceptor .ERROR_CODE_ATTR_NAME );
577
+ }
578
+
478
579
private static void addImageFormToModel (Model model ) {
479
580
AddImageForm form = new AddImageForm ();
480
581
model .addAttribute ("addImageForm" , form );
0 commit comments