Skip to content

Commit dcffa75

Browse files
committed
Port category creation from JPA to JDBC.
Addressed to #120 No functional changes.
1 parent a886cda commit dcffa75

File tree

8 files changed

+134
-50
lines changed

8 files changed

+134
-50
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
@@ -35,9 +35,6 @@
3535
@EnableAsync
3636
public class ServicesConfig {
3737

38-
@Inject
39-
private CategoryDao categoryDao;
40-
4138
@Inject
4239
private DaoConfig daoConfig;
4340

@@ -78,7 +75,7 @@ public CountryService getCountryService() {
7875

7976
@Bean
8077
public CategoryService getCategoryService() {
81-
return new CategoryServiceImpl(categoryDao, daoConfig.getJdbcCategoryDao());
78+
return new CategoryServiceImpl(daoConfig.getJdbcCategoryDao());
8279
}
8380

8481
@Bean

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

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

2020
import java.util.Map;
2121

22+
import ru.mystamps.web.dao.dto.AddCategoryDbDto;
2223
import ru.mystamps.web.service.dto.LinkEntityDto;
2324
import ru.mystamps.web.service.dto.SelectEntityDto;
2425

2526
public interface JdbcCategoryDao {
27+
Integer add(AddCategoryDbDto category);
2628
long countAll();
2729
long countByName(String name);
2830
long countByNameRu(String name);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright (C) 2009-2015 Slava Semushin <[email protected]>
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.Setter;
24+
import lombok.ToString;
25+
26+
@Getter
27+
@Setter
28+
@ToString(of = { "name", "nameRu"})
29+
public class AddCategoryDbDto {
30+
private String name;
31+
private String nameRu;
32+
private String slug;
33+
private Date createdAt;
34+
private Integer createdBy;
35+
private Date updatedAt;
36+
private Integer updatedBy;
37+
}

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,18 @@
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;
28+
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
2629
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
30+
import org.springframework.jdbc.support.GeneratedKeyHolder;
31+
import org.springframework.jdbc.support.KeyHolder;
2732

2833
import lombok.RequiredArgsConstructor;
2934

3035
import ru.mystamps.web.dao.JdbcCategoryDao;
36+
import ru.mystamps.web.dao.dto.AddCategoryDbDto;
3137
import ru.mystamps.web.service.dto.LinkEntityDto;
3238
import ru.mystamps.web.service.dto.SelectEntityDto;
3339

@@ -36,6 +42,9 @@ public class JdbcCategoryDaoImpl implements JdbcCategoryDao {
3642

3743
private final NamedParameterJdbcTemplate jdbcTemplate;
3844

45+
@Value("${category.create}")
46+
private String addCategorySql;
47+
3948
@Value("${category.count_all_categories}")
4049
private String countAllSql;
4150

@@ -57,6 +66,34 @@ public class JdbcCategoryDaoImpl implements JdbcCategoryDao {
5766
@Value("${category.find_all_categories_names_with_slug}")
5867
private String findCategoriesNamesWithSlugSql;
5968

69+
@Override
70+
public Integer add(AddCategoryDbDto category) {
71+
Map<String, Object> params = new HashMap<>();
72+
params.put("name", category.getName());
73+
params.put("name_ru", category.getNameRu());
74+
params.put("slug", category.getSlug());
75+
params.put("created_at", category.getCreatedAt());
76+
params.put("created_by", category.getCreatedBy());
77+
params.put("updated_at", category.getUpdatedAt());
78+
params.put("updated_by", category.getUpdatedBy());
79+
80+
KeyHolder holder = new GeneratedKeyHolder();
81+
82+
int affected = jdbcTemplate.update(
83+
addCategorySql,
84+
new MapSqlParameterSource(params),
85+
holder
86+
);
87+
88+
Validate.validState(
89+
affected == 1,
90+
"Unexpected number of affected rows after creation of category: %d",
91+
affected
92+
);
93+
94+
return Integer.valueOf(holder.getKey().intValue());
95+
}
96+
6097
@Override
6198
public long countAll() {
6299
return jdbcTemplate.queryForObject(

src/main/java/ru/mystamps/web/entity/Category.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,6 @@ public String toString() {
6767
return String.valueOf(id);
6868
}
6969

70-
public String toLongString() {
71-
return new StringBuilder()
72-
.append("Category(id=")
73-
.append(id)
74-
.append(", name=")
75-
.append(name)
76-
.append(", nameRu=")
77-
.append(nameRu)
78-
.append(')')
79-
.toString();
80-
}
81-
8270
@Override
8371
public String getLocalizedName(Locale locale) {
8472
return LocaleUtils.getLocalizedName(locale, this);

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232
import lombok.RequiredArgsConstructor;
3333

3434
import ru.mystamps.web.dao.JdbcCategoryDao;
35+
import ru.mystamps.web.dao.dto.AddCategoryDbDto;
3536
import ru.mystamps.web.entity.Category;
3637
import ru.mystamps.web.entity.Collection;
3738
import ru.mystamps.web.entity.User;
38-
import ru.mystamps.web.dao.CategoryDao;
3939
import ru.mystamps.web.service.dto.AddCategoryDto;
4040
import ru.mystamps.web.service.dto.LinkEntityDto;
4141
import ru.mystamps.web.service.dto.SelectEntityDto;
@@ -46,7 +46,6 @@
4646
public class CategoryServiceImpl implements CategoryService {
4747
private static final Logger LOG = LoggerFactory.getLogger(CategoryServiceImpl.class);
4848

49-
private final CategoryDao categoryDao;
5049
private final JdbcCategoryDao jdbcCategoryDao;
5150

5251
@Override
@@ -58,7 +57,7 @@ public UrlEntityDto add(AddCategoryDto dto, User user) {
5857
Validate.isTrue(dto.getNameRu() != null, "Russian category name should be non null");
5958
Validate.isTrue(user != null, "Current user must be non null");
6059

61-
Category category = new Category();
60+
AddCategoryDbDto category = new AddCategoryDbDto();
6261
category.setName(dto.getName());
6362
category.setNameRu(dto.getNameRu());
6463

@@ -70,16 +69,16 @@ public UrlEntityDto add(AddCategoryDto dto, User user) {
7069
category.setSlug(slug);
7170

7271
Date now = new Date();
73-
category.getMetaInfo().setCreatedAt(now);
74-
category.getMetaInfo().setUpdatedAt(now);
72+
category.setCreatedAt(now);
73+
category.setUpdatedAt(now);
7574

76-
category.getMetaInfo().setCreatedBy(user);
77-
category.getMetaInfo().setUpdatedBy(user);
75+
category.setCreatedBy(user.getId());
76+
category.setUpdatedBy(user.getId());
7877

79-
Category entity = categoryDao.save(category);
80-
LOG.info("Category has been created ({})", entity.toLongString());
78+
Integer id = jdbcCategoryDao.add(category);
79+
LOG.info("Category #{} has been created ({})", id, category);
8180

82-
return new UrlEntityDto(entity.getId(), entity.getSlug());
81+
return new UrlEntityDto(id, slug);
8382
}
8483

8584
@Override

src/main/resources/sql/category_dao_queries.properties

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
1+
category.create = \
2+
INSERT \
3+
INTO categories \
4+
( name \
5+
, name_ru \
6+
, slug \
7+
, created_at \
8+
, created_by \
9+
, updated_at \
10+
, updated_by \
11+
) \
12+
VALUES \
13+
( :name \
14+
, :name_ru \
15+
, :slug \
16+
, :created_at \
17+
, :created_by \
18+
, :updated_at \
19+
, :updated_by \
20+
)
21+
122
category.count_all_categories = \
223
SELECT COUNT(*) \
324
FROM categories

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

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ package ru.mystamps.web.service
2020
import spock.lang.Specification
2121
import spock.lang.Unroll
2222

23-
import ru.mystamps.web.dao.CategoryDao
2423
import ru.mystamps.web.dao.JdbcCategoryDao
24+
import ru.mystamps.web.dao.dto.AddCategoryDbDto
2525
import ru.mystamps.web.entity.Category
2626
import ru.mystamps.web.entity.Collection
2727
import ru.mystamps.web.entity.User
@@ -37,9 +37,8 @@ class CategoryServiceImplTest extends Specification {
3737
private AddCategoryForm form
3838
private User user
3939

40-
private CategoryDao categoryDao = Mock()
4140
private JdbcCategoryDao jdbcCategoryDao = Mock()
42-
private CategoryService service = new CategoryServiceImpl(categoryDao, jdbcCategoryDao)
41+
private CategoryService service = new CategoryServiceImpl(jdbcCategoryDao)
4342

4443
def setup() {
4544
form = new AddCategoryForm()
@@ -87,11 +86,15 @@ class CategoryServiceImplTest extends Specification {
8786

8887
def "add() should call dao"() {
8988
given:
90-
Category category = TestObjects.createCategory()
89+
Integer expectedId = 10
9190
and:
92-
categoryDao.save(_ as Category) >> category
91+
form.setName('Example Category')
9392
and:
94-
UrlEntityDto expected = new UrlEntityDto(category.getId(), category.getSlug())
93+
String expectedSlug = 'example-category'
94+
and:
95+
jdbcCategoryDao.add(_ as AddCategoryDbDto) >> expectedId
96+
and:
97+
UrlEntityDto expected = new UrlEntityDto(expectedId, expectedSlug)
9598
when:
9699
UrlEntityDto actual = service.add(form, user)
97100
then:
@@ -105,10 +108,10 @@ class CategoryServiceImplTest extends Specification {
105108
when:
106109
service.add(form, user)
107110
then:
108-
1 * categoryDao.save({ Category category ->
111+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
109112
assert category?.name == expectedCategoryName
110113
return true
111-
}) >> TestObjects.createCategory()
114+
}) >> 20
112115
}
113116

114117
def "add() should pass Russian category name to dao"() {
@@ -118,10 +121,10 @@ class CategoryServiceImplTest extends Specification {
118121
when:
119122
service.add(form, user)
120123
then:
121-
1 * categoryDao.save({ Category category ->
124+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
122125
assert category?.nameRu == expectedCategoryName
123126
return true
124-
}) >> TestObjects.createCategory()
127+
}) >> 30
125128
}
126129

127130
def "add() should throw exception when name can't be converted to slug"() {
@@ -143,50 +146,50 @@ class CategoryServiceImplTest extends Specification {
143146
when:
144147
service.add(form, user)
145148
then:
146-
1 * categoryDao.save({ Category category ->
149+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
147150
assert category?.slug == slug
148151
return true
149-
}) >> TestObjects.createCategory()
152+
}) >> 40
150153
}
151154

152155
def "add() should assign created at to current date"() {
153156
when:
154157
service.add(form, user)
155158
then:
156-
1 * categoryDao.save({ Category category ->
157-
assert DateUtils.roughlyEqual(category?.metaInfo?.createdAt, new Date())
159+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
160+
assert DateUtils.roughlyEqual(category?.createdAt, new Date())
158161
return true
159-
}) >> TestObjects.createCategory()
162+
}) >> 50
160163
}
161164

162165
def "add() should assign updated at to current date"() {
163166
when:
164167
service.add(form, user)
165168
then:
166-
1 * categoryDao.save({ Category category ->
167-
assert DateUtils.roughlyEqual(category?.metaInfo?.updatedAt, new Date())
169+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
170+
assert DateUtils.roughlyEqual(category?.updatedAt, new Date())
168171
return true
169-
}) >> TestObjects.createCategory()
172+
}) >> 60
170173
}
171174

172175
def "add() should assign created by to user"() {
173176
when:
174177
service.add(form, user)
175178
then:
176-
1 * categoryDao.save({ Category category ->
177-
assert category?.metaInfo?.createdBy == user
179+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
180+
assert category?.createdBy == user.id
178181
return true
179-
}) >> TestObjects.createCategory()
182+
}) >> 70
180183
}
181184

182185
def "add() should assign updated by to user"() {
183186
when:
184187
service.add(form, user)
185188
then:
186-
1 * categoryDao.save({ Category category ->
187-
assert category?.metaInfo?.updatedBy == user
189+
1 * jdbcCategoryDao.add({ AddCategoryDbDto category ->
190+
assert category?.updatedBy == user.id
188191
return true
189-
}) >> TestObjects.createCategory()
192+
}) >> 80
190193
}
191194

192195
//

0 commit comments

Comments
 (0)