Skip to content

Commit a19f2c8

Browse files
php-codercssru
authored andcommitted
Remove id from category URL.
Fix php-coder#206
1 parent 5b07d9e commit a19f2c8

25 files changed

+117
-176
lines changed

src/main/java/ru/mystamps/web/Url.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,17 @@ public final class Url {
5151

5252
// CheckStyle: ignore LineLength for next 3 lines
5353
public static final String ADD_SERIES_PAGE = "/series/add";
54-
public static final String ADD_SERIES_WITH_CATEGORY_PAGE = "/series/add/category/{id}";
54+
public static final String ADD_SERIES_WITH_CATEGORY_PAGE = "/series/add/category/{slug}";
5555
public static final String ADD_SERIES_WITH_COUNTRY_PAGE = "/series/add/country/{slug}";
5656
public static final String INFO_SERIES_PAGE = "/series/{id}";
5757
public static final String ADD_IMAGE_SERIES_PAGE = "/series/{id}/image";
5858
public static final String SEARCH_SERIES_BY_CATALOG = "/series/search/by_catalog";
5959

6060
public static final String ADD_CATEGORY_PAGE = "/category/add";
61-
public static final String INFO_CATEGORY_PAGE = "/category/{id}/{slug}";
6261
public static final String LIST_CATEGORIES_PAGE = "/category/list";
62+
public static final String INFO_CATEGORY_PAGE = "/category/{slug}";
63+
// For backward compatibility
64+
public static final String INFO_CATEGORY_BY_ID_PAGE = "/category/{id}/{slug}";
6365

6466
public static final String ADD_COUNTRY_PAGE = "/country/add";
6567
public static final String LIST_COUNTRIES_PAGE = "/country/list";

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import javax.validation.Valid;
2626

2727
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
28+
import org.springframework.http.HttpStatus;
2829
import org.springframework.stereotype.Controller;
2930
import org.springframework.ui.Model;
3031
import org.springframework.validation.BindingResult;
@@ -33,7 +34,9 @@
3334
import org.springframework.web.bind.annotation.PathVariable;
3435
import org.springframework.web.bind.annotation.RequestMapping;
3536
import org.springframework.web.bind.annotation.RequestMethod;
37+
import org.springframework.web.servlet.View;
3638
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
39+
import org.springframework.web.servlet.view.RedirectView;
3740
import org.springframework.web.util.UriComponentsBuilder;
3841

3942
import lombok.RequiredArgsConstructor;
@@ -82,7 +85,7 @@ public String processInput(
8285
UrlEntityDto categoryUrl = categoryService.add(form, currentUserId);
8386

8487
String dstUrl = UriComponentsBuilder.fromUriString(Url.INFO_CATEGORY_PAGE)
85-
.buildAndExpand(categoryUrl.getId(), categoryUrl.getSlug())
88+
.buildAndExpand(categoryUrl.getSlug())
8689
.toString();
8790

8891
redirectAttributes.addFlashAttribute("justAddedCategory", true);
@@ -91,8 +94,8 @@ public String processInput(
9194
}
9295

9396
@RequestMapping(Url.INFO_CATEGORY_PAGE)
94-
public String showInfo(
95-
@Category @PathVariable("id") LinkEntityDto category,
97+
public String showInfoBySlug(
98+
@Category @PathVariable("slug") LinkEntityDto category,
9699
Model model,
97100
Locale userLocale,
98101
HttpServletResponse response)
@@ -110,14 +113,31 @@ public String showInfo(
110113
String lang = LocaleUtils.getLanguageOrNull(userLocale);
111114
List<SeriesInfoDto> series = seriesService.findByCategoryId(id, lang);
112115

113-
model.addAttribute("categoryId", id);
114116
model.addAttribute("categorySlug", slug);
115117
model.addAttribute("categoryName", name);
116118
model.addAttribute("seriesOfCategory", series);
117119

118120
return "category/info";
119121
}
120122

123+
@RequestMapping(Url.INFO_CATEGORY_BY_ID_PAGE)
124+
public View showInfoById(
125+
@Category @PathVariable("slug") LinkEntityDto country,
126+
HttpServletResponse response)
127+
throws IOException {
128+
129+
if (country == null) {
130+
response.sendError(HttpServletResponse.SC_NOT_FOUND);
131+
return null;
132+
}
133+
134+
RedirectView view = new RedirectView();
135+
view.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
136+
view.setUrl(Url.INFO_CATEGORY_PAGE);
137+
138+
return view;
139+
}
140+
121141
@RequestMapping(Url.LIST_CATEGORIES_PAGE)
122142
public void list(Model model, Locale userLocale) {
123143
String lang = LocaleUtils.getLanguageOrNull(userLocale);

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import ru.mystamps.web.controller.converter.annotation.Country;
5555
import ru.mystamps.web.controller.converter.annotation.CurrentUser;
5656
import ru.mystamps.web.dao.dto.LinkEntityDto;
57-
import ru.mystamps.web.dao.dto.SelectEntityDto;
5857
import ru.mystamps.web.dao.dto.SeriesInfoDto;
5958
import ru.mystamps.web.dao.dto.UrlEntityDto;
6059
import ru.mystamps.web.model.AddImageForm;
@@ -108,9 +107,9 @@ public Map<Integer, Integer> getYears() {
108107
}
109108

110109
@ModelAttribute("categories")
111-
public Iterable<SelectEntityDto> getCategories(Locale userLocale) {
110+
public List<LinkEntityDto> getCategories(Locale userLocale) {
112111
String lang = LocaleUtils.getLanguageOrNull(userLocale);
113-
return categoryService.findAllAsSelectEntities(lang);
112+
return categoryService.findAllAsLinkEntities(lang);
114113
}
115114

116115
@ModelAttribute("countries")
@@ -130,7 +129,7 @@ public AddSeriesForm showForm() {
130129

131130
@RequestMapping(Url.ADD_SERIES_WITH_CATEGORY_PAGE)
132131
public String showFormWithCategory(
133-
@Category @PathVariable("id") LinkEntityDto category,
132+
@Category @PathVariable("slug") LinkEntityDto category,
134133
Model model) {
135134

136135
AddSeriesForm form = new AddSeriesForm();

src/main/java/ru/mystamps/web/controller/converter/LinkEntityDtoGenericConverter.java

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -63,38 +63,26 @@ public Object convert(Object value, TypeDescriptor sourceType, TypeDescriptor ta
6363
}
6464

6565
if (isString(sourceType) && isDto(targetType)) {
66-
String string = value.toString();
67-
if (string.isEmpty()) {
66+
String slug = value.toString();
67+
if (slug.isEmpty()) {
6868
return null;
6969
}
7070

7171
String lang = LocaleUtils.getCurrentLanguageOrNull();
7272
if (hasCountryAnnotation(targetType)) {
73-
return countryService.findOneAsLinkEntity(string, lang);
73+
return countryService.findOneAsLinkEntity(slug, lang);
7474
}
7575

76-
try {
77-
Integer id = Integer.valueOf(string);
78-
if (id <= 0) {
79-
LOG.warn("Attempt to convert non positive number ({})", id);
80-
return null;
81-
}
82-
83-
if (hasCategoryAnnotation(targetType)) {
84-
return categoryService.findOneAsLinkEntity(id, lang);
85-
}
86-
87-
LOG.warn(
88-
"Can't convert type '{}' because it doesn't contain supported annotations",
89-
targetType
90-
);
91-
return null;
92-
93-
} catch (NumberFormatException ex) {
94-
// CheckStyle: ignore LineLength for next 1 line
95-
LOG.warn("Can't convert value '{}' from string to integer: {}", value, ex.getMessage());
96-
return null;
76+
if (hasCategoryAnnotation(targetType)) {
77+
return categoryService.findOneAsLinkEntity(slug, lang);
9778
}
79+
80+
LOG.warn(
81+
"Can't convert type '{}' because it doesn't contain supported annotations",
82+
targetType
83+
);
84+
85+
return null;
9886
}
9987

10088
LOG.warn("Attempt to convert unsupported types: from {} to {}", sourceType, targetType);

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import ru.mystamps.web.dao.dto.AddCategoryDbDto;
2424
import ru.mystamps.web.dao.dto.LinkEntityDto;
25-
import ru.mystamps.web.dao.dto.SelectEntityDto;
2625

2726
public interface CategoryDao {
2827
Integer add(AddCategoryDbDto category);
@@ -32,7 +31,6 @@ public interface CategoryDao {
3231
long countCategoriesOfCollection(Integer collectionId);
3332
long countAddedSince(Date date);
3433
List<Object[]> getStatisticsOf(Integer collectionId, String lang);
35-
Iterable<SelectEntityDto> findAllAsSelectEntities(String lang);
3634
List<LinkEntityDto> findAllAsLinkEntities(String lang);
37-
LinkEntityDto findOneAsLinkEntity(Integer categoryId, String lang);
35+
LinkEntityDto findOneAsLinkEntity(String slug, String lang);
3836
}

src/main/java/ru/mystamps/web/dao/dto/SelectEntityDto.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

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

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import ru.mystamps.web.dao.CategoryDao;
3838
import ru.mystamps.web.dao.dto.AddCategoryDbDto;
3939
import ru.mystamps.web.dao.dto.LinkEntityDto;
40-
import ru.mystamps.web.dao.dto.SelectEntityDto;
4140

4241
@RequiredArgsConstructor
4342
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
@@ -66,14 +65,11 @@ public class JdbcCategoryDao implements CategoryDao {
6665
@Value("${category.count_stamps_by_categories}")
6766
private String countStampsByCategoriesSql;
6867

69-
@Value("${category.find_all_categories_names_with_ids}")
70-
private String findCategoriesNamesWithIdsSql;
71-
7268
@Value("${category.find_all_categories_names_with_slug}")
7369
private String findCategoriesNamesWithSlugSql;
7470

75-
@Value("${category.find_category_link_info_by_id}")
76-
private String findCategoryLinkEntityByIdSql;
71+
@Value("${category.find_category_link_info_by_slug}")
72+
private String findLinkEntityBySlugSql;
7773

7874
@Override
7975
public Integer add(AddCategoryDbDto category) {
@@ -161,15 +157,6 @@ public List<Object[]> getStatisticsOf(Integer collectionId, String lang) {
161157
);
162158
}
163159

164-
@Override
165-
public Iterable<SelectEntityDto> findAllAsSelectEntities(String lang) {
166-
return jdbcTemplate.query(
167-
findCategoriesNamesWithIdsSql,
168-
Collections.singletonMap("lang", lang),
169-
RowMappers::forSelectEntityDto
170-
);
171-
}
172-
173160
@Override
174161
public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
175162
return jdbcTemplate.query(
@@ -180,14 +167,14 @@ public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
180167
}
181168

182169
@Override
183-
public LinkEntityDto findOneAsLinkEntity(Integer categoryId, String lang) {
170+
public LinkEntityDto findOneAsLinkEntity(String slug, String lang) {
184171
Map<String, Object> params = new HashMap<>();
185-
params.put("category_id", categoryId);
172+
params.put("slug", slug);
186173
params.put("lang", lang);
187174

188175
try {
189176
return jdbcTemplate.queryForObject(
190-
findCategoryLinkEntityByIdSql,
177+
findLinkEntityBySlugSql,
191178
params,
192179
RowMappers::forLinkEntityDto
193180
);

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import ru.mystamps.web.dao.dto.DbImageDto;
2727
import ru.mystamps.web.dao.dto.ImageInfoDto;
2828
import ru.mystamps.web.dao.dto.LinkEntityDto;
29-
import ru.mystamps.web.dao.dto.SelectEntityDto;
3029
import ru.mystamps.web.dao.dto.SeriesFullInfoDto;
3130
import ru.mystamps.web.dao.dto.SeriesInfoDto;
3231
import ru.mystamps.web.dao.dto.SitemapInfoDto;
@@ -71,13 +70,6 @@ public static SitemapInfoDto forSitemapInfoDto(ResultSet rs, int i) throws SQLEx
7170
);
7271
}
7372

74-
public static SelectEntityDto forSelectEntityDto(ResultSet rs, int i) throws SQLException {
75-
return new SelectEntityDto(
76-
rs.getInt("id"),
77-
rs.getString("name")
78-
);
79-
}
80-
8173
public static SeriesInfoDto forSeriesInfoDto(ResultSet rs, int i) throws SQLException {
8274
Integer seriesId = rs.getInt("id");
8375
Integer releaseDay = JdbcUtils.getInteger(rs, "release_day");

src/main/java/ru/mystamps/web/model/AddSeriesForm.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@
7171
@ReleaseDateIsNotInFuture(groups = AddSeriesForm.ReleaseDate3Checks.class)
7272
public class AddSeriesForm implements AddSeriesDto {
7373

74-
// FIXME: change type to SelectEntityDto or plain Integer
74+
// FIXME: change type to plain Integer
7575
@NotNull
7676
@Category
7777
private LinkEntityDto category;
7878

79-
// FIXME: change type to SelectEntityDto or plain Integer
79+
// FIXME: change type to plain Integer
8080
@Country
8181
private LinkEntityDto country;
8282

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,13 @@
2121
import java.util.List;
2222

2323
import ru.mystamps.web.dao.dto.LinkEntityDto;
24-
import ru.mystamps.web.dao.dto.SelectEntityDto;
2524
import ru.mystamps.web.dao.dto.UrlEntityDto;
2625
import ru.mystamps.web.service.dto.AddCategoryDto;
2726

2827
public interface CategoryService {
2928
UrlEntityDto add(AddCategoryDto dto, Integer userId);
30-
Iterable<SelectEntityDto> findAllAsSelectEntities(String lang);
3129
List<LinkEntityDto> findAllAsLinkEntities(String lang);
32-
LinkEntityDto findOneAsLinkEntity(Integer categoryId, String lang);
30+
LinkEntityDto findOneAsLinkEntity(String slug, String lang);
3331
long countAll();
3432
long countCategoriesOf(Integer collectionId);
3533
long countByName(String name);

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import ru.mystamps.web.dao.CategoryDao;
3636
import ru.mystamps.web.dao.dto.AddCategoryDbDto;
3737
import ru.mystamps.web.dao.dto.LinkEntityDto;
38-
import ru.mystamps.web.dao.dto.SelectEntityDto;
3938
import ru.mystamps.web.dao.dto.UrlEntityDto;
4039
import ru.mystamps.web.service.dto.AddCategoryDto;
4140
import ru.mystamps.web.support.spring.security.HasAuthority;
@@ -80,12 +79,6 @@ public UrlEntityDto add(AddCategoryDto dto, Integer userId) {
8079
return new UrlEntityDto(id, slug);
8180
}
8281

83-
@Override
84-
@Transactional(readOnly = true)
85-
public Iterable<SelectEntityDto> findAllAsSelectEntities(String lang) {
86-
return categoryDao.findAllAsSelectEntities(lang);
87-
}
88-
8982
@Override
9083
@Transactional(readOnly = true)
9184
public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
@@ -94,10 +87,11 @@ public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
9487

9588
@Override
9689
@Transactional(readOnly = true)
97-
public LinkEntityDto findOneAsLinkEntity(Integer categoryId, String lang) {
98-
Validate.isTrue(categoryId != null, "Category id must be non null");
90+
public LinkEntityDto findOneAsLinkEntity(String slug, String lang) {
91+
Validate.isTrue(slug != null, "Category slug must be non null");
92+
Validate.isTrue(!slug.trim().isEmpty(), "Category slug must be non empty");
9993

100-
return categoryDao.findOneAsLinkEntity(categoryId, lang);
94+
return categoryDao.findOneAsLinkEntity(slug, lang);
10195
}
10296

10397
@Override

src/main/resources/liquibase/version/0.4.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
<include file="0.4/2016-01-04--unique_series_in_collection.xml" relativeToChangelogFile="true" />
1515
<include file="0.4/2016-02-19--csrf_events.xml" relativeToChangelogFile="true" />
1616
<include file="0.4/2016-01-14--unique_slug_in_countries.xml" relativeToChangelogFile="true" />
17+
<include file="0.4/2016-07-22--unique_slug_in_categories.xml" relativeToChangelogFile="true" />
1718

1819
</databaseChangeLog>

0 commit comments

Comments
 (0)