DomainTemplateDeleteService.java

package fr.tiogars.inception.domains.domaintemplate.services;

import java.time.Clock;
import java.time.Instant;
import java.time.temporal.ChronoUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import fr.tiogars.inception.config.SecurityAuditorAware;
import fr.tiogars.inception.domains.domaintemplate.repositories.DomainTemplateRepository;

/** Archives DomainTemplates without removing their database rows. */
@Service
public class DomainTemplateDeleteService {

    private final DomainTemplateRepository repository;
    private final SecurityAuditorAware auditor;
    private final Clock clock;

    @Autowired
    public DomainTemplateDeleteService(DomainTemplateRepository repository, SecurityAuditorAware auditor, Clock clock) {
        this.repository = repository;
        this.auditor = auditor;
        this.clock = clock;
    }

    /**
     * Soft-deletes an active DomainTemplate.
     *
     * @param id persistent identifier
     * @return {@code true} when the template existed
     */
    @Transactional
    public boolean delete(Long id) {
        return repository.findById(id).map(entity -> {
            entity.softDelete(Instant.now(clock).truncatedTo(ChronoUnit.MICROS),
                    auditor.getCurrentAuditor().orElseThrow());
            repository.saveAndFlush(entity);
            return true;
        }).orElse(false);
    }
}