package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.constant.MsgConstants; import kr.wisestone.owl.domain.CustomField; import kr.wisestone.owl.domain.CustomFieldValue; import kr.wisestone.owl.domain.enumType.CustomFieldType; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.repository.CustomFieldValueRepository; import kr.wisestone.owl.service.CustomFieldValueService; import kr.wisestone.owl.service.IssueCustomFieldValueService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class CustomFieldValueServiceImpl extends AbstractServiceImpl> implements CustomFieldValueService { private static final Logger log = LoggerFactory.getLogger(CustomFieldValueServiceImpl.class); @Autowired private CustomFieldValueRepository customFieldValueRepository; @Autowired private IssueCustomFieldValueService issueCustomFieldValueService; @Override protected JpaRepository getRepository() { return this.customFieldValueRepository; } // 사용자 정의 필드 값을 추가한다. @Override @Transactional public void addCustomFieldValues(CustomField customField, List values, CustomFieldType oldCustomFieldType) { if (oldCustomFieldType != null) { // 텍스트 입력 필드일 때는 이슈에서 사용되고 있는 사용자 정의 필드 값 확인 후 삭제 처리 //if (customField.getCustomFieldType().equals(CustomFieldType.INPUT)) { if(!customField.getCustomFieldType().equals(CustomFieldType.MULTI_SELECT) && !customField.getCustomFieldType().equals(CustomFieldType.SINGLE_SELECT)){ // 이전에도 텍스트 필드였다면 사용자 정의 필드 값을 삭제하지 않는다. //if (CustomFieldType.INPUT.equals(oldCustomFieldType)) { if (!CustomFieldType.MULTI_SELECT.equals(oldCustomFieldType) && !CustomFieldType.SINGLE_SELECT.equals(oldCustomFieldType)) { return; } // 사용자 정의 필드 옵션 값이 변경되었을 때 사용자 정의 필드 값을 사용하는 이슈에서 해당 값이 존재하는지 확인하고 없어졌으면 삭제해준다. this.issueCustomFieldValueService.checkExistIssueCustomFieldValue(customField, values, oldCustomFieldType); return; } // 다중선택 필드에서 단일 선택 필드로 변경할 경우 모든 값을 삭제처리한다. if (oldCustomFieldType.equals(CustomFieldType.MULTI_SELECT) && customField.getCustomFieldType().equals(CustomFieldType.SINGLE_SELECT)) { // 이슈에서 저장된 해당 사용자 정의 필드 값을 모두 삭제한다. this.issueCustomFieldValueService.removeIssueCustomFieldValuesByCustomFieldId(customField); } /*if (customField.getCustomFieldType().equals(CustomFieldType.NUMBER)) { if (CustomFieldType.NUMBER.equals(oldCustomFieldType)) { return; } // 사용자 정의 필드 옵션 값이 변경되었을 때 사용자 정의 필드 값을 사용하는 이슈에서 해당 값이 존재하는지 확인하고 없어졌으면 삭제해준다. this.issueCustomFieldValueService.checkExistIssueCustomFieldValue(customField, values, oldCustomFieldType); return; }*/ } else { // 텍스트 입력 필드일 때는 바로 종료 //if (customField.getCustomFieldType().equals(CustomFieldType.INPUT)) { if (!customField.getCustomFieldType().equals(CustomFieldType.MULTI_SELECT) && !customField.getCustomFieldType().equals(CustomFieldType.SINGLE_SELECT)) { return; } } // 사용자 정의 필드 값이 0개 일 경우에는 바로 종료 if (values.size() < 1) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_OPTIONS_NOT_VALUE)); } List customFieldValues = Lists.newArrayList(); List addValues = Lists.newArrayList(); List removeValues = Lists.newArrayList(); // 삭제해야할 대상을 추출한다. for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) { Boolean exist = false; for (String value : values) { if (value.equals(customFieldValue.getValue())) { exist = true; break; } } // 새로 올라온 값에 기존 값이 없으면 삭제대상 if (!exist) { removeValues.add(customFieldValue); } } // 추가해야할 값을 추출한다. for (String value : values) { Boolean exist = false; for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) { if (customFieldValue.getValue().equals(value)) { exist = true; break; } } // 새로 올라온 값이 기존에 없다면 추가 값 if (!exist) { addValues.add(value); } } // 삭제 대상 삭제 if (removeValues.size() > 0) { this.customFieldValueRepository.deleteInBatch(removeValues); } // 추가 대상 저장 for (String value : addValues) { CustomFieldValue customFieldValue = new CustomFieldValue(customField, value); customFieldValues.add(customFieldValue); } this.customFieldValueRepository.saveAll(customFieldValues); // 사용자 정의 필드 옵션 값이 변경되었을 때 사용자 정의 필드 값을 사용하는 이슈에서 해당 값이 존재하는지 확인하고 없어졌으면 삭제해준다. this.issueCustomFieldValueService.checkExistIssueCustomFieldValue(customField, values, oldCustomFieldType); } }