Skip to content

Commit c8b2414

Browse files
cssruphp-coder
authored andcommitted
Support multiple series with the same number in find series by catalog number.
Fix #309
1 parent 597b5a6 commit c8b2414

File tree

10 files changed

+480
-158
lines changed

10 files changed

+480
-158
lines changed

src/main/java/ru/mystamps/web/controller/SeriesController.java

+46-43
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919

2020
import java.io.IOException;
2121
import java.util.Calendar;
22+
import java.util.Collections;
2223
import java.util.GregorianCalendar;
2324
import java.util.LinkedHashMap;
25+
import java.util.List;
2426
import java.util.Locale;
2527
import java.util.Map;
26-
import java.util.Optional;
2728

2829
import javax.servlet.http.HttpServletRequest;
2930
import javax.servlet.http.HttpServletResponse;
@@ -58,6 +59,7 @@
5859
import ru.mystamps.web.service.SeriesService;
5960
import ru.mystamps.web.service.dto.LinkEntityDto;
6061
import ru.mystamps.web.service.dto.SelectEntityDto;
62+
import ru.mystamps.web.service.dto.SeriesInfoDto;
6163
import ru.mystamps.web.service.dto.UrlEntityDto;
6264
import ru.mystamps.web.support.spring.security.SecurityContextUtils;
6365
import ru.mystamps.web.util.CatalogUtils;
@@ -308,81 +310,82 @@ public String removeFromCollection(
308310
@RequestMapping(Url.FIND_SERIES_BY_MICHEL)
309311
public String findSeriesByMichel(
310312
@PathVariable("num") String michelNumberCode,
313+
Model model,
314+
Locale userLocale,
311315
HttpServletResponse response)
312316
throws IOException {
313317

314-
if (michelNumberCode == null) {
315-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
316-
return null;
317-
}
318-
319-
Optional<Integer> seriesId = seriesService.findSeriesIdByMichelNumber(michelNumberCode);
320-
if (!seriesId.isPresent()) {
321-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
322-
return null;
323-
}
324-
325-
return redirectTo(Url.INFO_SERIES_PAGE, seriesId.get());
318+
return findSeriesByCatalogNumber(michelNumberCode, "michel", model, userLocale, response);
326319
}
327320

328321
@RequestMapping(Url.FIND_SERIES_BY_SCOTT)
329322
public String findSeriesByScott(
330323
@PathVariable("num") String scottNumberCode,
324+
Model model,
325+
Locale userLocale,
331326
HttpServletResponse response)
332327
throws IOException {
333328

334-
if (scottNumberCode == null) {
335-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
336-
return null;
337-
}
338-
339-
Optional<Integer> seriesId = seriesService.findSeriesIdByScottNumber(scottNumberCode);
340-
if (!seriesId.isPresent()) {
341-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
342-
return null;
343-
}
344-
345-
return redirectTo(Url.INFO_SERIES_PAGE, seriesId.get());
329+
return findSeriesByCatalogNumber(scottNumberCode, "scott", model, userLocale, response);
346330
}
347331

348332
@RequestMapping(Url.FIND_SERIES_BY_YVERT)
349333
public String findSeriesByYvert(
350334
@PathVariable("num") String yvertNumberCode,
335+
Model model,
336+
Locale userLocale,
351337
HttpServletResponse response)
352338
throws IOException {
353339

354-
if (yvertNumberCode == null) {
355-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
356-
return null;
357-
}
358-
359-
Optional<Integer> seriesId = seriesService.findSeriesIdByYvertNumber(yvertNumberCode);
360-
if (!seriesId.isPresent()) {
361-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
362-
return null;
363-
}
364-
365-
return redirectTo(Url.INFO_SERIES_PAGE, seriesId.get());
340+
return findSeriesByCatalogNumber(yvertNumberCode, "yvert", model, userLocale, response);
366341
}
367342

368343
@RequestMapping(Url.FIND_SERIES_BY_GIBBONS)
369344
public String findSeriesByGibbons(
370345
@PathVariable("num") String gibbonsNumberCode,
346+
Model model,
347+
Locale userLocale,
371348
HttpServletResponse response)
372349
throws IOException {
373350

374-
if (gibbonsNumberCode == null) {
351+
return findSeriesByCatalogNumber(gibbonsNumberCode, "gibbons", model, userLocale, response);
352+
}
353+
354+
private String findSeriesByCatalogNumber(
355+
String catalogNumber,
356+
String catalogName,
357+
Model model,
358+
Locale userLocale,
359+
HttpServletResponse response)
360+
throws IOException {
361+
362+
if (catalogNumber == null) {
375363
response.sendError(HttpServletResponse.SC_NOT_FOUND);
376364
return null;
377365
}
378366

379-
Optional<Integer> seriesId = seriesService.findSeriesIdByGibbonsNumber(gibbonsNumberCode);
380-
if (!seriesId.isPresent()) {
381-
response.sendError(HttpServletResponse.SC_NOT_FOUND);
382-
return null;
367+
String lang = LocaleUtils.getLanguageOrNull(userLocale);
368+
List<SeriesInfoDto> series;
369+
switch (catalogName) {
370+
case "michel":
371+
series = seriesService.findByMichelNumber(catalogNumber, lang);
372+
break;
373+
case "scott":
374+
series = seriesService.findByScottNumber(catalogNumber, lang);
375+
break;
376+
case "yvert":
377+
series = seriesService.findByYvertNumber(catalogNumber, lang);
378+
break;
379+
case "gibbons":
380+
series = seriesService.findByGibbonsNumber(catalogNumber, lang);
381+
break;
382+
default:
383+
series = Collections.emptyList();
384+
break;
383385
}
386+
model.addAttribute("searchResults", series);
384387

385-
return redirectTo(Url.INFO_SERIES_PAGE, seriesId.get());
388+
return "series/search_result";
386389
}
387390

388391
private static boolean isAllowedToAddingImages(Series series) {

src/main/java/ru/mystamps/web/dao/JdbcSeriesDao.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
package ru.mystamps.web.dao;
1919

20-
import java.util.Optional;
20+
import java.util.List;
2121

2222
import ru.mystamps.web.dao.dto.AddSeriesDbDto;
2323
import ru.mystamps.web.service.dto.SeriesInfoDto;
@@ -29,6 +29,7 @@ public interface JdbcSeriesDao {
2929
Integer add(AddSeriesDbDto series);
3030
Iterable<SitemapInfoDto> findAllForSitemap();
3131
Iterable<SeriesInfoDto> findLastAdded(int quantity, String lang);
32+
List<SeriesInfoDto> findByIdsAsSeriesInfo(List<Integer> seriesIds, String lang);
3233
Iterable<SeriesInfoDto> findByCategoryIdAsSeriesInfo(Integer categoryId, String lang);
3334
Iterable<SeriesInfoDto> findByCountryIdAsSeriesInfo(Integer countryId, String lang);
3435
Iterable<SeriesInfoDto> findByCollectionIdAsSeriesInfo(Integer collectionId, String lang);
@@ -37,8 +38,8 @@ public interface JdbcSeriesDao {
3738
long countSeriesOfCollection(Integer collectionId);
3839
long countStampsOfCollection(Integer collectionId);
3940

40-
Optional<Integer> findSeriesIdByMichelNumberCode(String michelNumber);
41-
Optional<Integer> findSeriesIdByScottNumberCode(String scottNumber);
42-
Optional<Integer> findSeriesIdByYvertNumberCode(String yvertNumber);
43-
Optional<Integer> findSeriesIdByGibbonsNumberCode(String gibbonsNumber);
41+
List<Integer> findSeriesIdsByMichelNumberCode(String michelNumber);
42+
List<Integer> findSeriesIdsByScottNumberCode(String scottNumber);
43+
List<Integer> findSeriesIdsByYvertNumberCode(String yvertNumber);
44+
List<Integer> findSeriesIdsByGibbonsNumberCode(String gibbonsNumber);
4445
}

src/main/java/ru/mystamps/web/dao/impl/JdbcSeriesDaoImpl.java

+54-59
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@
1919

2020
import java.util.Collections;
2121
import java.util.HashMap;
22+
import java.util.List;
2223
import java.util.Map;
23-
import java.util.Optional;
2424

2525
import org.apache.commons.lang3.Validate;
2626

2727
import org.springframework.beans.factory.annotation.Value;
28-
import org.springframework.dao.EmptyResultDataAccessException;
2928
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
3029
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
3130
import org.springframework.jdbc.support.GeneratedKeyHolder;
@@ -39,7 +38,12 @@
3938
import ru.mystamps.web.service.dto.SitemapInfoDto;
4039

4140
// TODO: move stamps related methods to separate interface (#88)
42-
@SuppressWarnings({ "PMD.AvoidDuplicateLiterals", "PMD.TooManyMethods" })
41+
@SuppressWarnings({
42+
"PMD.AvoidDuplicateLiterals",
43+
"PMD.TooManyMethods",
44+
"PMD.TooManyFields",
45+
"PMD.LongVariable"
46+
})
4347
@RequiredArgsConstructor
4448
public class JdbcSeriesDaoImpl implements JdbcSeriesDao {
4549

@@ -54,6 +58,9 @@ public class JdbcSeriesDaoImpl implements JdbcSeriesDao {
5458
@Value("${series.find_last_added}")
5559
private String findLastAddedSeriesSql;
5660

61+
@Value("${series.find_by_ids}")
62+
private String findByIdsSql;
63+
5764
@Value("${series.find_by_category_id}")
5865
private String findByCategoryIdSql;
5966

@@ -75,17 +82,17 @@ public class JdbcSeriesDaoImpl implements JdbcSeriesDao {
7582
@Value("${series.count_stamps_of_collection}")
7683
private String countStampsOfCollectionSql;
7784

78-
@Value("${series.find_series_id_by_michel_number}")
79-
private String findSeriesIdByMichelNumberSql;
85+
@Value("${series.find_series_ids_by_michel_number}")
86+
private String findSeriesIdsByMichelNumberSql;
8087

81-
@Value("${series.find_series_id_by_scott_number}")
82-
private String findSeriesIdByScottNumberSql;
88+
@Value("${series.find_series_ids_by_scott_number}")
89+
private String findSeriesIdsByScottNumberSql;
8390

84-
@Value("${series.find_series_id_by_yvert_number}")
85-
private String findSeriesIdByYvertNumberSql;
91+
@Value("${series.find_series_ids_by_yvert_number}")
92+
private String findSeriesIdsByYvertNumberSql;
8693

87-
@Value("${series.find_series_id_by_gibbons_number}")
88-
private String findSeriesIdByGibbonsNumberSql;
94+
@Value("${series.find_series_ids_by_gibbons_number}")
95+
private String findSeriesIdsByGibbonsNumberSql;
8996

9097
@Override
9198
public Integer add(AddSeriesDbDto series) {
@@ -146,6 +153,18 @@ public Iterable<SeriesInfoDto> findLastAdded(int quantity, String lang) {
146153
return jdbcTemplate.query(findLastAddedSeriesSql, params, RowMappers::forSeriesInfoDto);
147154
}
148155

156+
/**
157+
* @author Sergey Chechenev
158+
*/
159+
@Override
160+
public List<SeriesInfoDto> findByIdsAsSeriesInfo(List<Integer> seriesIds, String lang) {
161+
Map<String, Object> params = new HashMap<>();
162+
params.put("series_ids", seriesIds);
163+
params.put("lang", lang);
164+
165+
return jdbcTemplate.query(findByIdsSql, params, RowMappers::forSeriesInfoDto);
166+
}
167+
149168
@Override
150169
public Iterable<SeriesInfoDto> findByCategoryIdAsSeriesInfo(Integer categoryId, String lang) {
151170
Map<String, Object> params = new HashMap<>();
@@ -211,63 +230,39 @@ public long countStampsOfCollection(Integer collectionId) {
211230
}
212231

213232
@Override
214-
public Optional<Integer> findSeriesIdByMichelNumberCode(String michelNumber) {
215-
try {
216-
Integer seriesId = jdbcTemplate.queryForObject(
217-
findSeriesIdByMichelNumberSql,
218-
Collections.singletonMap("michel_number", michelNumber),
219-
Integer.class
220-
);
221-
return Optional.of(seriesId);
222-
223-
} catch (EmptyResultDataAccessException ignored) {
224-
return Optional.empty();
225-
}
233+
public List<Integer> findSeriesIdsByMichelNumberCode(String michelNumber) {
234+
return jdbcTemplate.queryForList(
235+
findSeriesIdsByMichelNumberSql,
236+
Collections.singletonMap("michel_number", michelNumber),
237+
Integer.class
238+
);
226239
}
227240

228241
@Override
229-
public Optional<Integer> findSeriesIdByScottNumberCode(String scottNumber) {
230-
try {
231-
Integer seriesId = jdbcTemplate.queryForObject(
232-
findSeriesIdByScottNumberSql,
233-
Collections.singletonMap("scott_number", scottNumber),
234-
Integer.class
235-
);
236-
return Optional.of(seriesId);
237-
238-
} catch (EmptyResultDataAccessException ignored) {
239-
return Optional.empty();
240-
}
242+
public List<Integer> findSeriesIdsByScottNumberCode(String scottNumber) {
243+
return jdbcTemplate.queryForList(
244+
findSeriesIdsByScottNumberSql,
245+
Collections.singletonMap("scott_number", scottNumber),
246+
Integer.class
247+
);
241248
}
242249

243250
@Override
244-
public Optional<Integer> findSeriesIdByYvertNumberCode(String yvertNumber) {
245-
try {
246-
Integer seriesId = jdbcTemplate.queryForObject(
247-
findSeriesIdByYvertNumberSql,
248-
Collections.singletonMap("yvert_number", yvertNumber),
249-
Integer.class
250-
);
251-
return Optional.of(seriesId);
252-
253-
} catch (EmptyResultDataAccessException ignored) {
254-
return Optional.empty();
255-
}
251+
public List<Integer> findSeriesIdsByYvertNumberCode(String yvertNumber) {
252+
return jdbcTemplate.queryForList(
253+
findSeriesIdsByYvertNumberSql,
254+
Collections.singletonMap("yvert_number", yvertNumber),
255+
Integer.class
256+
);
256257
}
257258

258259
@Override
259-
public Optional<Integer> findSeriesIdByGibbonsNumberCode(String gibbonsNumber) {
260-
try {
261-
Integer seriesId = jdbcTemplate.queryForObject(
262-
findSeriesIdByGibbonsNumberSql,
263-
Collections.singletonMap("gibbons_number", gibbonsNumber),
264-
Integer.class
265-
);
266-
return Optional.of(seriesId);
267-
268-
} catch (EmptyResultDataAccessException ignored) {
269-
return Optional.empty();
270-
}
260+
public List<Integer> findSeriesIdsByGibbonsNumberCode(String gibbonsNumber) {
261+
return jdbcTemplate.queryForList(
262+
findSeriesIdsByGibbonsNumberSql,
263+
Collections.singletonMap("gibbons_number", gibbonsNumber),
264+
Integer.class
265+
);
271266
}
272267

273268
}

src/main/java/ru/mystamps/web/service/SeriesService.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
package ru.mystamps.web.service;
1919

20-
import java.util.Optional;
20+
import java.util.List;
2121

2222
import ru.mystamps.web.service.dto.AddImageDto;
2323
import ru.mystamps.web.service.dto.AddSeriesDto;
@@ -34,10 +34,10 @@ public interface SeriesService {
3434
long countSeriesOf(Integer collectionId);
3535
long countStampsOf(Integer collectionId);
3636

37-
Optional<Integer> findSeriesIdByMichelNumber(String michelNumberCode);
38-
Optional<Integer> findSeriesIdByScottNumber(String scottNumberCode);
39-
Optional<Integer> findSeriesIdByYvertNumber(String yvertNumberCode);
40-
Optional<Integer> findSeriesIdByGibbonsNumber(String gibbonsNumberCode);
37+
List<SeriesInfoDto> findByMichelNumber(String michelNumberCode, String lang);
38+
List<SeriesInfoDto> findByScottNumber(String scottNumberCode, String lang);
39+
List<SeriesInfoDto> findByYvertNumber(String yvertNumberCode, String lang);
40+
List<SeriesInfoDto> findByGibbonsNumber(String gibbonsNumberCode, String lang);
4141

4242
Iterable<SeriesInfoDto> findByCategoryId(Integer categoryId, String lang);
4343
Iterable<SeriesInfoDto> findByCountryId(Integer countryId, String lang);

0 commit comments

Comments
 (0)