DeclaredSkillSyncServiceImpl.java

package fr.avenirsesr.portfolio.declaredskill.domain.service;

import fr.avenirsesr.portfolio.common.externalskill.application.adapter.dto.ExternalSkillDTO;
import fr.avenirsesr.portfolio.common.externalskill.domain.model.enums.EExternalSkillType;
import fr.avenirsesr.portfolio.declaredskill.domain.model.DeclaredSkill;
import fr.avenirsesr.portfolio.declaredskill.domain.port.input.DeclaredSkillSyncService;
import fr.avenirsesr.portfolio.declaredskill.domain.port.output.repository.DeclaredSkillRepository;
import fr.avenirsesr.portfolio.declaredskill.infrastructure.adapter.client.ExternalSkillClient;
import java.util.Optional;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
public class DeclaredSkillSyncServiceImpl implements DeclaredSkillSyncService {

  private final DeclaredSkillRepository declaredSkillRepository;
  private final ExternalSkillClient externalSkillClient;

  @Override
  public Optional<DeclaredSkill> getOrCreateFromExternalSkill(UUID externalSkillId) {
    Optional<DeclaredSkill> existing =
        declaredSkillRepository.findByExternalSkillId(externalSkillId);

    if (existing.isPresent()) {
      log.debug("DeclaredSkill already exists for external skill: {}", externalSkillId);
      return existing;
    }

    log.debug("Fetching external skill from interoperability: {}", externalSkillId);
    Optional<ExternalSkillDTO> externalSkillDTO = externalSkillClient.getById(externalSkillId);

    if (externalSkillDTO.isEmpty()) {
      log.warn("External skill not found in interoperability: {}", externalSkillId);
      return Optional.empty();
    }

    ExternalSkillDTO dto = externalSkillDTO.get();
    DeclaredSkill newSkill =
        DeclaredSkill.create(
            dto.id(),
            dto.title(),
            EExternalSkillType.valueOf(dto.type().name()),
            dto.pathSegments());

    DeclaredSkill saved = declaredSkillRepository.saveOrGet(newSkill);
    log.info("Created new DeclaredSkill from external skill: {}", externalSkillId);
    return Optional.of(saved);
  }
}