Skip to content

Commit b4d5304

Browse files
committed
ImageServiceImpl.save(): get rid of Image.
Addressed to #120 No functional changes.
1 parent e3eb6c5 commit b4d5304

File tree

8 files changed

+62
-46
lines changed

8 files changed

+62
-46
lines changed

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.springframework.mail.javamail.JavaMailSender;
2626
import org.springframework.scheduling.annotation.EnableAsync;
2727

28-
import ru.mystamps.web.dao.ImageDao;
2928
// CheckStyle: ignore AvoidStarImportCheck for next 1 line
3029
import ru.mystamps.web.service.*; // NOPMD: UnusedImports
3130
import ru.mystamps.web.support.spring.security.SecurityConfig;
@@ -43,9 +42,6 @@ public class ServicesConfig {
4342
@Autowired
4443
private StrategiesConfig strategiesConfig;
4544

46-
@Autowired
47-
private ImageDao imageDao;
48-
4945
@Autowired
5046
private JavaMailSender mailSender;
5147

@@ -84,7 +80,6 @@ public CronService getCronService() {
8480
public ImageService getImageService() {
8581
return new ImageServiceImpl(
8682
strategiesConfig.getImagePersistenceStrategy(),
87-
imageDao,
8883
daoConfig.getJdbcImageDao()
8984
);
9085
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import ru.mystamps.web.service.dto.ImageInfoDto;
2323

2424
public interface JdbcImageDao {
25+
Integer add(String type);
2526
void addToSeries(Integer seriesId, Integer imageId);
2627
ImageInfoDto findById(Integer imageId);
2728
List<Integer> findBySeriesId(Integer seriesId);

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@
2222
import java.util.List;
2323
import java.util.Map;
2424

25+
import org.apache.commons.lang3.Validate;
26+
2527
import org.springframework.beans.factory.annotation.Value;
2628
import org.springframework.dao.EmptyResultDataAccessException;
29+
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
2730
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
31+
import org.springframework.jdbc.support.GeneratedKeyHolder;
32+
import org.springframework.jdbc.support.KeyHolder;
2833

2934
import lombok.RequiredArgsConstructor;
3035

@@ -36,6 +41,9 @@ public class JdbcImageDaoImpl implements JdbcImageDao {
3641

3742
private final NamedParameterJdbcTemplate jdbcTemplate;
3843

44+
@Value("${image.add}")
45+
private String addImageSql;
46+
3947
@Value("${series_image.add}")
4048
private String addImageToSeriesSql;
4149

@@ -45,6 +53,27 @@ public class JdbcImageDaoImpl implements JdbcImageDao {
4553
@Value("${series_image.find_by_series_id}")
4654
private String findBySeriesIdSql;
4755

56+
@Override
57+
public Integer add(String type) {
58+
KeyHolder holder = new GeneratedKeyHolder();
59+
60+
int affected = jdbcTemplate.update(
61+
addImageSql,
62+
new MapSqlParameterSource(
63+
Collections.singletonMap("type", type)
64+
),
65+
holder
66+
);
67+
68+
Validate.validState(
69+
affected == 1,
70+
"Unexpected number of affected rows after adding image: %d",
71+
affected
72+
);
73+
74+
return Integer.valueOf(holder.getKey().intValue());
75+
}
76+
4877
@Override
4978
public void addToSeries(Integer seriesId, Integer imageId) {
5079
Map<String, Object> params = new HashMap<>();

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@
3232

3333
import lombok.RequiredArgsConstructor;
3434

35-
import ru.mystamps.web.dao.ImageDao;
3635
import ru.mystamps.web.dao.JdbcImageDao;
37-
import ru.mystamps.web.entity.Image;
3836
import ru.mystamps.web.service.dto.ImageDto;
3937
import ru.mystamps.web.service.dto.ImageInfoDto;
4038
import ru.mystamps.web.service.exception.ImagePersistenceException;
@@ -48,7 +46,6 @@ public class ImageServiceImpl implements ImageService {
4846
private static final Logger LOG = LoggerFactory.getLogger(ImageServiceImpl.class);
4947

5048
private final ImagePersistenceStrategy imagePersistenceStrategy;
51-
private final ImageDao imageDao;
5249
private final JdbcImageDao jdbcImageDao;
5350

5451
@Override
@@ -67,22 +64,19 @@ public Integer save(MultipartFile file) {
6764
contentType, extension
6865
);
6966

70-
Image image = new Image();
71-
image.setType(Image.Type.valueOf(extension.toUpperCase(Locale.US)));
67+
String imageType = extension.toUpperCase(Locale.US);
7268

73-
Image entity = imageDao.save(image);
74-
if (entity == null) {
69+
Integer id = jdbcImageDao.add(imageType);
70+
if (id == null) {
7571
throw new ImagePersistenceException("Can't save image");
7672
}
7773

78-
LOG.info("Image entity was saved to database ({})", entity);
74+
ImageInfoDto image = new ImageInfoDto(id, imageType);
75+
LOG.info("Image was saved to database ({})", image);
7976

80-
imagePersistenceStrategy.save(
81-
file,
82-
new ImageInfoDto(entity.getId(), image.getType().toString())
83-
);
77+
imagePersistenceStrategy.save(file, image);
8478

85-
return entity.getId();
79+
return image.getId();
8680
}
8781

8882
@Override

src/main/java/ru/mystamps/web/service/dto/ImageInfoDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919

2020
import lombok.Getter;
2121
import lombok.RequiredArgsConstructor;
22+
import lombok.ToString;
2223

2324
@Getter
2425
@RequiredArgsConstructor
26+
@ToString
2527
public class ImageInfoDto {
2628
private final Integer id;
2729
private final String type;

src/main/resources/sql/image_dao_queries.properties

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ VALUES \
3333
, :content \
3434
)
3535

36+
image.add = \
37+
INSERT \
38+
INTO images \
39+
( type ) \
40+
VALUES \
41+
( :type )
42+
3643
image.find_by_id = \
3744
SELECT id \
3845
, type \

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

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,26 @@ import org.springframework.web.multipart.MultipartFile
2222
import spock.lang.Specification
2323
import spock.lang.Unroll
2424

25-
import ru.mystamps.web.dao.ImageDao
2625
import ru.mystamps.web.dao.JdbcImageDao
27-
import ru.mystamps.web.entity.Image
2826
import ru.mystamps.web.service.dto.ImageDto
2927
import ru.mystamps.web.service.dto.ImageInfoDto
3028
import ru.mystamps.web.service.exception.ImagePersistenceException
3129

3230
class ImageServiceImplTest extends Specification {
3331

34-
private ImageDao imageDao = Mock()
3532
private JdbcImageDao jdbcImageDao = Mock()
3633
private MultipartFile multipartFile = Mock()
3734
private ImagePersistenceStrategy imagePersistenceStrategy = Mock()
3835

3936
private ImageService service = new ImageServiceImpl(
4037
imagePersistenceStrategy,
41-
imageDao,
4238
jdbcImageDao
4339
)
4440

4541
def setup() {
4642
multipartFile.getSize() >> 1024L
4743
multipartFile.getContentType() >> 'image/png'
48-
imageDao.save(_ as Image) >> new Image()
44+
jdbcImageDao.add(_ as String) >> 17
4945
}
5046

5147
//
@@ -90,33 +86,33 @@ class ImageServiceImplTest extends Specification {
9086
when:
9187
service.save(multipartFile)
9288
then:
93-
1 * imageDao.save(_ as Image) >> new Image()
89+
1 * jdbcImageDao.add(_ as String) >> 18
9490
}
9591

9692
@Unroll
97-
def "save() should pass content type '#contentType' to image dao"(String contentType, Image.Type expectedType) {
93+
def "save() should pass content type '#contentType' to image dao"(String contentType, String expectedType) {
9894
when:
9995
service.save(multipartFile)
10096
then:
10197
multipartFile.getContentType() >> contentType
10298
and:
103-
1 * imageDao.save({ Image image ->
104-
assert image?.type == expectedType
99+
1 * jdbcImageDao.add({ String type ->
100+
assert type == expectedType
105101
return true
106-
}) >> new Image()
102+
}) >> 19
107103
where:
108104
contentType || expectedType
109-
'image/jpeg' || Image.Type.JPEG
110-
'image/jpeg; charset=UTF-8' || Image.Type.JPEG
111-
'image/png' || Image.Type.PNG
112-
'image/png; charset=UTF8' || Image.Type.PNG
105+
'image/jpeg' || 'JPEG'
106+
'image/jpeg; charset=UTF-8' || 'JPEG'
107+
'image/png' || 'PNG'
108+
'image/png; charset=UTF8' || 'PNG'
113109
}
114110

115111
def "save() should throw exception when image dao returned null"() {
116112
when:
117113
service.save(multipartFile)
118114
then:
119-
imageDao.save(_ as Image) >> null
115+
jdbcImageDao.add(_ as String) >> null
120116
and:
121117
0 * imagePersistenceStrategy.save(_ as MultipartFile, _ as ImageInfoDto)
122118
and:
@@ -125,11 +121,11 @@ class ImageServiceImplTest extends Specification {
125121

126122
def "save() should call strategy"() {
127123
given:
128-
Image image = TestObjects.createImage()
124+
ImageInfoDto image = TestObjects.createImageInfoDto()
129125
when:
130126
String url = service.save(multipartFile)
131127
then:
132-
imageDao.save(_ as Image) >> image
128+
jdbcImageDao.add(_ as String) >> image.id
133129
and:
134130
1 * imagePersistenceStrategy.save({ MultipartFile passedFile ->
135131
assert passedFile == multipartFile
@@ -143,13 +139,13 @@ class ImageServiceImplTest extends Specification {
143139

144140
def "save() should return saved image"() {
145141
given:
146-
Image expectedImage = TestObjects.createImage()
142+
Integer expectedImageId = 20
147143
when:
148144
Integer actualImageId = service.save(multipartFile)
149145
then:
150-
imageDao.save(_ as Image) >> expectedImage
146+
jdbcImageDao.add(_ as String) >> expectedImageId
151147
and:
152-
actualImageId == expectedImage.getId()
148+
actualImageId == expectedImageId
153149
}
154150

155151
//

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import ru.mystamps.web.dao.dto.UserDetails;
2424
import ru.mystamps.web.dao.dto.UsersActivationDto;
2525
import ru.mystamps.web.dao.dto.UsersActivationFullDto;
26-
import ru.mystamps.web.entity.Image;
2726
import ru.mystamps.web.service.dto.DbImageDto;
2827
import ru.mystamps.web.service.dto.ImageInfoDto;
2928
import ru.mystamps.web.service.dto.LinkEntityDto;
@@ -101,13 +100,6 @@ public static UserDetails createUserDetails() {
101100
);
102101
}
103102

104-
public static Image createImage() {
105-
Image image = new Image();
106-
image.setId(1);
107-
image.setType(Image.Type.PNG);
108-
return image;
109-
}
110-
111103
public static ImageInfoDto createImageInfoDto() {
112104
return new ImageInfoDto(1, "PNG");
113105
}

0 commit comments

Comments
 (0)