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));
    }
}