diff --git a/pom.xml b/pom.xml
index aeb98b1..38077df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,8 +28,23 @@
21
+ 2.3.10
+
+
+
+ jitpack.io
+ https://jitpack.io
+
+
+
+
+ com.github.eduardomcb
+ discord-webhook
+ 1.0.0
+
+
org.springframework.boot
spring-boot-starter-data-jpa
@@ -78,6 +93,17 @@
spring-boot-starter-webmvc-test
test
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
+ org.jetbrains.kotlin
+ kotlin-test
+ ${kotlin.version}
+ test
+
@@ -86,6 +112,85 @@
org.springframework.boot
spring-boot-maven-plugin
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+ true
+
+
+ compile
+ compile
+
+ compile
+
+
+
+
+ test-compile
+ test-compile
+
+ test-compile
+
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-noarg
+ ${kotlin.version}
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-allopen
+ ${kotlin.version}
+
+
+
+ 1.8
+
+ jpa
+ all-open
+ spring
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ default-compile
+ none
+
+
+ default-testCompile
+ none
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ testCompile
+ test-compile
+
+ testCompile
+
+
+
+
diff --git a/src/main/java/br/com/stackpanel/duck_api/config/WebHookConfig.java b/src/main/java/br/com/stackpanel/duck_api/config/WebHookConfig.java
new file mode 100644
index 0000000..2c50010
--- /dev/null
+++ b/src/main/java/br/com/stackpanel/duck_api/config/WebHookConfig.java
@@ -0,0 +1,53 @@
+package br.com.stackpanel.duck_api.config;
+
+import br.com.stackpanel.duck_api.entity.enums.TypeError;
+import br.com.stackpanel.duck_api.service.impl.ProductServiceImpl;
+import com.eduardomcb.discord.webhook.WebhookClient;
+import com.eduardomcb.discord.webhook.WebhookManager;
+import com.eduardomcb.discord.webhook.models.Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WebHookConfig {
+
+ private final String LOG_ERROR = "https://discord.com/api/webhooks/1510367769839800541/ikEQ4mnp8GBtSltnn5qwhOBawlBC8EkVfff-zFlDhBpyuTBH_-7DM0LWhEoHXNl3sHSu";
+ private final String LOG_PRECO = "https://discord.com/api/webhooks/1510368038589829140/BIkXq8-n3ZxJBv5vEYrqvu7Agf-v-dz1P1RoLHmJ7J9IkJQhVWbA_hQyWKagC2ZPzPcV";
+ private final String LOG_CADASTRO = "https://discord.com/api/webhooks/1510368356354490438/mYfx6EKfQk-MdOxbRj0rcvr49Z4MGfDHfeeHeneDWoMuTLGYIpjBpUzwi1vZwf5VA-pW";
+
+ private final Logger log = LoggerFactory.getLogger(ProductServiceImpl.class);
+
+ public void SendWebHook(String message, TypeError typeError){
+ Message msgwh = new Message().setContent(message);
+
+ String urlWebHook = switch (typeError) {
+ case LOG_ERROR -> LOG_ERROR;
+ case LOG_PRECO -> LOG_PRECO;
+ case LOG_CADASTRO -> LOG_CADASTRO;
+ };
+
+
+ WebhookManager webhookManager = new WebhookManager()
+ .setChannelUrl(urlWebHook)
+ .setMessage(msgwh);
+
+ webhookManager.setListener(
+ new WebhookClient.Callback() {
+ @Override
+ public void onSuccess(String response) {
+ log.info("Mensagem enviada com sucesso!");
+ }
+
+ @Override
+ public void onFailure(int statusCode, String errorMessage) {
+ log.error("Ouve uma falha ao enviar mensagem error: '{}' status: '{}'", errorMessage, statusCode);
+ }
+ }
+ );
+
+ webhookManager.exec();
+
+ }
+
+}
diff --git a/src/main/java/br/com/stackpanel/duck_api/entity/enums/TypeError.java b/src/main/java/br/com/stackpanel/duck_api/entity/enums/TypeError.java
new file mode 100644
index 0000000..b4f2e15
--- /dev/null
+++ b/src/main/java/br/com/stackpanel/duck_api/entity/enums/TypeError.java
@@ -0,0 +1,8 @@
+package br.com.stackpanel.duck_api.entity.enums;
+
+public enum TypeError {
+ LOG_ERROR,
+ LOG_PRECO,
+ LOG_CADASTRO;
+
+}
diff --git a/src/main/java/br/com/stackpanel/duck_api/service/impl/ProductServiceImpl.java b/src/main/java/br/com/stackpanel/duck_api/service/impl/ProductServiceImpl.java
index 5a74b11..702520c 100644
--- a/src/main/java/br/com/stackpanel/duck_api/service/impl/ProductServiceImpl.java
+++ b/src/main/java/br/com/stackpanel/duck_api/service/impl/ProductServiceImpl.java
@@ -1,7 +1,9 @@
package br.com.stackpanel.duck_api.service.impl;
+import br.com.stackpanel.duck_api.config.WebHookConfig;
import br.com.stackpanel.duck_api.entity.Product;
import br.com.stackpanel.duck_api.entity.dto.ProductDTO;
+import br.com.stackpanel.duck_api.entity.enums.TypeError;
import br.com.stackpanel.duck_api.entity.mapper.ProductMapper;
import br.com.stackpanel.duck_api.exception.ProductInvalidException;
import br.com.stackpanel.duck_api.repository.ProductRepository;
@@ -10,6 +12,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
import java.util.List;
@Service
@@ -19,10 +23,12 @@ public class ProductServiceImpl implements ProductService {
private final ProductRepository productRepository;
private final ProductMapper productMapper;
+ private final WebHookConfig webHookConfig;
- public ProductServiceImpl(ProductRepository productRepository, ProductMapper productMapper) {
+ public ProductServiceImpl(ProductRepository productRepository, ProductMapper productMapper, WebHookConfig webHookConfig) {
this.productRepository = productRepository;
this.productMapper = productMapper;
+ this.webHookConfig = webHookConfig;
}
@Override
@@ -34,6 +40,8 @@ public class ProductServiceImpl implements ProductService {
} catch (Exception e) {
log.error("Ocorreu um erro ao buscar produtos. Erro original: {}", e.getMessage());
+ webHookConfig.SendWebHook("<@&1510364267956928713> Ocorreu um erro ao buscar produtos. Erro original: " + e.getMessage(), TypeError.LOG_ERROR);
+
throw new RuntimeException("Ocorreu um erro interno ao buscar produtos.");
}
@@ -42,38 +50,58 @@ public class ProductServiceImpl implements ProductService {
@Override
public ProductDTO salvarProduto(ProductDTO dto) {
try {
+ Product produtoExistente = productRepository.buscarProdutosFiltro(
+ null, dto.getNomeProduto(), null, null
+ );
- Product produtoExistente = productRepository.buscarProdutosFiltro(null, dto.getNomeProduto(), null, null);
+ Product produto;
if (produtoExistente != null) {
- log.warn("Produto '{}' ja existe no sistema.", dto.getNomeProduto());
+ log.warn("Produto '{}' com ID: '{}' ja existe no sistema.", dto.getNomeProduto(), produtoExistente.getCodigoProduto());
- if (produtoExistente.getPrecoProdutoAtualizado().equals(dto.getPrecoProdutoAtualizado())) {
- log.info("Produto '{}' ja existe no sistema com o mesmo preco.", dto.getNomeProduto());
- return dto;
- } else if (dto.getPrecoProdutoAtualizado()
- .compareTo(produtoExistente.getPrecoProdutoAtualizado()) < 0) {
- log.info("Produto '{}' teve preco atualizado para {}. Preco anterior: {}",
- dto.getNomeProduto(), dto.getPrecoProdutoAtualizado(),
- produtoExistente.getPrecoProdutoAtualizado());
- dto.setPrecoProdutoPrecoAnterior(produtoExistente.getPrecoProdutoAtualizado());
+ BigDecimal precoAtual = produtoExistente.getPrecoProdutoAtualizado();
+ BigDecimal precoNovo = dto.getPrecoProdutoAtualizado();
+ if (precoAtual.equals(precoNovo)) {
+ log.info("Produto '{}' ID: '{}' ja existe com o mesmo preco.", dto.getNomeProduto(), produtoExistente.getCodigoProduto());
+ return productMapper.toProductDTO(produtoExistente);
+
+ } else if (precoNovo.compareTo(precoAtual) < 0) {
+ // precoNovo < precoAtual → atualiza (ficou mais barato)
+ log.info("Produto '{}' ID: '{}' teve preco atualizado: {} -> {}",
+ dto.getNomeProduto(), produtoExistente.getCodigoProduto(),precoAtual, precoNovo);
+
+ webHookConfig.SendWebHook("<@&1510364303776153803> O Produto " + dto.getNomeProduto() + " teve preco atualizado: " + precoAtual + " para " + precoNovo, TypeError.LOG_PRECO);
+
+ dto.setCodigoProduto(produtoExistente.getCodigoProduto());
+ dto.setPrecoProdutoPrecoAnterior(precoAtual);
+ produto = productRepository.save(productMapper.toProductEntity(dto));
+
+ } else {
+ // precoNovo > precoAtual → nao atualiza
+ log.info("Produto '{}' ID: '{}' ja existe com preco menor. Nenhuma alteracao feita.", dto.getNomeProduto(), produtoExistente.getCodigoProduto());
+ return productMapper.toProductDTO(produtoExistente);
}
+ } else {
+ webHookConfig.SendWebHook("<@&1510364549717688460> O Produto " + dto.getNomeProduto() + " foi cadastrado com sucesso.", TypeError.LOG_CADASTRO);
+ produto = productRepository.save(productMapper.toProductEntity(dto));
}
- Product produto = productRepository.save(productMapper.toProductEntity(dto));
-
- log.info("Produto salvo com sucesso. ID: {}", produto.getCodigoProduto());
-
+ log.info("Produto salvo com sucesso. ID: {}, Nome: '{}'", produto.getCodigoProduto(), produto.getNomeProduto());
return productMapper.toProductDTO(produto);
+
} catch (DataIntegrityViolationException e) {
String message = e.getMostSpecificCause().getMessage();
+ log.error("Erro de integridade ao salvar o produto '{}'. Motivo: {}", dto.getNomeProduto(), message);
- log.error("Erro de integridade ao salvar o produto '{}'. Motivo {}", dto.getNomeProduto(), message);
+ webHookConfig.SendWebHook("<@&1510364267956928713> Erro de integridade ao salvar o produto: " + dto.getNomeProduto() + " Motivo: {}" + message, TypeError.LOG_ERROR);
throw new ProductInvalidException("Os dados do produto sao invalidos ou ja existem no sistema.");
+
} catch (Exception e) {
- log.error("Erro inesperado ao salvar produto '{}'. Erro original {}", dto.getNomeProduto(), e.getMessage());
+ log.error("Erro inesperado ao salvar produto '{}'. Erro: {}", dto.getNomeProduto(), e.getMessage());
+
+ webHookConfig.SendWebHook("<@&1510364267956928713> Erro inesperado ao salvar produto: " + dto.getNomeProduto() + " Erro: " + e.getMessage(), TypeError.LOG_ERROR);
throw new RuntimeException("Ocorreu um erro interno ao salvar o produto.");
}