OWL ITS + 탐지시스템(인터넷 진흥원)
minhee
2022-02-21 95f9639088ab6a5615aa348eb206d14541782000
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
126
127
128
129
130
131
132
133
134
135
136
137
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(!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<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);
    }
}