Api de cadastro de produto.

This commit is contained in:
ZyperCH
2026-05-27 20:33:57 -03:00
commit 8c453264a6
21 changed files with 1112 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package br.com.stackpanel.duck_api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DuckApiApplication {
public static void main(String[] args) {
SpringApplication.run(DuckApiApplication.class, args);
}
}

View File

@@ -0,0 +1,31 @@
package br.com.stackpanel.duck_api.controller;
import br.com.stackpanel.duck_api.entity.dto.ProductDTO;
import br.com.stackpanel.duck_api.service.ProductService;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/produto")
public class ProductController {
private final ProductService productService;
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping("/buscarTodos")
public ResponseEntity<List<ProductDTO>> buscarTodosProdutos() {
return ResponseEntity.ok(productService.buscarTodosProdutos());
}
@PostMapping("/salvar")
private ResponseEntity<ProductDTO> salvarProduto(@RequestBody @Valid ProductDTO dto) {
return ResponseEntity.ok(productService.salvarProduto(dto));
}
}

View File

@@ -0,0 +1,127 @@
package br.com.stackpanel.duck_api.entity;
import jakarta.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Entity
@Table(name = "tproduct", schema = "prdadm")
public class Product {
@Id
@Column(name = "prdcod")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigoProduto;
@Column(name = "nomprd")
private String nomeProduto;
@Column(name = "dscprd")
private String descricaoProdutos;
@Column(name = "prcprdatu")
private BigDecimal precoProdutoAtualizado;
@Column(name = "prcprdprv")
private BigDecimal precoProdutoPrecoAnterior;
@Column(name = "datcnsprd")
private LocalDateTime ultimaDataConsultaProduto;
@Column(name = "datenvprd")
private LocalDateTime dataEnvioProduto;
@Column(name = "nomplt")
private String nomePlataforma;
public Product() {
}
public Product(Long codigoProduto, String nomeProduto, String descricaoProdutos, BigDecimal precoProdutoAtualizado, BigDecimal precoProdutoPrecoAnterior, LocalDateTime ultimaDataConsultaProduto, LocalDateTime dataEnvioProduto, String nomePlataforma) {
this.codigoProduto = codigoProduto;
this.nomeProduto = nomeProduto;
this.descricaoProdutos = descricaoProdutos;
this.precoProdutoAtualizado = precoProdutoAtualizado;
this.precoProdutoPrecoAnterior = precoProdutoPrecoAnterior;
this.ultimaDataConsultaProduto = ultimaDataConsultaProduto;
this.dataEnvioProduto = dataEnvioProduto;
this.nomePlataforma = nomePlataforma;
}
public String getDescricaoProdutos() {
return descricaoProdutos;
}
public void setDescricaoProdutos(String descricaoProdutos) {
this.descricaoProdutos = descricaoProdutos;
}
public String getNomePlataforma() {
return nomePlataforma;
}
public void setNomePlataforma(String nomePlataforma) {
this.nomePlataforma = nomePlataforma;
}
public Long getCodigoProduto() {
return codigoProduto;
}
public void setCodigoProduto(Long codigoProduto) {
this.codigoProduto = codigoProduto;
}
public String getNomeProduto() {
return nomeProduto;
}
public void setNomeProduto(String nomeProduto) {
this.nomeProduto = nomeProduto;
}
public BigDecimal getPrecoProdutoAtualizado() {
return precoProdutoAtualizado;
}
public void setPrecoProdutoAtualizado(BigDecimal precoProdutoAtualizado) {
this.precoProdutoAtualizado = precoProdutoAtualizado;
}
public BigDecimal getPrecoProdutoPrecoAnterior() {
return precoProdutoPrecoAnterior;
}
public void setPrecoProdutoPrecoAnterior(BigDecimal precoProdutoPrecoAnterior) {
this.precoProdutoPrecoAnterior = precoProdutoPrecoAnterior;
}
public LocalDateTime getUltimaDataConsultaProduto() {
return ultimaDataConsultaProduto;
}
public void setUltimaDataConsultaProduto(LocalDateTime ultimaDataConsultaProduto) {
this.ultimaDataConsultaProduto = ultimaDataConsultaProduto;
}
public LocalDateTime getDataEnvioProduto() {
return dataEnvioProduto;
}
public void setDataEnvioProduto(LocalDateTime dataEnvioProduto) {
this.dataEnvioProduto = dataEnvioProduto;
}
@Override
public String toString() {
return "Product{" +
"codigoProduto=" + codigoProduto +
", nomeProduto='" + nomeProduto + '\'' +
", precoProdutoAtualizado=" + precoProdutoAtualizado +
", precoProdutoPrecoAnterior=" + precoProdutoPrecoAnterior +
", ultimaDataConsultaProduto=" + ultimaDataConsultaProduto +
", dataEnvioProduto=" + dataEnvioProduto +
'}';
}
}

View File

@@ -0,0 +1,106 @@
package br.com.stackpanel.duck_api.entity.dto;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
public class ProductDTO {
private Long codigoProduto;
@NotNull
private String nomeProduto;
@NotNull
private String descricaoProduto;
private BigDecimal precoProdutoAtualizado;
private BigDecimal precoProdutoPrecoAnterior;
private LocalDateTime ultimaDataConsultaProduto;
private LocalDateTime dataEnvioProduto;
@NotNull
private String nomePlataforma;
public ProductDTO() {
}
public ProductDTO(Long codigoProduto, String nomeProduto, String descricaoProduto, BigDecimal precoProdutoAtualizado, BigDecimal precoProdutoPrecoAnterior, LocalDateTime ultimaDataConsultaProduto, LocalDateTime dataEnvioProduto, String nomePlataforma) {
this.codigoProduto = codigoProduto;
this.nomeProduto = nomeProduto;
this.descricaoProduto = descricaoProduto;
this.precoProdutoAtualizado = precoProdutoAtualizado;
this.precoProdutoPrecoAnterior = precoProdutoPrecoAnterior;
this.ultimaDataConsultaProduto = ultimaDataConsultaProduto;
this.dataEnvioProduto = dataEnvioProduto;
this.nomePlataforma = nomePlataforma;
}
public String getDescricaoProduto() {
return descricaoProduto;
}
public void setDescricaoProduto(String descricaoProduto) {
this.descricaoProduto = descricaoProduto;
}
public String getNomePlataforma() {
return nomePlataforma;
}
public void setNomePlataforma(String nomePlataforma) {
this.nomePlataforma = nomePlataforma;
}
public Long getCodigoProduto() {
return codigoProduto;
}
public void setCodigoProduto(Long codigoProduto) {
this.codigoProduto = codigoProduto;
}
public String getNomeProduto() {
return nomeProduto;
}
public void setNomeProduto(String nomeProduto) {
this.nomeProduto = nomeProduto;
}
public BigDecimal getPrecoProdutoAtualizado() {
return precoProdutoAtualizado;
}
public void setPrecoProdutoAtualizado(BigDecimal precoProdutoAtualizado) {
this.precoProdutoAtualizado = precoProdutoAtualizado;
}
public BigDecimal getPrecoProdutoPrecoAnterior() {
return precoProdutoPrecoAnterior;
}
public void setPrecoProdutoPrecoAnterior(BigDecimal precoProdutoPrecoAnterior) {
this.precoProdutoPrecoAnterior = precoProdutoPrecoAnterior;
}
public LocalDateTime getUltimaDataConsultaProduto() {
return ultimaDataConsultaProduto;
}
public void setUltimaDataConsultaProduto(LocalDateTime ultimaDataConsultaProduto) {
this.ultimaDataConsultaProduto = ultimaDataConsultaProduto;
}
public LocalDateTime getDataEnvioProduto() {
return dataEnvioProduto;
}
public void setDataEnvioProduto(LocalDateTime dataEnvioProduto) {
this.dataEnvioProduto = dataEnvioProduto;
}
}

View File

@@ -0,0 +1,47 @@
package br.com.stackpanel.duck_api.entity.mapper;
import br.com.stackpanel.duck_api.entity.Product;
import br.com.stackpanel.duck_api.entity.dto.ProductDTO;
import org.springframework.stereotype.Component;
@Component
public class ProductMapper {
public ProductDTO toProductDTO(Product product) {
if (product == null) {
return null;
}
return new ProductDTO(
product.getCodigoProduto(),
product.getNomeProduto(),
product.getNomeProduto(),
product.getPrecoProdutoAtualizado(),
product.getPrecoProdutoPrecoAnterior(),
product.getUltimaDataConsultaProduto(),
product.getDataEnvioProduto(),
product.getNomePlataforma()
);
}
public Product toProductEntity(ProductDTO dto) {
if (dto == null) {
return null;
}
return new Product(
dto.getCodigoProduto(),
dto.getNomeProduto(),
dto.getDescricaoProduto(),
dto.getPrecoProdutoAtualizado(),
dto.getPrecoProdutoPrecoAnterior(),
dto.getUltimaDataConsultaProduto(),
dto.getDataEnvioProduto(),
dto.getNomePlataforma()
);
}
}

View File

@@ -0,0 +1,48 @@
package br.com.stackpanel.duck_api.exception;
import java.time.LocalDateTime;
public class ErrorResponse {
private int status;
private String mensagem;
private LocalDateTime timestamp;
public ErrorResponse(int status, String mensagem) {
this.status = status;
this.mensagem = mensagem;
this.timestamp = LocalDateTime.now();
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
}
public LocalDateTime getTimestamp() {
return timestamp;
}
public void setTimestamp(LocalDateTime timestamp) {
this.timestamp = timestamp;
}
@Override
public String toString() {
return "ErrorResponse{" +
"status=" + status +
", mensagem='" + mensagem + '\'' +
", timestamp=" + timestamp +
'}';
}
}

View File

@@ -0,0 +1,22 @@
package br.com.stackpanel.duck_api.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ProductNotFoundException.class)
public ResponseEntity<ErrorResponse> handleProductNotFound(ProductNotFoundException ex) {
ErrorResponse erro = new ErrorResponse(404, ex.getMessage());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(erro);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGeneric(Exception ex) {
ErrorResponse erro = new ErrorResponse(500, "Erro interno no servidor");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(erro);
}
}

View File

@@ -0,0 +1,9 @@
package br.com.stackpanel.duck_api.exception;
public class ProductNotFoundException extends RuntimeException{
public ProductNotFoundException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,9 @@
package br.com.stackpanel.duck_api.repository;
import br.com.stackpanel.duck_api.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}

View File

@@ -0,0 +1,14 @@
package br.com.stackpanel.duck_api.service;
import br.com.stackpanel.duck_api.entity.dto.ProductDTO;
import java.util.List;
public interface ProductService {
List<ProductDTO> buscarTodosProdutos();
ProductDTO salvarProduto(ProductDTO dto);
}

View File

@@ -0,0 +1,40 @@
package br.com.stackpanel.duck_api.service.impl;
import br.com.stackpanel.duck_api.entity.Product;
import br.com.stackpanel.duck_api.entity.dto.ProductDTO;
import br.com.stackpanel.duck_api.entity.mapper.ProductMapper;
import br.com.stackpanel.duck_api.repository.ProductRepository;
import br.com.stackpanel.duck_api.service.ProductService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductServiceImpl implements ProductService {
private final ProductRepository productRepository;
private final ProductMapper productMapper;
public ProductServiceImpl(ProductRepository productRepository, ProductMapper productMapper) {
this.productRepository = productRepository;
this.productMapper = productMapper;
}
@Override
public List<ProductDTO> buscarTodosProdutos() {
return productRepository.findAll().stream()
.map(productMapper::toProductDTO)
.toList();
}
@Override
public ProductDTO salvarProduto(ProductDTO dto) {
Product produto = productMapper.toProductEntity(dto);
Product produtoSalvo = productRepository.save(produto);
return productMapper.toProductDTO(produtoSalvo);
}
}