Skip to content

Commit 0acabfc

Browse files
committed
Import series: create seller if it hasn't been found in database.
Addressed to #695
1 parent 9360f6f commit 0acabfc

24 files changed

+368
-25
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ public SeriesImportService getSeriesImportService() {
181181
getSeriesSalesService(),
182182
getSeriesSalesImportService(),
183183
getSeriesInfoExtractorService(),
184+
getTransactionParticipantService(),
184185
eventPublisher
185186
);
186187
}

src/main/java/ru/mystamps/web/controller/SeriesImportController.java

+7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
import ru.mystamps.web.Url;
4242
import ru.mystamps.web.controller.converter.annotation.CurrentUser;
43+
import ru.mystamps.web.controller.dto.ImportSellerForm;
4344
import ru.mystamps.web.controller.dto.ImportSeriesForm;
4445
import ru.mystamps.web.controller.dto.ImportSeriesSalesForm;
4546
import ru.mystamps.web.controller.dto.RequestImportForm;
@@ -141,6 +142,11 @@ public String showRequestAndImportSeriesForm(
141142
seriesSaleForm.setPrice(seriesSale.getPrice());
142143
seriesSaleForm.setCurrency(seriesSale.getCurrency());
143144

145+
ImportSellerForm sellerForm = new ImportSellerForm();
146+
sellerForm.setName(seriesSale.getSellerName());
147+
sellerForm.setUrl(seriesSale.getSellerUrl());
148+
149+
form.setSeller(sellerForm);
144150
form.setSeriesSale(seriesSaleForm);
145151

146152
if (seriesSale.getSellerId() != null) {
@@ -213,6 +219,7 @@ public String processImportSeriesForm(
213219

214220
Integer seriesId = seriesImportService.addSeries(
215221
form,
222+
form.getSeller(),
216223
seriesSaleForm,
217224
requestId,
218225
currentUserId

src/main/java/ru/mystamps/web/controller/TestController.java

+23
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,27 @@ public void seriesInfoWithExistingSeller(HttpServletResponse response) throws IO
9090
);
9191
}
9292

93+
@GetMapping("/test/valid/series-info/new-seller")
94+
public void seriesInfoWithNewSeller(HttpServletResponse response) throws IOException {
95+
response.setContentType("text/html");
96+
response.setCharacterEncoding("UTF-8");
97+
response.getWriter().println(
98+
"<!DOCTYPE html>"
99+
+ "<html>"
100+
+ "<head>"
101+
+ "<title>Series info (new seller)</title>"
102+
+ "</head>"
103+
+ "<body>"
104+
// CheckStyle: ignore LineLength for next 2 lines
105+
+ "Image: <a id=\"series-image-link-1\" href=\"/image/1\">series image</a><br />"
106+
+ "Seller: <a id=\"test-seller\" href=\"http://example.com/lando-livianus\">Lando Livianus</a><br />"
107+
+ "Price: <span id=\"test-price\">320.5</span> RUB<br />"
108+
// this is needed to simplify an integration test
109+
// (required fields "category" and "quantity" will be filled automatically)
110+
+ "Info: <span class=\"dl-horizontal\">Спорт, 7 марок</span>"
111+
+ "</body>"
112+
+ "</html>"
113+
);
114+
}
115+
93116
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright (C) 2009-2018 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.controller.dto;
19+
20+
import lombok.Getter;
21+
import lombok.Setter;
22+
23+
import ru.mystamps.web.service.dto.AddParticipantDto;
24+
25+
@Getter
26+
@Setter
27+
public class ImportSellerForm implements AddParticipantDto {
28+
29+
// @todo #695 /series/import/request/{id}(seller.name): trim empty values to null
30+
// @todo #695 /series/import/request/{id}(seller.name): add validation against short values
31+
// @todo #695 /series/import/request/{id}(seller.name): add validation against long values
32+
private String name;
33+
34+
// @todo #695 /series/import/request/{id}(seller.url): trim empty values to null
35+
// @todo #695 /series/import/request/{id}(seller.url): add validation for valid url
36+
// @todo #695 /series/import/request/{id}(seller.url): add validation against long values
37+
private String url;
38+
39+
@Override
40+
public Integer getGroupId() {
41+
return null;
42+
}
43+
44+
@Override
45+
public Boolean getBuyer() {
46+
return Boolean.FALSE;
47+
}
48+
49+
@Override
50+
public Boolean getSeller() {
51+
return Boolean.TRUE;
52+
}
53+
54+
}

src/main/java/ru/mystamps/web/controller/dto/ImportSeriesForm.java

+3
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ public class ImportSeriesForm implements AddSeriesDto, NullableImageUrl {
8585
@NotNull
8686
private MultipartFile downloadedImage;
8787

88+
@Valid
89+
private ImportSellerForm seller;
90+
8891
@Valid
8992
private ImportSeriesSalesForm seriesSale;
9093

src/main/java/ru/mystamps/web/controller/dto/ImportSeriesSalesForm.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@
3030
import ru.mystamps.web.dao.dto.Currency;
3131
import ru.mystamps.web.service.dto.AddSeriesSalesDto;
3232

33+
// @todo #695 /series/import/request/{id}: seller's name and url are required when sellerId is empty
3334
// @todo #695 /series/import/request/{id}(seriesSale):
3435
// add integration test for validation of required fields
3536
@Getter
3637
@Setter
3738
public class ImportSeriesSalesForm implements AddSeriesSalesDto {
3839

39-
@NotNull
4040
private Integer sellerId;
4141

4242
@NotNull

src/main/java/ru/mystamps/web/dao/dto/SeriesSaleParsedDataDto.java

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
@RequiredArgsConstructor
2727
public class SeriesSaleParsedDataDto {
2828
private final Integer sellerId;
29+
private final String sellerName;
30+
private final String sellerUrl;
2931
private final BigDecimal price;
3032
private final Currency currency;
3133
}

src/main/java/ru/mystamps/web/dao/dto/SeriesSalesParsedDataDbDto.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
@ToString(exclude = { "createdAt", "updatedAt" })
3030
public class SeriesSalesParsedDataDbDto {
3131
private Integer sellerId;
32+
private String sellerName;
33+
private String sellerUrl;
3234
private BigDecimal price;
3335
private String currency;
3436
private Date createdAt;
@@ -37,7 +39,9 @@ public class SeriesSalesParsedDataDbDto {
3739
// they aren't useless
3840
@SuppressWarnings("PMD.UselessParentheses")
3941
public boolean hasAtLeastOneFieldFilled() {
40-
return sellerId != null || (price != null && currency != null);
42+
return sellerId != null
43+
|| (sellerName != null && sellerUrl != null)
44+
|| (price != null && currency != null);
4145
}
4246

4347
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public void addParsedData(Integer requestId, SeriesSalesParsedDataDbDto data) {
5252
Map<String, Object> params = new HashMap<>();
5353
params.put("request_id", requestId);
5454
params.put("seller_id", data.getSellerId());
55+
params.put("seller_name", data.getSellerName());
56+
params.put("seller_url", data.getSellerUrl());
5557
params.put("price", data.getPrice());
5658
params.put("currency", data.getCurrency());
5759
params.put("created_at", data.getCreatedAt());

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -306,10 +306,12 @@ public static SeriesSaleParsedDataDto forSeriesSaleParsedDataDto(ResultSet rs, i
306306
throws SQLException {
307307

308308
Integer sellerId = JdbcUtils.getInteger(rs, "seller_id");
309+
String sellerName = rs.getString("seller_name");
310+
String sellerUrl = rs.getString("seller_url");
309311
BigDecimal price = rs.getBigDecimal("price");
310312
Currency currency = JdbcUtils.getCurrency(rs, "currency");
311313

312-
return new SeriesSaleParsedDataDto(sellerId, price, currency);
314+
return new SeriesSaleParsedDataDto(sellerId, sellerName, sellerUrl, price, currency);
313315
}
314316

315317
public static ImportRequestInfo forImportRequestInfo(ResultSet rs, int unused)

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,22 @@
2323
import ru.mystamps.web.dao.dto.ImportRequestFullInfo;
2424
import ru.mystamps.web.dao.dto.ImportRequestInfo;
2525
import ru.mystamps.web.dao.dto.SeriesParsedDataDto;
26+
import ru.mystamps.web.service.dto.AddParticipantDto;
2627
import ru.mystamps.web.service.dto.AddSeriesDto;
2728
import ru.mystamps.web.service.dto.AddSeriesSalesDto;
2829
import ru.mystamps.web.service.dto.RawParsedDataDto;
2930
import ru.mystamps.web.service.dto.RequestImportDto;
3031

3132
public interface SeriesImportService {
3233
Integer addRequest(RequestImportDto dto, Integer userId);
33-
Integer addSeries(AddSeriesDto dto, AddSeriesSalesDto sale, Integer requestId, Integer userId);
34+
// @todo #695 SeriesImportService.addSeries(): introduce DTO object
35+
Integer addSeries(
36+
AddSeriesDto dto,
37+
AddParticipantDto sellerDto,
38+
AddSeriesSalesDto sale,
39+
Integer requestId,
40+
Integer userId
41+
);
3442
void changeStatus(Integer requestId, String oldStatus, String newStatus);
3543
ImportRequestDto findById(Integer requestId);
3644
void saveDownloadedContent(Integer requestId, String content);

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

+9
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import ru.mystamps.web.dao.dto.ImportSeriesDbDto;
4545
import ru.mystamps.web.dao.dto.SeriesParsedDataDto;
4646
import ru.mystamps.web.dao.dto.SeriesSalesParsedDataDbDto;
47+
import ru.mystamps.web.service.dto.AddParticipantDto;
4748
import ru.mystamps.web.service.dto.AddSeriesDto;
4849
import ru.mystamps.web.service.dto.AddSeriesSalesDto;
4950
import ru.mystamps.web.service.dto.RawParsedDataDto;
@@ -62,6 +63,7 @@ public class SeriesImportServiceImpl implements SeriesImportService {
6263
private final SeriesSalesService seriesSalesService;
6364
private final SeriesSalesImportService seriesSalesImportService;
6465
private final SeriesInfoExtractorService extractorService;
66+
private final TransactionParticipantService transactionParticipantService;
6567
private final ApplicationEventPublisher eventPublisher;
6668

6769
@Override
@@ -100,13 +102,18 @@ public Integer addRequest(RequestImportDto dto, Integer userId) {
100102
@PreAuthorize(HasAuthority.IMPORT_SERIES)
101103
public Integer addSeries(
102104
AddSeriesDto dto,
105+
AddParticipantDto sellerDto,
103106
AddSeriesSalesDto saleDto,
104107
Integer requestId,
105108
Integer userId) {
106109

107110
Integer seriesId = seriesService.add(dto, userId, false);
108111

109112
if (saleDto != null) {
113+
if (saleDto.getSellerId() == null && sellerDto != null) {
114+
Integer sellerId = transactionParticipantService.add(sellerDto);
115+
saleDto.setSellerId(sellerId);
116+
}
110117
seriesSalesService.add(saleDto, seriesId, userId);
111118
}
112119

@@ -197,6 +204,8 @@ public void saveParsedData(Integer requestId, RawParsedDataDto data) {
197204
seriesSalesParsedData.setCreatedAt(now);
198205
seriesSalesParsedData.setUpdatedAt(now);
199206
seriesSalesParsedData.setSellerId(seriesInfo.getSellerId());
207+
seriesSalesParsedData.setSellerName(seriesInfo.getSellerName());
208+
seriesSalesParsedData.setSellerUrl(seriesInfo.getSellerUrl());
200209
seriesSalesParsedData.setPrice(seriesInfo.getPrice());
201210
seriesSalesParsedData.setCurrency(seriesInfo.getCurrency());
202211

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

+30
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ public SeriesExtractedInfo extract(RawParsedDataDto data) {
7979
Integer quantity = extractQuantity(data.getQuantity());
8080
Boolean perforated = extractPerforated(data.getPerforated());
8181
Integer sellerId = extractSeller(data.getSellerName(), data.getSellerUrl());
82+
String sellerName = extractSellerName(sellerId, data.getSellerName());
83+
String sellerUrl = extractSellerUrl(sellerId, data.getSellerUrl());
8284
BigDecimal price = extractPrice(data.getPrice());
8385
String currency = extractCurrency(data.getCurrency());
8486

@@ -89,6 +91,8 @@ public SeriesExtractedInfo extract(RawParsedDataDto data) {
8991
quantity,
9092
perforated,
9193
sellerId,
94+
sellerName,
95+
sellerUrl,
9296
price,
9397
currency
9498
);
@@ -258,6 +262,32 @@ public Integer extractSeller(String name, String url) {
258262
return null;
259263
}
260264

265+
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerName(): add unit tests
266+
protected String extractSellerName(Integer id, String name) {
267+
if (id != null) {
268+
return null;
269+
}
270+
271+
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerName(): filter out short names
272+
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerName(): filter out long names
273+
274+
// we need a name ony if we couldn't find a seller in database (id == null)
275+
return name;
276+
}
277+
278+
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerUrl(): add unit tests
279+
protected String extractSellerUrl(Integer id, String url) {
280+
if (id != null) {
281+
return null;
282+
}
283+
284+
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerUrl(): filter out non-urls
285+
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerUrl(): filter out too long urls
286+
287+
// we need a url ony if we couldn't find a seller in database (id == null)
288+
return url;
289+
}
290+
261291
public BigDecimal extractPrice(String fragment) {
262292
if (StringUtils.isBlank(fragment)) {
263293
return null;

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

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
public interface AddSeriesSalesDto {
2626
Date getDate();
2727
Integer getSellerId();
28+
void setSellerId(Integer id);
2829
String getUrl();
2930
BigDecimal getPrice();
3031
Currency getCurrency();

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

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public class SeriesExtractedInfo {
3232
private final Integer quantity;
3333
private final Boolean perforated;
3434
private final Integer sellerId;
35+
private final String sellerName;
36+
private final String sellerUrl;
3537
private final BigDecimal price;
3638
private final String currency;
3739
}

src/main/resources/liquibase/version/0.4.xml

+1
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@
4747
<include file="0.4/2018-01-01--add_quantity_to_parsed_data.xml" relativeToChangelogFile="true" />
4848
<include file="0.4/2018-01-01--add_perforated_to_parsed_data.xml" relativeToChangelogFile="true" />
4949
<include file="0.4/2018-01-04--series_sales_import_parsed_data.xml" relativeToChangelogFile="true" />
50+
<include file="0.4/2018-02-09--add_seller_info_to_parsed_data.xml" relativeToChangelogFile="true" />
5051

5152
</databaseChangeLog>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
7+
8+
<changeSet id="add-seller-info-fields-to-series_sales_import_parsed_data" author="php-coder" context="scheme">
9+
10+
<addColumn tableName="series_sales_import_parsed_data">
11+
12+
<column name="seller_name" type="VARCHAR(50)" afterColumn="seller_id"
13+
remarks="Must match to the transaction_participants.name field" />
14+
15+
<column name="seller_url" type="VARCHAR(255)" afterColumn="seller_name"
16+
remarks="Must match to the transaction_participants.url field" />
17+
18+
</addColumn>
19+
20+
</changeSet>
21+
22+
</databaseChangeLog>

src/main/resources/ru/mystamps/i18n/Messages.properties

+2
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@ t_status = Status
201201
t_imported_series = Imported series
202202
t_gathered_data = Gathered data
203203
t_import = Import
204+
t_seller_url = Seller URL
205+
t_seller_name = Seller name
204206

205207
# series/import/list.html
206208
t_no_import_requests = No import requests

src/main/resources/ru/mystamps/i18n/Messages_ru.properties

+2
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ t_status = Статус
200200
t_imported_series = Импортированная серия
201201
t_gathered_data = Собранные данные
202202
t_import = Импортировать
203+
t_seller_url = Страница продавца
204+
t_seller_name = Имя продавца
203205

204206
# series/import/list.html
205207
t_no_import_requests = Нет запросов на импорт

0 commit comments

Comments
 (0)