diff --git a/parsing-service/.run/ParsingService [local].run.xml b/parsing-service/.run/ParsingService [local].run.xml
index 8d50103..e52cf8e 100644
--- a/parsing-service/.run/ParsingService [local].run.xml
+++ b/parsing-service/.run/ParsingService [local].run.xml
@@ -14,4 +14,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/parsing-service/build.gradle b/parsing-service/build.gradle
index 0fc9ca5..d6697fa 100644
--- a/parsing-service/build.gradle
+++ b/parsing-service/build.gradle
@@ -48,6 +48,7 @@ dependencies {
testImplementation 'org.springframework.kafka:spring-kafka-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+ implementation 'org.springframework.boot:spring-boot-starter-webflux'
}
tasks.named('test') {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java
index b1c2e92..47fdec6 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java
@@ -1,10 +1,10 @@
package ru.pricepulse.parsingservice.config;
-import java.time.format.DateTimeFormatter;
-
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import java.time.format.DateTimeFormatter;
+
@Configuration
public class DateTimeFormatterConfig {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java
index 1a8b6e0..3abbd4c 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java
@@ -1,7 +1,6 @@
package ru.pricepulse.parsingservice.config;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
-import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java
index 10a3ebc..0a6df54 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java
@@ -1,8 +1,5 @@
package ru.pricepulse.parsingservice.config;
-import java.util.HashMap;
-import java.util.Map;
-
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
@@ -13,6 +10,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Scope;
+import java.util.HashMap;
+import java.util.Map;
+
@Configuration
public class WebDriverConfig {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java
index 545622e..03d2a7a 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java
@@ -1,11 +1,11 @@
package ru.pricepulse.parsingservice.config.properties;
-import java.util.List;
-
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import java.util.List;
+
@Getter
@Setter
@ConfigurationProperties(prefix = "marketplace.ozon")
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Category.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Category.java
new file mode 100644
index 0000000..a55bd5d
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Category.java
@@ -0,0 +1,5 @@
+package ru.pricepulse.parsingservice.enumeration;
+
+public enum Category {
+ LAPTOP
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Marketplace.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Marketplace.java
new file mode 100644
index 0000000..6c1e085
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Marketplace.java
@@ -0,0 +1,8 @@
+package ru.pricepulse.parsingservice.enumeration;
+
+public enum Marketplace {
+ WILDBERRIES,
+ OZON,
+ DNS
+}
+
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/pool/WebDriverPool.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/pool/WebDriverPool.java
similarity index 94%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/pool/WebDriverPool.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/pool/WebDriverPool.java
index 9f1cf3f..1a57a6c 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/pool/WebDriverPool.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/pool/WebDriverPool.java
@@ -1,15 +1,13 @@
-package ru.pricepulse.parsingservice.pool;
-
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
+package ru.pricepulse.parsingservice.ozon_parser.pool;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.stereotype.Component;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
@Slf4j
@Component
public class WebDriverPool {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/DataParser.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/DataParser.java
similarity index 83%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/DataParser.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/DataParser.java
index 27ca290..4eb5606 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/DataParser.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/DataParser.java
@@ -1,4 +1,4 @@
-package ru.pricepulse.parsingservice.service;
+package ru.pricepulse.parsingservice.ozon_parser.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -6,8 +6,8 @@ import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.springframework.stereotype.Service;
-import ru.pricepulse.parsingservice.service.dto.ParsedData;
-import ru.pricepulse.parsingservice.service.messaging.ParsedDataProducer;
+import ru.pricepulse.parsingservice.ozon_parser.service.dto.ParsedData;
+import ru.pricepulse.parsingservice.ozon_parser.service.messaging.ParsedDataProducer;
@Slf4j
@Service
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/MarketplaceParsingService.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/MarketplaceParsingService.java
similarity index 62%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/MarketplaceParsingService.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/MarketplaceParsingService.java
index c811f2b..e767aa0 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/MarketplaceParsingService.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/MarketplaceParsingService.java
@@ -1,4 +1,4 @@
-package ru.pricepulse.parsingservice.service;
+package ru.pricepulse.parsingservice.ozon_parser.service;
public interface MarketplaceParsingService {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/PartitionService.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/PartitionService.java
similarity index 93%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/PartitionService.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/PartitionService.java
index edb4e72..2371095 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/PartitionService.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/PartitionService.java
@@ -1,4 +1,4 @@
-package ru.pricepulse.parsingservice.service;
+package ru.pricepulse.parsingservice.ozon_parser.service;
import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/dto/ParsedData.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java
similarity index 59%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/dto/ParsedData.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java
index 6adeb5e..1bfba10 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/dto/ParsedData.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java
@@ -1,14 +1,14 @@
-package ru.pricepulse.parsingservice.service.dto;
+package ru.pricepulse.parsingservice.ozon_parser.service.dto;
import lombok.Getter;
import lombok.Setter;
-import ru.pricepulse.parsingservice.persistence.enums.MarketplaceEnum;
+import ru.pricepulse.parsingservice.enumeration.Marketplace;
@Getter
@Setter
public class ParsedData {
- private MarketplaceEnum marketplace;
+ private Marketplace marketplace;
private String category;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/MarketplacePage.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/MarketplacePage.java
new file mode 100644
index 0000000..20462c5
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/MarketplacePage.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon;
+
+public interface MarketplacePage {
+
+ boolean isLoaded();
+
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/page/AccessDeniedPage.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/page/AccessDeniedPage.java
similarity index 90%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/page/AccessDeniedPage.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/page/AccessDeniedPage.java
index d2cd51c..e5d2d61 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/page/AccessDeniedPage.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/page/AccessDeniedPage.java
@@ -1,12 +1,10 @@
-package ru.pricepulse.parsingservice.service.marketplace.ozon.page;
+package ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.page;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.MarketplacePage;
+import ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.MarketplacePage;
@Slf4j
public class AccessDeniedPage implements MarketplacePage {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/page/CategoryPage.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/page/CategoryPage.java
similarity index 86%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/page/CategoryPage.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/page/CategoryPage.java
index 29b97f8..95a936d 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/page/CategoryPage.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/page/CategoryPage.java
@@ -1,24 +1,18 @@
-package ru.pricepulse.parsingservice.service.marketplace.ozon.page;
+package ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.page;
-import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfAllElements;
-import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated;
+import lombok.extern.slf4j.Slf4j;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.MarketplacePage;
-import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
-import lombok.extern.slf4j.Slf4j;
-import org.openqa.selenium.By;
-import org.openqa.selenium.StaleElementReferenceException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.WebDriverWait;
-import org.springframework.retry.annotation.Recover;
-import org.springframework.retry.annotation.Retryable;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.MarketplacePage;
+import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfAllElements;
+import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated;
@Slf4j
public class CategoryPage implements MarketplacePage {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/parsing/CategoryPageParsingService.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/parsing/CategoryPageParsingService.java
similarity index 91%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/parsing/CategoryPageParsingService.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/parsing/CategoryPageParsingService.java
index 1229367..729b43d 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/parsing/CategoryPageParsingService.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/parsing/CategoryPageParsingService.java
@@ -1,28 +1,23 @@
-package ru.pricepulse.parsingservice.service.marketplace.ozon.parsing;
+package ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.parsing;
+
+import lombok.extern.slf4j.Slf4j;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.slf4j.MDC;
+import org.springframework.retry.annotation.Recover;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Service;
+import ru.pricepulse.parsingservice.ozon_parser.pool.WebDriverPool;
+import ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.page.AccessDeniedPage;
+import ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.page.CategoryPage;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
-import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
-import lombok.extern.slf4j.Slf4j;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.StaleElementReferenceException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.support.ui.WebDriverWait;
-import org.slf4j.MDC;
-import org.springframework.beans.factory.ObjectFactory;
-import org.springframework.retry.annotation.Recover;
-import org.springframework.retry.annotation.Retryable;
-import org.springframework.stereotype.Service;
-import ru.pricepulse.parsingservice.pool.WebDriverPool;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.page.AccessDeniedPage;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.page.CategoryPage;
-
@Slf4j
@Service
public class CategoryPageParsingService {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/parsing/ParsingService.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/parsing/ParsingService.java
similarity index 65%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/parsing/ParsingService.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/parsing/ParsingService.java
index f5999d2..dcafb14 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/parsing/ParsingService.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/marketplace/ozon/parsing/ParsingService.java
@@ -1,27 +1,14 @@
-package ru.pricepulse.parsingservice.service.marketplace.ozon.parsing;
+package ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.parsing;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import ru.pricepulse.parsingservice.ozon_parser.service.MarketplaceParsingService;
-import java.time.Duration;
-import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
-import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
-import lombok.extern.slf4j.Slf4j;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.StaleElementReferenceException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.support.ui.WebDriverWait;
-import org.slf4j.MDC;
-import org.springframework.beans.factory.ObjectFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.retry.annotation.Retryable;
-import org.springframework.stereotype.Service;
-import ru.pricepulse.parsingservice.service.MarketplaceParsingService;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.page.AccessDeniedPage;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.page.CategoryPage;
-
@Slf4j
@Service
public class ParsingService implements MarketplaceParsingService {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/messaging/ParsedDataProducer.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/messaging/ParsedDataProducer.java
similarity index 73%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/messaging/ParsedDataProducer.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/messaging/ParsedDataProducer.java
index 07f5e5d..ec9fea9 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/messaging/ParsedDataProducer.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/messaging/ParsedDataProducer.java
@@ -1,9 +1,9 @@
-package ru.pricepulse.parsingservice.service.messaging;
+package ru.pricepulse.parsingservice.ozon_parser.service.messaging;
import lombok.RequiredArgsConstructor;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
-import ru.pricepulse.parsingservice.service.dto.ParsedData;
+import ru.pricepulse.parsingservice.ozon_parser.service.dto.ParsedData;
@Service
@RequiredArgsConstructor
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/request/PageFetcher.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/request/PageFetcher.java
similarity index 87%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/request/PageFetcher.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/request/PageFetcher.java
index 3e4a896..1378ec6 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/request/PageFetcher.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/request/PageFetcher.java
@@ -1,4 +1,4 @@
-package ru.pricepulse.parsingservice.service.request;
+package ru.pricepulse.parsingservice.ozon_parser.service.request;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/scheduler/OzonProductUpdater.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/scheduler/OzonProductUpdater.java
similarity index 78%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/scheduler/OzonProductUpdater.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/scheduler/OzonProductUpdater.java
index 218ab96..6efbfe6 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/scheduler/OzonProductUpdater.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/scheduler/OzonProductUpdater.java
@@ -1,10 +1,10 @@
-package ru.pricepulse.parsingservice.service.scheduler;
+package ru.pricepulse.parsingservice.ozon_parser.service.scheduler;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import ru.pricepulse.parsingservice.config.properties.OzonConfigProperties;
-import ru.pricepulse.parsingservice.service.marketplace.ozon.parsing.ParsingService;
+import ru.pricepulse.parsingservice.ozon_parser.service.marketplace.ozon.parsing.ParsingService;
@Service
@RequiredArgsConstructor
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/scheduler/PartitionScheduler.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/scheduler/PartitionScheduler.java
similarity index 93%
rename from parsing-service/src/main/java/ru/pricepulse/parsingservice/service/scheduler/PartitionScheduler.java
rename to parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/scheduler/PartitionScheduler.java
index 99a2107..d91ce14 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/scheduler/PartitionScheduler.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/scheduler/PartitionScheduler.java
@@ -1,14 +1,14 @@
-package ru.pricepulse.parsingservice.service.scheduler;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
+package ru.pricepulse.parsingservice.ozon_parser.service.scheduler;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
-import ru.pricepulse.parsingservice.service.PartitionService;
+import ru.pricepulse.parsingservice.ozon_parser.service.PartitionService;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
@Slf4j
@Service
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java
index e335402..652ed4c 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java
@@ -1,20 +1,22 @@
package ru.pricepulse.parsingservice.persistence.entity;
-import java.math.BigDecimal;
-import java.util.Objects;
-
import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
import org.hibernate.proxy.HibernateProxy;
+import java.math.BigDecimal;
+import java.util.Objects;
+
@Getter
@Setter
@Entity
@Table(name = "price_history")
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class PriceHistoryEntity {
@EmbeddedId
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java
index 6cb5fdb..1515fbb 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java
@@ -1,22 +1,22 @@
package ru.pricepulse.parsingservice.persistence.entity;
-import java.io.Serializable;
-import java.time.OffsetDateTime;
-import java.util.Objects;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Embeddable;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.ManyToOne;
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.hibernate.proxy.HibernateProxy;
+import java.io.Serializable;
+import java.time.OffsetDateTime;
+import java.util.Objects;
+
@Getter
@Setter
+@AllArgsConstructor
+@NoArgsConstructor
@Embeddable
public class PriceHistoryId implements Serializable {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java
index 2faa174..5c4d968 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java
@@ -1,39 +1,34 @@
package ru.pricepulse.parsingservice.persistence.entity;
+import jakarta.persistence.*;
+import lombok.*;
+import org.hibernate.proxy.HibernateProxy;
+import ru.pricepulse.parsingservice.enumeration.Category;
+import ru.pricepulse.parsingservice.enumeration.Marketplace;
+
import java.time.LocalDateTime;
import java.util.Objects;
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.EnumType;
-import jakarta.persistence.Enumerated;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
-import jakarta.persistence.PrePersist;
-import jakarta.persistence.Table;
-import lombok.Getter;
-import lombok.Setter;
-import org.hibernate.proxy.HibernateProxy;
-import ru.pricepulse.parsingservice.persistence.enums.MarketplaceEnum;
-
@Getter
@Setter
@Entity
@Table(name = "product")
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class ProductEntity {
-
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
- @Enumerated(EnumType.STRING)
@Column(name = "marketplace", nullable = false, length = Integer.MAX_VALUE)
- private MarketplaceEnum marketplace;
+ @Enumerated(EnumType.STRING)
+ private Marketplace marketplace;
@Column(name = "category", nullable = false, length = Integer.MAX_VALUE)
- private String category;
+ @Enumerated(EnumType.STRING)
+ private Category category;
@Column(name = "brand", nullable = false, length = Integer.MAX_VALUE)
private String brand;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/enums/MarketplaceEnum.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/enums/MarketplaceEnum.java
deleted file mode 100644
index d9e6fd5..0000000
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/enums/MarketplaceEnum.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ru.pricepulse.parsingservice.persistence.enums;
-
-public enum MarketplaceEnum {
-
- OZON
-
-}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductPriceRepository.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductPriceRepository.java
new file mode 100644
index 0000000..b456fe0
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductPriceRepository.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.persistence.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import ru.pricepulse.parsingservice.persistence.entity.PriceHistoryEntity;
+
+public interface ProductPriceRepository extends JpaRepository {
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductRepository.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductRepository.java
new file mode 100644
index 0000000..b58f16f
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductRepository.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.persistence.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import ru.pricepulse.parsingservice.persistence.entity.ProductEntity;
+
+public interface ProductRepository extends JpaRepository {
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/MarketplacePage.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/MarketplacePage.java
deleted file mode 100644
index 02c81c6..0000000
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/service/marketplace/ozon/MarketplacePage.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ru.pricepulse.parsingservice.service.marketplace.ozon;
-
-public interface MarketplacePage {
-
- boolean isLoaded();
-
-}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java
index 9d33178..17d3ce6 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java
@@ -1,7 +1,5 @@
package ru.pricepulse.parsingservice.web.handler;
-import java.net.URI;
-
import jakarta.persistence.EntityNotFoundException;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
@@ -10,6 +8,8 @@ import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
+import java.net.URI;
+
@ControllerAdvice
public class CommonExceptionHandler {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java
index 1031917..94abad1 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java
@@ -1,9 +1,9 @@
package ru.pricepulse.parsingservice.web.handler;
-import java.net.URI;
-
import org.springframework.http.HttpStatus;
+import java.net.URI;
+
public record ErrorResponse (
Integer statusCode,
HttpStatus status,
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/DebugRunner.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/DebugRunner.java
new file mode 100644
index 0000000..976288f
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/DebugRunner.java
@@ -0,0 +1,19 @@
+package ru.pricepulse.parsingservice.wildberries_parser;
+
+import lombok.AllArgsConstructor;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+import ru.pricepulse.parsingservice.wildberries_parser.service.ParsingService;
+
+@Component
+@AllArgsConstructor
+public class DebugRunner implements CommandLineRunner {
+ private final ParsingService parsingService;
+
+ @Override
+ public void run(String... args){
+ System.out.println("Начинаем отладку...");
+ parsingService.parse();
+ System.out.println("Заканчиваем отладку...");
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WbProperties.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WbProperties.java
new file mode 100644
index 0000000..5983506
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WbProperties.java
@@ -0,0 +1,21 @@
+package ru.pricepulse.parsingservice.wildberries_parser.configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "marketplace.wildberries")
+@Getter
+@Setter
+public class WbProperties {
+ private String baseUrl;
+ private String catalogUrl;
+ private String userAgent;
+ private String catalogWbUrl;
+ private int retryAttempts;
+ private long retryDelay;
+ private String laptopUrl;
+ private String shard;
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WebClientConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WebClientConfig.java
new file mode 100644
index 0000000..944f9e1
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WebClientConfig.java
@@ -0,0 +1,18 @@
+package ru.pricepulse.parsingservice.wildberries_parser.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@Configuration
+public class WebClientConfig {
+ @Bean
+ public WebClient webClient() {
+ return WebClient.builder()
+ .defaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0)")
+ .codecs(configurer -> configurer
+ .defaultCodecs()
+ .maxInMemorySize(10 * 1024 * 1024))
+ .build();
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/converter/ProductInfoDto2ProductEntity.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/converter/ProductInfoDto2ProductEntity.java
new file mode 100644
index 0000000..980a44e
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/converter/ProductInfoDto2ProductEntity.java
@@ -0,0 +1,25 @@
+package ru.pricepulse.parsingservice.wildberries_parser.converter;
+
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Component;
+import ru.pricepulse.parsingservice.enumeration.Category;
+import ru.pricepulse.parsingservice.enumeration.Marketplace;
+import ru.pricepulse.parsingservice.persistence.entity.ProductEntity;
+import ru.pricepulse.parsingservice.wildberries_parser.service.dto.ProductInfoDto;
+
+import java.time.LocalDateTime;
+
+
+@Component
+public class ProductInfoDto2ProductEntity implements Converter {
+ @Override
+ public ProductEntity convert(ProductInfoDto source) {
+ return ProductEntity.builder()
+ .marketplace(Marketplace.WILDBERRIES)
+ .category(Category.LAPTOP)
+ .brand(source.getBrand())
+ .productName(source.getName())
+ .createdAt(LocalDateTime.now())
+ .build();
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/ParsingService.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/ParsingService.java
new file mode 100644
index 0000000..816d97f
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/ParsingService.java
@@ -0,0 +1,85 @@
+package ru.pricepulse.parsingservice.wildberries_parser.service;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.transaction.Transactional;
+import lombok.AllArgsConstructor;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.stereotype.Service;
+import ru.pricepulse.parsingservice.persistence.entity.PriceHistoryEntity;
+import ru.pricepulse.parsingservice.persistence.entity.PriceHistoryId;
+import ru.pricepulse.parsingservice.persistence.entity.ProductEntity;
+import ru.pricepulse.parsingservice.persistence.repository.ProductPriceRepository;
+import ru.pricepulse.parsingservice.persistence.repository.ProductRepository;
+import ru.pricepulse.parsingservice.wildberries_parser.configuration.WbProperties;
+import ru.pricepulse.parsingservice.wildberries_parser.service.client.Client;
+import ru.pricepulse.parsingservice.wildberries_parser.service.dto.ProductInfoDto;
+
+import java.math.BigDecimal;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@AllArgsConstructor
+public class ParsingService {
+ private final Client client;
+ private final ObjectMapper objectMapper;
+ private final ConversionService conversionService;
+ private final ProductRepository productRepository;
+ private final WbProperties wbProperties;
+ private final ProductPriceRepository productPriceRepository;
+
+ @Transactional
+ public void parse() {
+ List productEntities = new ArrayList<>();
+ List priceHistories = new ArrayList<>();
+
+ final int elementsInPage = 100;
+ int page = 1;
+ Integer totalPages = null;
+
+ do {
+ var pageData = client.scrapPage(page, wbProperties.getShard(), wbProperties.getLaptopUrl());
+
+ if (totalPages == null) {
+ Map dataMap = (Map) pageData.get("data");
+ int totalElements = (int) dataMap.get("total");
+ totalPages = (int) Math.ceil((double) totalElements / elementsInPage);
+ }
+
+ List productInfoDtoList = convertMapObjectToListProductInfoDto(pageData);
+
+ productInfoDtoList.forEach(dto -> {
+
+ ProductEntity productEntity = conversionService.convert(dto, ProductEntity.class);
+
+ PriceHistoryEntity priceHistory = PriceHistoryEntity.builder()
+ .id(new PriceHistoryId(productEntity, OffsetDateTime.now()))
+ .price(BigDecimal.valueOf(dto.getSalePriceU() / 100.0))
+ .build();
+
+ productEntities.add(productEntity);
+ priceHistories.add(priceHistory);
+ });
+
+ page++;
+ } while (page <= totalPages);
+
+ productRepository.saveAll(productEntities);
+ productPriceRepository.saveAll(priceHistories);
+ }
+
+ private List convertMapObjectToListProductInfoDto(Map map) {
+ Map> dataMap = (Map>) map.get("data");
+ return getProductInfoDtos(dataMap);
+ }
+
+ private List getProductInfoDtos(Map> dataMap) {
+ return objectMapper.convertValue(
+ dataMap.get("products"),
+ new TypeReference<>() {}
+ );
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/Client.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/Client.java
new file mode 100644
index 0000000..f98cbc8
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/Client.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.wildberries_parser.service.client;
+
+import java.util.Map;
+
+public interface Client {
+ Map scrapPage(int page, String shard, String query);
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/ClientImpl.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/ClientImpl.java
new file mode 100644
index 0000000..d76fccf
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/ClientImpl.java
@@ -0,0 +1,33 @@
+package ru.pricepulse.parsingservice.wildberries_parser.service.client;
+
+import lombok.AllArgsConstructor;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.stereotype.Service;
+import org.springframework.web.reactive.function.client.WebClient;
+import ru.pricepulse.parsingservice.wildberries_parser.configuration.WbProperties;
+
+import java.util.Map;
+
+@AllArgsConstructor
+@Service
+public class ClientImpl implements Client {
+
+ private final WebClient webClient;
+ private final WbProperties wbProperties;
+
+ @Override
+ public Map scrapPage(int page, String shard, String query) {
+ String url = wbProperties.getCatalogWbUrl() +
+ shard +
+ query +
+ "?dest=-1257786&page=" + page + "&subject=2290";
+
+ return webClient.get()
+ .uri(url)
+ .retrieve()
+ .bodyToMono(new ParameterizedTypeReference