DomainTemplateSeedService.java

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

import java.util.ArrayList;
import java.util.List;

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 or updates DomainTemplates from seed data. */
@Service
public class DomainTemplateSeedService {

    private final DomainTemplateRepository repository;

    @Autowired
    public DomainTemplateSeedService(DomainTemplateRepository repository) {
        this.repository = repository;
    }

    /**
     * Creates or updates templates by immutable business code.
     *
     * @param requests business data to seed
     * @return stored templates in input order
     */
    @Transactional
    public List<DomainTemplate> seed(List<CreateDomainTemplateRequest> requests) {
        List<DomainTemplate> storedTemplates = new ArrayList<>();
        for (CreateDomainTemplateRequest request : requests) {
            DomainTemplateEntity entity = repository.findByCode(request.code())
                    .map(existing -> {
                        existing.update(request.label(), request.description());
                        return existing;
                    })
                    .orElseGet(() -> new DomainTemplateEntity(
                            request.code(), request.label(), request.description()));
            storedTemplates.add(toRecord(repository.saveAndFlush(entity)));
        }
        return storedTemplates;
    }

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