DomainTemplateCreateService.java

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

import java.util.Optional;

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

import fr.tiogars.inception.domains.domaintemplate.entities.DomainTemplateEntity;
import fr.tiogars.inception.domains.domaintemplate.models.CreateDomainTemplateRequest;
import fr.tiogars.inception.domains.domaintemplate.models.DomainTemplate;
import fr.tiogars.inception.domains.domaintemplate.repositories.DomainTemplateRepository;

/**
 * Creates DomainTemplates when their business code is available.
 *
 * @since 0.1.0
 */
@Service
public class DomainTemplateCreateService {

    private final DomainTemplateRepository repository;

    /**
     * Creates a service using Spring Data auditing.
     *
     * @param repository domain record repository
     */
    @Autowired
    public DomainTemplateCreateService(DomainTemplateRepository repository) {
        this.repository = repository;
    }

    /**
     * Creates a DomainTemplate when its code does not already exist.
     *
     * @param request business data to create
     * @return created template, or an empty optional when the code exists
     */
    @Transactional
    public Optional<DomainTemplate> create(CreateDomainTemplateRequest request) {
        if (repository.findByCode(request.code()).isPresent()) {
            return Optional.empty();
        }
        DomainTemplateEntity entity = new DomainTemplateEntity(
                request.code(), request.label(), request.description());
        return Optional.of(toRecord(repository.saveAndFlush(entity)));
    }

    private static DomainTemplate toRecord(DomainTemplateEntity entity) {
        return new DomainTemplate(
                entity.getId(),
                entity.getCode(),
                entity.getLabel(),
                entity.getDescription(),
                entity.getCreatedDate(),
                entity.getLastModifiedDate(),
                entity.getCreatedBy(),
                entity.getLastModifiedBy());
    }
}