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> 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 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 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 targetIssueVersionContent = (Map) 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 issueVersions, Map results) { // 이슈 버전 정보를 만들어서 Vo 로 변환한다. IssueVersionVo targetIssueVersionVo = this.makeIssueVersionVo(targetIssueVersion); // 이슈 버전 정보를 만들어서 Vo 로 변환한다. IssueVersionVo nextIssueVersionVo = this.makeIssueVersionVo(nextIssueVersion); results.put("targetIssueVersionVo", targetIssueVersionVo); results.put("nextIssueVersionVo", nextIssueVersionVo); List issueVersionVos = ConvertUtil.convertObjectsToClasses(issueVersions, IssueVersionVo.class); issueVersionVos.remove(issueVersionVos.size() - 1); results.put("issueVersionList", issueVersionVos); } // 이슈 버전 정보 조회 @Override @Transactional(readOnly = true) public void find(Map resJsonData, IssueVersionCondition issueVersionCondition) { List issueVersions = this.issueVersionRepository.findByIssueId(issueVersionCondition.getIssueId()); Map 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); } }