OWL ITS + 탐지시스템(인터넷 진흥원)
jhjang
2021-10-14 d680ff9fa4298ad3c0cd12f5f9d87f6c51110480
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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<CustomFieldValue, Long, JpaRepository<CustomFieldValue, Long>> implements CustomFieldValueService {
 
    private static final Logger log = LoggerFactory.getLogger(CustomFieldValueServiceImpl.class);
 
    @Autowired
    private CustomFieldValueRepository customFieldValueRepository;
 
    @Autowired
    private IssueCustomFieldValueService issueCustomFieldValueService;
 
    @Override
    protected JpaRepository<CustomFieldValue, Long> getRepository() {
        return this.customFieldValueRepository;
    }
 
    //  사용자 정의 필드 값을 추가한다.
    @Override
    @Transactional
    public void addCustomFieldValues(CustomField customField, List<String> values, CustomFieldType oldCustomFieldType) {
        if (oldCustomFieldType != null) {
            //  텍스트 입력 필드일 때는 이슈에서 사용되고 있는 사용자 정의 필드 값 확인 후 삭제 처리
            if (customField.getCustomFieldType().equals(CustomFieldType.INPUT)) {
                //  이전에도 텍스트 필드였다면 사용자 정의 필드 값을 삭제하지 않는다.
                if (CustomFieldType.INPUT.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);
            }
        }
        else {
            //  텍스트 입력 필드일 때는 바로 종료
            if (customField.getCustomFieldType().equals(CustomFieldType.INPUT)) {
                return;
            }
        }
 
        //  사용자 정의 필드 값이 0개 일 경우에는 바로 종료
        if (values.size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_OPTIONS_NOT_VALUE));
        }
 
        List<CustomFieldValue> customFieldValues = Lists.newArrayList();
        List<String> addValues = Lists.newArrayList();
        List<CustomFieldValue> 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);
    }
}