ProductService.java
package cz.vsb.crm.service;
import cz.vsb.crm.dto.ProductRequest;
import cz.vsb.crm.dto.ProductResponse;
import cz.vsb.crm.exception.ResourceNotFoundException;
import cz.vsb.crm.model.Product;
import cz.vsb.crm.repository.ProductRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.List;
@Service
@RequiredArgsConstructor
@Transactional
public class ProductService {
private final ProductRepository productRepository;
@Transactional(readOnly = true)
public List<ProductResponse> findAll(boolean activeOnly) {
List<Product> products = activeOnly
? productRepository.findByDeactivatedAtIsNull()
: productRepository.findAll();
return products.stream().map(ProductResponse::from).toList();
}
@Transactional(readOnly = true)
public ProductResponse findById(Long id) {
return ProductResponse.from(get(id));
}
public ProductResponse create(ProductRequest request) {
return ProductResponse.from(productRepository.save(request.toEntity()));
}
public ProductResponse update(Long id, ProductRequest request) {
Product product = get(id);
request.applyTo(product);
return ProductResponse.from(productRepository.save(product));
}
public void delete(Long id) {
Product product = get(id);
product.setDeactivatedAt(LocalDate.now());
productRepository.save(product);
}
private Product get(Long id) {
return productRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Product", id));
}
}