Skip to content

Commit 0fe253d

Browse files
committed
CronService.purgeUsersActivations(): port to JDBC.
Addressed to #120 No functional changes.
1 parent ca39eb3 commit 0fe253d

12 files changed

+109
-40
lines changed

src/main/java/ru/mystamps/web/config/ServicesConfig.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ public class ServicesConfig {
4343
@Autowired
4444
private UserDao userDao;
4545

46-
@Autowired
47-
private UsersActivationDao usersActivationDao;
48-
4946
@Autowired
5047
private StrategiesConfig strategiesConfig;
5148

@@ -78,7 +75,7 @@ public CollectionService getCollectionService() {
7875

7976
@Bean
8077
public CronService getCronService() {
81-
return new CronServiceImpl(usersActivationDao, getUsersActivationService());
78+
return new CronServiceImpl(getUsersActivationService());
8279
}
8380

8481
@Bean

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@
1717
*/
1818
package ru.mystamps.web.dao;
1919

20+
import java.util.Date;
21+
import java.util.List;
22+
2023
import ru.mystamps.web.dao.dto.AddUsersActivationDbDto;
2124
import ru.mystamps.web.dao.dto.UsersActivationDto;
25+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
2226

2327
public interface JdbcUsersActivationDao {
2428
long countByActivationKey(String activationKey);
2529
void removeByActivationKey(String activationKey);
2630
void add(AddUsersActivationDbDto activation);
2731
UsersActivationDto findByActivationKey(String activationKey);
32+
List<UsersActivationFullDto> findOlderThan(Date date);
2833
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,9 @@
1717
*/
1818
package ru.mystamps.web.dao;
1919

20-
import java.util.Date;
21-
import java.util.List;
22-
2320
import org.springframework.data.repository.CrudRepository;
2421

2522
import ru.mystamps.web.entity.UsersActivation;
2623

2724
public interface UsersActivationDao extends CrudRepository<UsersActivation, String> {
28-
List<UsersActivation> findByCreatedAtLessThan(Date expiredSince);
2925
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (C) 2009-2016 Slava Semushin <slava.semushin@gmail.com>
3+
*
4+
* This program is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation; either version 2 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program; if not, write to the Free Software
16+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17+
*/
18+
package ru.mystamps.web.dao.dto;
19+
20+
import java.util.Date;
21+
22+
import lombok.Getter;
23+
import lombok.RequiredArgsConstructor;
24+
25+
@Getter
26+
@RequiredArgsConstructor
27+
public class UsersActivationFullDto {
28+
private final String activationKey;
29+
private final String email;
30+
private final Date createdAt;
31+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
package ru.mystamps.web.dao.impl;
1919

2020
import java.util.Collections;
21+
import java.util.Date;
2122
import java.util.HashMap;
23+
import java.util.List;
2224
import java.util.Map;
2325

2426
import org.apache.commons.lang3.Validate;
@@ -31,6 +33,7 @@
3133
import ru.mystamps.web.dao.JdbcUsersActivationDao;
3234
import ru.mystamps.web.dao.dto.AddUsersActivationDbDto;
3335
import ru.mystamps.web.dao.dto.UsersActivationDto;
36+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
3437

3538
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
3639
@RequiredArgsConstructor
@@ -41,6 +44,9 @@ public class JdbcUsersActivationDaoImpl implements JdbcUsersActivationDao {
4144
@Value("${users_activation.find_by_activation_key}")
4245
private String findByActivationKeySql;
4346

47+
@Value("${users_activation.find_older_than}")
48+
private String findOlderThanDateSql;
49+
4450
@Value("${users_activation.count_by_activation_key}")
4551
private String countByActivationKeySql;
4652

@@ -59,6 +65,15 @@ public UsersActivationDto findByActivationKey(String activationKey) {
5965
);
6066
}
6167

68+
@Override
69+
public List<UsersActivationFullDto> findOlderThan(Date date) {
70+
return jdbcTemplate.query(
71+
findOlderThanDateSql,
72+
Collections.singletonMap("date", date),
73+
RowMappers::forUsersActivationFullDto
74+
);
75+
}
76+
6277
@Override
6378
public long countByActivationKey(String activationKey) {
6479
return jdbcTemplate.queryForObject(

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import ru.mystamps.web.dao.dto.CollectionInfoDto;
2525
import ru.mystamps.web.dao.dto.SeriesFullInfoDto;
2626
import ru.mystamps.web.dao.dto.UsersActivationDto;
27+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
2728
import ru.mystamps.web.service.dto.LinkEntityDto;
2829
import ru.mystamps.web.service.dto.SelectEntityDto;
2930
import ru.mystamps.web.service.dto.SeriesInfoDto;
@@ -165,6 +166,15 @@ public static UsersActivationDto forUsersActivationDto(ResultSet rs, int i) thro
165166
);
166167
}
167168

169+
// CheckStyle: ignore LineLength for next 1 line
170+
public static UsersActivationFullDto forUsersActivationFullDto(ResultSet rs, int i) throws SQLException {
171+
return new UsersActivationFullDto(
172+
rs.getString("activation_key"),
173+
rs.getString("email"),
174+
rs.getTimestamp("created_at")
175+
);
176+
}
177+
168178
public static CollectionInfoDto forCollectionInfoDto(ResultSet rs, int i) throws SQLException {
169179
return new CollectionInfoDto(
170180
rs.getInt("id"),

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717
*/
1818
package ru.mystamps.web.service;
1919

20-
import java.util.Date;
2120
import java.util.List;
2221

2322
import org.apache.commons.lang3.Validate;
24-
import org.apache.commons.lang3.time.DateUtils;
2523

2624
import org.slf4j.Logger;
2725
import org.slf4j.LoggerFactory;
@@ -31,26 +29,22 @@
3129

3230
import lombok.RequiredArgsConstructor;
3331

34-
import ru.mystamps.web.dao.UsersActivationDao;
35-
import ru.mystamps.web.entity.UsersActivation;
32+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
3633

3734
@RequiredArgsConstructor
3835
public class CronServiceImpl implements CronService {
3936
private static final String EVERY_DAY_AT_00_30 = "0 30 0 * * *";
4037

4138
private static final Logger LOG = LoggerFactory.getLogger(CronServiceImpl.class);
4239

43-
private final UsersActivationDao usersActivationDao;
4440
private final UsersActivationService usersActivationService;
4541

4642
@Override
4743
@Scheduled(cron = EVERY_DAY_AT_00_30)
4844
@Transactional
4945
public void purgeUsersActivations() {
50-
Date expiredSince = DateUtils.addDays(new Date(), -PURGE_AFTER_DAYS);
51-
52-
List<UsersActivation> expiredActivations =
53-
usersActivationDao.findByCreatedAtLessThan(expiredSince);
46+
List<UsersActivationFullDto> expiredActivations =
47+
usersActivationService.findOlderThan(PURGE_AFTER_DAYS);
5448

5549
Validate.validState(expiredActivations != null, "Expired activations should be non null");
5650

@@ -59,7 +53,7 @@ public void purgeUsersActivations() {
5953
return;
6054
}
6155

62-
for (UsersActivation activation : expiredActivations) {
56+
for (UsersActivationFullDto activation : expiredActivations) {
6357
LOG.info(
6458
"Delete expired activation (key: {}, email: {}, created: {})",
6559
activation.getActivationKey(),

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
*/
1818
package ru.mystamps.web.service;
1919

20+
import java.util.List;
2021
import java.util.Locale;
2122

2223
import ru.mystamps.web.dao.dto.UsersActivationDto;
24+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
2325
import ru.mystamps.web.service.dto.RegisterAccountDto;
2426

2527
public interface UsersActivationService {
2628
void add(RegisterAccountDto dto, Locale lang);
2729
void remove(String activationKey);
2830
UsersActivationDto findByActivationKey(String activationKey);
31+
List<UsersActivationFullDto> findOlderThan(int days);
2932
long countByActivationKey(String activationKey);
3033
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
package ru.mystamps.web.service;
1919

2020
import java.util.Date;
21+
import java.util.List;
2122
import java.util.Locale;
2223

2324
import org.apache.commons.lang3.RandomStringUtils;
2425
import org.apache.commons.lang3.Validate;
26+
import org.apache.commons.lang3.time.DateUtils;
2527

2628
import org.slf4j.Logger;
2729
import org.slf4j.LoggerFactory;
@@ -33,6 +35,7 @@
3335
import ru.mystamps.web.dao.JdbcUsersActivationDao;
3436
import ru.mystamps.web.dao.dto.AddUsersActivationDbDto;
3537
import ru.mystamps.web.dao.dto.UsersActivationDto;
38+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
3639
import ru.mystamps.web.service.dto.RegisterAccountDto;
3740
import ru.mystamps.web.service.dto.SendUsersActivationDto;
3841
import ru.mystamps.web.support.togglz.Features;
@@ -85,6 +88,16 @@ public UsersActivationDto findByActivationKey(String activationKey) {
8588
return usersActivationDao.findByActivationKey(activationKey);
8689
}
8790

91+
@Override
92+
@Transactional(readOnly = true)
93+
public List<UsersActivationFullDto> findOlderThan(int days) {
94+
Validate.isTrue(days > 0, "Days must be greater than zero");
95+
96+
Date expiredSince = DateUtils.addDays(new Date(), -days);
97+
98+
return usersActivationDao.findOlderThan(expiredSince);
99+
}
100+
88101
@Override
89102
@Transactional(readOnly = true)
90103
public long countByActivationKey(String activationKey) {

src/main/resources/sql/users_activation_dao_queries.properties

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ SELECT email \
44
FROM users_activation \
55
WHERE act_key = :activation_key
66

7+
users_activation.find_older_than = \
8+
SELECT activation_key \
9+
, email \
10+
, created_at \
11+
FROM users_activation \
12+
WHERE created_at < :date
13+
714
users_activation.count_by_activation_key = \
815
SELECT COUNT(*) \
916
FROM users_activation \

src/test/groovy/ru/mystamps/web/service/CronServiceImplTest.groovy

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,43 +19,40 @@ package ru.mystamps.web.service
1919

2020
import spock.lang.Specification
2121

22-
import ru.mystamps.web.dao.UsersActivationDao
23-
import ru.mystamps.web.entity.UsersActivation
24-
import ru.mystamps.web.tests.DateUtils
22+
import ru.mystamps.web.dao.dto.UsersActivationFullDto
2523

2624
class CronServiceImplTest extends Specification {
2725

28-
private UsersActivationDao usersActivationDao = Mock()
2926
private UsersActivationService usersActivationService = Mock()
3027

31-
private CronService service = new CronServiceImpl(usersActivationDao, usersActivationService)
28+
private CronService service = new CronServiceImpl(usersActivationService)
3229

3330
//
3431
// Tests for purgeUsersActivations()
3532
//
3633

37-
def "purgeUsersActivations() should get expired activations from dao"() {
34+
def "purgeUsersActivations() should get expired activations from service"() {
3835
when:
3936
service.purgeUsersActivations()
4037
then:
41-
1 * usersActivationDao.findByCreatedAtLessThan(_ as Date) >> []
38+
1 * usersActivationService.findOlderThan(_ as Integer) >> []
4239
}
4340

44-
def "purgeUsersActivations() should pass expired date to dao"() {
41+
def "purgeUsersActivations() should pass days to service"() {
4542
given:
46-
Date expectedDate = new Date() - CronService.PURGE_AFTER_DAYS
43+
int expectedDays = CronService.PURGE_AFTER_DAYS
4744
when:
4845
service.purgeUsersActivations()
4946
then:
50-
1 * usersActivationDao.findByCreatedAtLessThan({ Date passedDate ->
51-
assert DateUtils.roughlyEqual(passedDate, expectedDate)
47+
1 * usersActivationService.findOlderThan({ int days ->
48+
assert days == expectedDays
5249
return true
5350
}) >> []
5451
}
5552

56-
def "purgeUsersActivations() should throw exception when null activations was returned"() {
53+
def "purgeUsersActivations() should throw exception when null activations were returned"() {
5754
given:
58-
usersActivationDao.findByCreatedAtLessThan(_ as Date) >> null
55+
usersActivationService.findOlderThan(_ as Integer) >> null
5956
when:
6057
service.purgeUsersActivations()
6158
then:
@@ -64,8 +61,8 @@ class CronServiceImplTest extends Specification {
6461

6562
def "purgeUsersActivations() should delete expired activations"() {
6663
given:
67-
List<UsersActivation> expectedActivations = [ TestObjects.createUsersActivation() ]
68-
usersActivationDao.findByCreatedAtLessThan(_ as Date) >> expectedActivations
64+
List<UsersActivationFullDto> expectedActivations = [ TestObjects.createUsersActivationFullDto() ]
65+
usersActivationService.findOlderThan(_ as Integer) >> expectedActivations
6966
when:
7067
service.purgeUsersActivations()
7168
then:
@@ -74,7 +71,7 @@ class CronServiceImplTest extends Specification {
7471

7572
def "purgeUsersActivations() should do nothing if no activations"() {
7673
given:
77-
usersActivationDao.findByCreatedAtLessThan(_ as Date) >> []
74+
usersActivationService.findOlderThan(_ as Integer) >> []
7875
when:
7976
service.purgeUsersActivations()
8077
then:

src/test/java/ru/mystamps/web/service/TestObjects.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
import java.util.Date;
2121

2222
import ru.mystamps.web.dao.dto.UsersActivationDto;
23+
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
2324
import ru.mystamps.web.entity.Image;
2425
import ru.mystamps.web.entity.ImageData;
2526
import ru.mystamps.web.entity.User;
26-
import ru.mystamps.web.entity.UsersActivation;
2727
import ru.mystamps.web.service.dto.DbImageDto;
2828
import ru.mystamps.web.service.dto.LinkEntityDto;
2929
import ru.mystamps.web.service.dto.SeriesInfoDto;
@@ -49,11 +49,12 @@ final class TestObjects {
4949
private TestObjects() {
5050
}
5151

52-
public static UsersActivation createUsersActivation() {
53-
UsersActivation activation = new UsersActivation();
54-
activation.setActivationKey(TEST_ACTIVATION_KEY);
55-
activation.setEmail(TEST_EMAIL);
56-
activation.setCreatedAt(new Date());
52+
public static UsersActivationFullDto createUsersActivationFullDto() {
53+
UsersActivationFullDto activation = new UsersActivationFullDto(
54+
TEST_ACTIVATION_KEY,
55+
TEST_EMAIL,
56+
new Date()
57+
);
5758
return activation;
5859
}
5960

0 commit comments

Comments
 (0)