Skip to content

Commit 3082909

Browse files
committed
improve(sitemap.xml): add a list of categories to make them indexable by search engines
Part of #1605
1 parent a570824 commit 3082909

9 files changed

+53
-0
lines changed

src/main/java/ru/mystamps/web/feature/category/ApiCategoryService.java

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.web.client.RestTemplate;
2626
import ru.mystamps.web.common.EntityWithParentDto;
2727
import ru.mystamps.web.common.LinkEntityDto;
28+
import ru.mystamps.web.common.SitemapInfoDto;
2829

2930
import java.util.Date;
3031
import java.util.List;
@@ -73,6 +74,11 @@ public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
7374
throw new UnsupportedOperationException();
7475
}
7576

77+
@Override
78+
public List<SitemapInfoDto> findAllForSitemap() {
79+
throw new UnsupportedOperationException();
80+
}
81+
7682
@Override
7783
public List<EntityWithParentDto> findCategoriesWithParents(String lang) {
7884
throw new UnsupportedOperationException();

src/main/java/ru/mystamps/web/feature/category/CategoryDao.java

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import ru.mystamps.web.common.EntityWithParentDto;
2121
import ru.mystamps.web.common.LinkEntityDto;
22+
import ru.mystamps.web.common.SitemapInfoDto;
2223

2324
import java.util.Date;
2425
import java.util.List;
@@ -38,6 +39,7 @@ public interface CategoryDao {
3839
List<Integer> findIdsByNames(List<String> names);
3940
List<Integer> findIdsByNamePattern(String pattern);
4041
List<LinkEntityDto> findAllAsLinkEntities(String lang);
42+
List<SitemapInfoDto> findAllForSitemap();
4143
LinkEntityDto findOneAsLinkEntity(String slug, String lang);
4244
List<EntityWithParentDto> findCategoriesWithParents(String lang);
4345
String findCategoryOfLastCreatedSeriesByUser(Integer userId);

src/main/java/ru/mystamps/web/feature/category/CategoryService.java

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import ru.mystamps.web.common.EntityWithParentDto;
2121
import ru.mystamps.web.common.LinkEntityDto;
22+
import ru.mystamps.web.common.SitemapInfoDto;
2223

2324
import java.util.Date;
2425
import java.util.List;
@@ -30,6 +31,7 @@ public interface CategoryService {
3031
List<Integer> findIdsByNames(List<String> names);
3132
List<Integer> findIdsWhenNameStartsWith(String name);
3233
List<LinkEntityDto> findAllAsLinkEntities(String lang);
34+
List<SitemapInfoDto> findAllForSitemap();
3335
List<EntityWithParentDto> findCategoriesWithParents(String lang);
3436
LinkEntityDto findOneAsLinkEntity(String slug, String lang);
3537
long countAll();

src/main/java/ru/mystamps/web/feature/category/CategoryServiceImpl.java

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import ru.mystamps.web.common.EntityWithParentDto;
2727
import ru.mystamps.web.common.LinkEntityDto;
2828
import ru.mystamps.web.common.LocaleUtils;
29+
import ru.mystamps.web.common.SitemapInfoDto;
2930
import ru.mystamps.web.common.SlugUtils;
3031
import ru.mystamps.web.support.spring.security.HasAuthority;
3132

@@ -115,6 +116,13 @@ public List<Integer> findIdsWhenNameStartsWith(String name) {
115116
public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
116117
return categoryDao.findAllAsLinkEntities(lang);
117118
}
119+
120+
// @todo #1605 CategoryService.findAllForSitemap(): add unit test
121+
@Override
122+
@Transactional(readOnly = true)
123+
public List<SitemapInfoDto> findAllForSitemap() {
124+
return categoryDao.findAllForSitemap();
125+
}
118126

119127
@Override
120128
@Transactional(readOnly = true)

src/main/java/ru/mystamps/web/feature/category/JdbcCategoryDao.java

+12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import ru.mystamps.web.common.JdbcUtils;
3030
import ru.mystamps.web.common.LinkEntityDto;
3131
import ru.mystamps.web.common.RowMappers;
32+
import ru.mystamps.web.common.SitemapInfoDto;
3233
import ru.mystamps.web.support.spring.jdbc.MapStringIntegerResultSetExtractor;
3334

3435
import java.util.Collections;
@@ -56,6 +57,7 @@ public class JdbcCategoryDao implements CategoryDao {
5657
private final String findIdsByNamesSql;
5758
private final String findIdsByNamePatternSql;
5859
private final String findCategoriesNamesWithSlugSql;
60+
private final String findAllForSitemapSql;
5961
private final String findLinkEntityBySlugSql;
6062
@SuppressWarnings("PMD.LongVariable")
6163
private final String findCategoriesWithParentNamesSql;
@@ -77,6 +79,7 @@ public JdbcCategoryDao(Environment env, NamedParameterJdbcTemplate jdbcTemplate)
7779
this.findIdsByNamesSql = env.getRequiredProperty("category.find_ids_by_names");
7880
this.findIdsByNamePatternSql = env.getRequiredProperty("category.find_ids_by_name_pattern");
7981
this.findCategoriesNamesWithSlugSql = env.getRequiredProperty("category.find_all_categories_names_with_slug");
82+
this.findAllForSitemapSql = env.getRequiredProperty("category.find_all_for_sitemap");
8083
this.findLinkEntityBySlugSql = env.getRequiredProperty("category.find_category_link_info_by_slug");
8184
this.findCategoriesWithParentNamesSql = env.getRequiredProperty("category.find_categories_with_parent_names");
8285
this.findFromLastCreatedSeriesByUserSql = env.getRequiredProperty("category.find_from_last_created_series_by_user");
@@ -210,6 +213,15 @@ public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
210213
);
211214
}
212215

216+
@Override
217+
public List<SitemapInfoDto> findAllForSitemap() {
218+
return jdbcTemplate.query(
219+
findAllForSitemapSql,
220+
Collections.emptyMap(),
221+
RowMappers::forSitemapInfoDto
222+
);
223+
}
224+
213225
@Override
214226
public LinkEntityDto findOneAsLinkEntity(String slug, String lang) {
215227
Map<String, Object> params = new HashMap<>();

src/main/java/ru/mystamps/web/feature/category/TogglzWithFallbackCategoryService.java

+9
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.slf4j.LoggerFactory;
2323
import ru.mystamps.web.common.EntityWithParentDto;
2424
import ru.mystamps.web.common.LinkEntityDto;
25+
import ru.mystamps.web.common.SitemapInfoDto;
2526
import ru.mystamps.web.support.togglz.Features;
2627

2728
import java.util.Date;
@@ -80,6 +81,14 @@ public List<LinkEntityDto> findAllAsLinkEntities(String lang) {
8081
);
8182
}
8283

84+
@Override
85+
public List<SitemapInfoDto> findAllForSitemap() {
86+
return executeOneOf(
87+
apiService::findAllForSitemap,
88+
fallbackService::findAllForSitemap
89+
);
90+
}
91+
8392
@Override
8493
public List<EntityWithParentDto> findCategoriesWithParents(String lang) {
8594
return executeOneOf(

src/main/java/ru/mystamps/web/feature/site/SiteConfig.java

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public SiteController siteController() {
8282
@Bean
8383
public SitemapController sitemapController() {
8484
return new SitemapController(
85+
categoryService,
8586
collectionService,
8687
seriesService
8788
);

src/main/java/ru/mystamps/web/feature/site/SitemapController.java

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.stereotype.Controller;
2525
import org.springframework.web.bind.annotation.GetMapping;
2626
import ru.mystamps.web.common.SitemapInfoDto;
27+
import ru.mystamps.web.feature.category.CategoryService;
2728
import ru.mystamps.web.feature.collection.CollectionService;
2829
import ru.mystamps.web.feature.collection.CollectionUrl;
2930
import ru.mystamps.web.feature.series.SeriesService;
@@ -50,6 +51,7 @@ public class SitemapController {
5051
+ SiteUrl.PUBLIC_URL + SiteUrl.INDEX_PAGE
5152
+ "</loc></url>\n";
5253

54+
private final CategoryService categoryService;
5355
private final CollectionService collectionService;
5456
private final SeriesService seriesService;
5557

@@ -78,6 +80,11 @@ public void generateSitemapXml(HttpServletResponse response) {
7880
// CheckStyle: ignore LineLength for next 1 line
7981
writer.print(createUrlEntry(dateFormatter, item, SeriesUrl.INFO_SERIES_PAGE, "{id}"));
8082
}
83+
84+
for (SitemapInfoDto item : categoryService.findAllForSitemap()) {
85+
// CheckStyle: ignore LineLength for next 1 line
86+
writer.print(createUrlEntry(dateFormatter, item, SeriesUrl.INFO_CATEGORY_PAGE, "{slug}"));
87+
}
8188

8289
writer.print("</urlset>\n");
8390
} catch (IOException ex) {

src/main/resources/sql/category_dao_queries.properties

+6
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ category.find_all_categories_names_with_slug = \
9090
FROM categories c \
9191
ORDER BY CASE WHEN 'ru' = :lang THEN COALESCE(c.name_ru, c.name) ELSE c.name END
9292

93+
category.find_all_for_sitemap = \
94+
SELECT slug AS id \
95+
, updated_at \
96+
FROM categories \
97+
ORDER BY updated_at DESC
98+
9399
category.find_category_link_info_by_slug = \
94100
SELECT CASE WHEN 'ru' = :lang THEN COALESCE(c.name_ru, c.name) ELSE c.name END AS name \
95101
, c.slug \

0 commit comments

Comments
 (0)