From 02de00091ac681faaf03e382aa88abef059550cb Mon Sep 17 00:00:00 2001 From: zyperch Date: Sat, 30 May 2026 23:33:59 -0300 Subject: [PATCH] Implementado logs no discord ao mudar preco, ao dar erros na busca e na cadastro do produto e erro ao atualizar preco do produto. --- pom.xml | 105 ++++++++++++++++++ .../duck_api/config/WebHookConfig.java | 53 +++++++++ .../duck_api/entity/enums/TypeError.java | 8 ++ .../service/impl/ProductServiceImpl.java | 64 ++++++++--- 4 files changed, 212 insertions(+), 18 deletions(-) create mode 100644 src/main/java/br/com/stackpanel/duck_api/config/WebHookConfig.java create mode 100644 src/main/java/br/com/stackpanel/duck_api/entity/enums/TypeError.java 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."); }