package kr.wisestone.owl.service.impl;
|
|
import com.google.common.collect.Lists;
|
import com.google.gson.Gson;
|
import kr.wisestone.owl.constant.Constants;
|
import kr.wisestone.owl.domain.Issue;
|
import kr.wisestone.owl.domain.IssueVersion;
|
import kr.wisestone.owl.domain.User;
|
import kr.wisestone.owl.repository.IssueVersionRepository;
|
import kr.wisestone.owl.service.IssueService;
|
import kr.wisestone.owl.service.IssueVersionService;
|
import kr.wisestone.owl.service.UserService;
|
import kr.wisestone.owl.util.CommonUtil;
|
import kr.wisestone.owl.util.ConvertUtil;
|
import kr.wisestone.owl.vo.IssueVersionVo;
|
import kr.wisestone.owl.vo.IssueVo;
|
import kr.wisestone.owl.web.condition.IssueVersionCondition;
|
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.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
@Service
|
public class IssueVersionServiceImpl extends AbstractServiceImpl<IssueVersion, Long, JpaRepository<IssueVersion, Long>> implements IssueVersionService {
|
|
private static final Logger log = LoggerFactory.getLogger(IssueVersionServiceImpl.class);
|
|
@Autowired
|
private IssueVersionRepository issueVersionRepository;
|
|
@Autowired
|
private IssueService issueService;
|
|
@Autowired
|
private UserService userService;
|
|
@Override
|
protected JpaRepository<IssueVersion, Long> getRepository() {
|
return this.issueVersionRepository;
|
}
|
|
// 이슈 버전 생성
|
@Override
|
@Transactional
|
public void addIssueVersion(Issue issue) {
|
IssueVo issueVo = ConvertUtil.copyProperties(issue, IssueVo.class);
|
User user = this.webAppUtil.getLoginUserObject();
|
|
this.issueService.setIssueDetail(issueVo, issue, user); // 이슈 상세 정보를 셋팅한다.
|
|
List<IssueVersion> issueVersions = this.issueVersionRepository.findByIssueId(issueVo.getId());
|
|
Gson gson = new Gson();
|
String content = gson.toJson(issueVo);
|
IssueVersion issueVersion = new IssueVersion(issue, issue.getProject(), issue.getProject().getWorkspace(), content);
|
|
if (issueVersions.size() > 0) {
|
IssueVersion prevIssueVersion = issueVersions.get(issueVersions.size() - 1);
|
issueVersion.setVersion(prevIssueVersion.getVersion() + 1);
|
}
|
else {
|
issueVersion.setVersion(1);
|
}
|
|
this.issueVersionRepository.saveAndFlush(issueVersion);
|
}
|
|
// 이슈 버전 정보를 만들어서 Vo 로 변환한다.
|
private IssueVersionVo makeIssueVersionVo(IssueVersion issueVersion) {
|
IssueVersionVo issueVersionVo = ConvertUtil.copyProperties(issueVersion, IssueVersionVo.class); // 이전 버전
|
Gson gson = new Gson();
|
Map<String, Object> targetIssueVersionContent = (Map<String, Object>) gson.fromJson(issueVersionVo.getContent(), Object.class);
|
issueVersionVo.setContent(null);
|
issueVersionVo.setVersionHistory(targetIssueVersionContent);
|
User beforeModifyUser = this.userService.getUser(issueVersionVo.getModifyId());
|
issueVersionVo.setModifyByName(beforeModifyUser.getName() + "(" + CommonUtil.decryptAES128(beforeModifyUser.getAccount()) + ")");
|
|
return issueVersionVo;
|
}
|
|
// 선택한 버전과 그 다음 버전 정보를 Vo로 만들어 리턴한다.
|
private void makeTargetAndNextIssueVersion(IssueVersion targetIssueVersion, IssueVersion nextIssueVersion, List<IssueVersion> issueVersions, Map<String, Object> results) {
|
// 이슈 버전 정보를 만들어서 Vo 로 변환한다.
|
IssueVersionVo targetIssueVersionVo = this.makeIssueVersionVo(targetIssueVersion);
|
// 이슈 버전 정보를 만들어서 Vo 로 변환한다.
|
IssueVersionVo nextIssueVersionVo = this.makeIssueVersionVo(nextIssueVersion);
|
|
results.put("targetIssueVersionVo", targetIssueVersionVo);
|
results.put("nextIssueVersionVo", nextIssueVersionVo);
|
|
List<IssueVersionVo> issueVersionVos = ConvertUtil.convertObjectsToClasses(issueVersions, IssueVersionVo.class);
|
issueVersionVos.remove(issueVersionVos.size() - 1);
|
results.put("issueVersionList", issueVersionVos);
|
}
|
|
|
// 이슈 버전 정보 조회
|
@Override
|
@Transactional(readOnly = true)
|
public void find(Map<String, Object> resJsonData, IssueVersionCondition issueVersionCondition) {
|
List<IssueVersion> issueVersions = this.issueVersionRepository.findByIssueId(issueVersionCondition.getIssueId());
|
|
Map<String, Object> results = new HashMap<>();
|
results.put("targetIssueVersionVo", null);
|
results.put("nextIssueVersionVo", null);
|
results.put("issueVersionList", Lists.newArrayList());
|
|
if (issueVersionCondition.getId() == null) {
|
if (issueVersions.size() > 1) {
|
IssueVersion targetIssueVersion = issueVersions.get(issueVersions.size() - 2);
|
IssueVersion nextIssueVersion = issueVersions.get(issueVersions.size() - 1);
|
// 선택한 버전과 그 다음 버전 정보를 Vo 로 만들어 리턴한다.
|
this.makeTargetAndNextIssueVersion(targetIssueVersion, nextIssueVersion, issueVersions, results);
|
}
|
}
|
else {
|
IssueVersion targetIssueVersion = null; // 선택한 버전
|
IssueVersion nextIssueVersion = null; // 선택한 버전의 다음 버전
|
|
for (IssueVersion issueVersion : issueVersions) {
|
// 선택한 버전을 찾았으면 그 다음 버전을 찾는다.
|
if (targetIssueVersion != null) {
|
nextIssueVersion = issueVersion;
|
break;
|
}
|
|
// 선택한 버전을 찾는다.
|
if (issueVersion.getId().equals(issueVersionCondition.getId())) {
|
targetIssueVersion = issueVersion;
|
}
|
}
|
|
// 둘다 존재할 때만 버전 비교가 가능하다.
|
if (targetIssueVersion != null && nextIssueVersion != null) {
|
// 선택한 버전과 그 다음 버전 정보를 Vo 로 만들어 리턴한다.
|
this.makeTargetAndNextIssueVersion(targetIssueVersion, nextIssueVersion, issueVersions, results);
|
}
|
}
|
|
resJsonData.put(Constants.RES_KEY_CONTENTS, results);
|
|
}
|
}
|