Skip to content

Commit 3f6141f

Browse files
committed
improve(sitemap.xml): add a list of non-empty collections to make them indexable by search engines
Part of #1605
1 parent 0e00788 commit 3f6141f

File tree

7 files changed

+46
-2
lines changed

7 files changed

+46
-2
lines changed

src/main/java/ru/mystamps/web/feature/collection/CollectionDao.java

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package ru.mystamps.web.feature.collection;
1919

2020
import ru.mystamps.web.common.LinkEntityDto;
21+
import ru.mystamps.web.common.SitemapInfoDto;
2122

2223
import java.util.Date;
2324
import java.util.List;
@@ -28,6 +29,7 @@ public interface CollectionDao {
2829
List<LinkEntityDto> findLastCreated(int quantity);
2930
List<SeriesInCollectionDto> findSeriesByCollectionId(Integer collectionId, String lang);
3031
List<SeriesInCollectionWithPriceDto> findSeriesWithPricesBySlug(String slug, String lang);
32+
List<SitemapInfoDto> findAllForSitemap();
3133
long countCollectionsOfUsers();
3234
long countUpdatedSince(Date date);
3335
long countSeriesOfCollection(Integer collectionId);

src/main/java/ru/mystamps/web/feature/collection/CollectionService.java

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package ru.mystamps.web.feature.collection;
1919

2020
import ru.mystamps.web.common.LinkEntityDto;
21+
import ru.mystamps.web.common.SitemapInfoDto;
2122

2223
import java.util.Date;
2324
import java.util.List;
@@ -38,4 +39,5 @@ public interface CollectionService {
3839
List<SeriesInCollectionDto> findSeriesInCollection(Integer collectionId, String lang);
3940
List<SeriesInCollectionWithPriceDto> findSeriesWithPricesBySlug(String slug, String lang);
4041
CollectionInfoDto findBySlug(String slug);
42+
List<SitemapInfoDto> findAllForSitemap();
4143
}

src/main/java/ru/mystamps/web/feature/collection/CollectionServiceImpl.java

+8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.security.access.prepost.PreAuthorize;
2525
import org.springframework.transaction.annotation.Transactional;
2626
import ru.mystamps.web.common.LinkEntityDto;
27+
import ru.mystamps.web.common.SitemapInfoDto;
2728
import ru.mystamps.web.common.SlugUtils;
2829
import ru.mystamps.web.support.spring.security.HasAuthority;
2930

@@ -208,6 +209,13 @@ public CollectionInfoDto findBySlug(String slug) {
208209

209210
return collectionDao.findCollectionInfoBySlug(slug);
210211
}
212+
213+
// @todo #1605 CollectionService.findAllForSitemap(): add unit tests
214+
@Override
215+
@Transactional(readOnly = true)
216+
public List<SitemapInfoDto> findAllForSitemap() {
217+
return collectionDao.findAllForSitemap();
218+
}
211219

212220
private static String formatSeriesInfo(AddToCollectionDbDto collectionDto) {
213221
StringBuilder sb = new StringBuilder();

src/main/java/ru/mystamps/web/feature/collection/JdbcCollectionDao.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.jdbc.support.KeyHolder;
3030
import ru.mystamps.web.common.JdbcUtils;
3131
import ru.mystamps.web.common.LinkEntityDto;
32+
import ru.mystamps.web.common.SitemapInfoDto;
3233
import ru.mystamps.web.support.spring.jdbc.MapIntegerIntegerResultSetExtractor;
3334

3435
import java.util.Collections;
@@ -37,7 +38,7 @@
3738
import java.util.List;
3839
import java.util.Map;
3940

40-
@SuppressWarnings({ "PMD.AvoidDuplicateLiterals", "PMD.TooManyMethods" })
41+
@SuppressWarnings({ "PMD.AvoidDuplicateLiterals", "PMD.TooManyMethods", "PMD.TooManyFields" })
4142
public class JdbcCollectionDao implements CollectionDao {
4243
private static final Logger LOG = LoggerFactory.getLogger(JdbcCollectionDao.class);
4344

@@ -48,6 +49,7 @@ public class JdbcCollectionDao implements CollectionDao {
4849
private final String findLastCreatedCollectionsSql;
4950
private final String findSeriesByCollectionIdSql;
5051
private final String findSeriesWithPricesBySlugSql;
52+
private final String findAllForSitemapSql;
5153
private final String countCollectionsOfUsersSql;
5254
private final String countUpdatedSinceSql;
5355
private final String countSeriesOfCollectionSql;
@@ -66,6 +68,7 @@ public JdbcCollectionDao(Environment env, NamedParameterJdbcTemplate jdbcTemplat
6668
this.findLastCreatedCollectionsSql = env.getRequiredProperty("collection.find_last_created");
6769
this.findSeriesByCollectionIdSql = env.getRequiredProperty("collection.find_series_by_collection_id");
6870
this.findSeriesWithPricesBySlugSql = env.getRequiredProperty("collection.find_series_with_prices_by_slug");
71+
this.findAllForSitemapSql = env.getRequiredProperty("collection.find_all_for_sitemap");
6972
this.countCollectionsOfUsersSql = env.getRequiredProperty("collection.count_collections_of_users");
7073
this.countUpdatedSinceSql = env.getRequiredProperty("collection.count_updated_since");
7174
this.countSeriesOfCollectionSql = env.getRequiredProperty("collection.count_series_of_collection");
@@ -117,6 +120,15 @@ public List<SeriesInCollectionWithPriceDto> findSeriesWithPricesBySlug(
117120
);
118121
}
119122

123+
@Override
124+
public List<SitemapInfoDto> findAllForSitemap() {
125+
return jdbcTemplate.query(
126+
findAllForSitemapSql,
127+
Collections.emptyMap(),
128+
ru.mystamps.web.common.RowMappers::forSitemapInfoDto
129+
);
130+
}
131+
120132
@Override
121133
public long countCollectionsOfUsers() {
122134
return jdbcTemplate.queryForObject(

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ public SiteController siteController() {
8181

8282
@Bean
8383
public SitemapController sitemapController() {
84-
return new SitemapController(seriesService);
84+
return new SitemapController(
85+
collectionService,
86+
seriesService
87+
);
8588
}
8689

8790
@Bean

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

+8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
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.collection.CollectionService;
28+
import ru.mystamps.web.feature.collection.CollectionUrl;
2729
import ru.mystamps.web.feature.series.SeriesService;
2830
import ru.mystamps.web.feature.series.SeriesUrl;
2931

@@ -48,6 +50,7 @@ public class SitemapController {
4850
+ SiteUrl.PUBLIC_URL + SiteUrl.INDEX_PAGE
4951
+ "</loc></url>\n";
5052

53+
private final CollectionService collectionService;
5154
private final SeriesService seriesService;
5255

5356
@GetMapping(SiteUrl.SITEMAP_XML)
@@ -66,6 +69,11 @@ public void generateSitemapXml(HttpServletResponse response) {
6669

6770
writer.print(INDEX_URL_ENTRY);
6871

72+
for (SitemapInfoDto item : collectionService.findAllForSitemap()) {
73+
// CheckStyle: ignore LineLength for next 1 line
74+
writer.print(createUrlEntry(dateFormatter, item, CollectionUrl.INFO_COLLECTION_PAGE, "{slug}"));
75+
}
76+
6977
for (SitemapInfoDto item : seriesService.findAllForSitemap()) {
7078
// CheckStyle: ignore LineLength for next 1 line
7179
writer.print(createUrlEntry(dateFormatter, item, SeriesUrl.INFO_SERIES_PAGE, "{id}"));

src/main/resources/sql/collection_dao_queries.properties

+9
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ LEFT JOIN countries count \
5959
ON count.id = s.country_id \
6060
WHERE c.slug = :slug
6161

62+
collection.find_all_for_sitemap = \
63+
SELECT c.slug AS id \
64+
, c.updated_at \
65+
FROM collections_series cs \
66+
JOIN collections c \
67+
ON c.id = cs.collection_id \
68+
GROUP BY c.id \
69+
ORDER BY c.updated_at DESC
70+
6271
collection.count_collections_of_users = \
6372
SELECT COUNT(DISTINCT c.id) \
6473
FROM collections c \

0 commit comments

Comments
 (0)