I am making a REST API by using Java + Spring Boot + Hibernate + JPA + H2 Database, I would need use PUT method for that, through the value of cantidadProducto in ProductoDTO inserted in the body, subtracts the stock value of my Producto entity. please help to solve this problem, I would greatly appreciate it
Producto.java
package com.coder.billing.models;
import lombok.*;
import javax.persistence.*;
@Entity
@Table(name = "productos")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Producto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long idProducto;
@Column(name = "nombre")
private String nombreProducto;
@Column(name = "precio")
private Integer precioProducto;
@Column(name = "descripcion")
private String descripcion;
@Column(name = "stock")
private Integer stock;
}
ProductoDTO.java
package com.coder.billing.dto;
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProductoDTO {
private Long idProducto;
private String nombreProducto;
private Integer precioProducto;
private String descripcion;
private Integer stock;
private Integer cantidadProducto;
}
ProductoRepository.java
package com.coder.billing.repositories.Producto;
import com.coder.billing.models.Producto;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductoRepository extends JpaRepository<Producto, Long> {
}
ProductoServiceImpl.java
package com.coder.billing.services.Producto;
import com.coder.billing.dto.ProductoDTO;
import com.coder.billing.models.Producto;
import com.coder.billing.repositories.Producto.ProductoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
// productoDTO.setTotalParcial(productoDTO.getPrecioProducto() * productoDTO.getCantidadProducto());
@Service
public class ProductoServiceImp implements ProductoService {
@Autowired
ProductoRepository productoRepository;
public List<Producto> getAllProductos() {
return productoRepository.findAll();
}
public Producto getOneProduct(Long id) {
return productoRepository.findById(id).orElseThrow(() -> new RuntimeException("Producto no encontrado"));
}
public Producto createProduct(Producto producto) {
return productoRepository.save(producto);
}
public Producto updateProduct(Producto producto, Long id) {
Producto productoActual = productoRepository.findById(id).orElseThrow(() -> new RuntimeException("Producto no encontrado"));
productoActual.setIdProducto(id);
productoActual.setNombreProducto(producto.getNombreProducto());
productoActual.setPrecioProducto(producto.getPrecioProducto());
productoActual.setDescripcion(producto.getDescripcion());
productoActual.setStock(producto.getStock());
return productoRepository.save(productoActual);
}
public void deleteProduct(Long id) {
productoRepository.deleteById(id);
}
}
ProductoService.java
package com.coder.billing.services.Producto;
import com.coder.billing.models.Producto;
import java.util.List;
public interface ProductoService {
List<Producto> getAllProductos();
Producto getOneProduct(Long id);
Producto createProduct(Producto producto);
Producto updateProduct(Producto producto, Long id);
void deleteProduct(Long id);
}
ProductoController.java
package com.coder.billing.controllers.Producto;
import com.coder.billing.dto.ProductoDTO;
import com.coder.billing.models.Producto;
import com.coder.billing.services.Producto.ProductoService;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/api/productos")
public class ProductoController {
@Autowired
ModelMapper modelMapper;
@Autowired
ProductoService productoService;
@GetMapping()
public List<ProductoDTO> getAllProductos() {
return productoService.getAllProductos().stream().map(producto -> modelMapper.map(producto, ProductoDTO.class)).collect(Collectors.toList());
}
@GetMapping("/{id}")
public ResponseEntity<ProductoDTO> getProductoById(@PathVariable Long id) {
Producto producto = productoService.getOneProduct(id);
if (producto == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
ProductoDTO productoDTO = modelMapper.map(producto, ProductoDTO.class);
return ResponseEntity.ok().body(productoDTO);
}
@PostMapping()
public ResponseEntity<ProductoDTO> createProduct(@RequestBody ProductoDTO productoDTO) {
Producto producto = modelMapper.map(productoDTO, Producto.class);
Producto productoCreacion = productoService.createProduct(producto);
ProductoDTO conversion = modelMapper.map(productoCreacion, ProductoDTO.class);
return new ResponseEntity<ProductoDTO>(conversion, HttpStatus.CREATED);
}
@PutMapping("/{id}")
public ResponseEntity<ProductoDTO> updateProduct(@PathVariable Long id, @RequestBody ProductoDTO productoDTO) {
Producto productoPeticion = modelMapper.map(productoDTO, Producto.class);
Producto producto = productoService.updateProduct(productoPeticion, id);
ProductoDTO productoDTOPeticion = modelMapper.map(producto, ProductoDTO.class);
return ResponseEntity.ok().body(productoDTOPeticion);
}
@DeleteMapping("/{id}")
public ResponseEntity<ProductoDTO> deleteProduct(@PathVariable Long id) {
productoService.deleteProduct(id);
return new ResponseEntity<>(HttpStatus.OK);
}
}