package com.ctrip.framework.apollo.portal.service;
import com.google.gson.Gson;
import com.ctrip.framework.apollo.common.constants.GsonType;
import com.ctrip.framework.apollo.common.dto.PageDTO;
import com.ctrip.framework.apollo.common.dto.ReleaseDTO;
import com.ctrip.framework.apollo.common.dto.ReleaseHistoryDTO;
import com.ctrip.framework.apollo.common.entity.EntityPair;
import com.ctrip.framework.apollo.common.utils.BeanUtils;
import com.ctrip.framework.apollo.core.enums.Env;
import com.ctrip.framework.apollo.portal.api.AdminServiceAPI;
import com.ctrip.framework.apollo.portal.entity.bo.ReleaseHistoryBO;
import com.ctrip.framework.apollo.portal.util.RelativeDateFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service
public class ReleaseHistoryService {
private Gson gson = new Gson();
@Autowired
private AdminServiceAPI.ReleaseHistoryAPI releaseHistoryAPI;
@Autowired
private ReleaseService releaseService;
public ReleaseHistoryBO findLatestByReleaseIdAndOperation(Env env, long releaseId, int operation){
PageDTO<ReleaseHistoryDTO> pageDTO = releaseHistoryAPI.findByReleaseIdAndOperation(env, releaseId, operation, 0, 1);
if (pageDTO != null && pageDTO.hasContent()){
ReleaseHistoryDTO releaseHistory = pageDTO.getContent().get(0);
ReleaseDTO release = releaseService.findReleaseById(env, releaseHistory.getReleaseId());
return transformReleaseHistoryDTO2BO(releaseHistory, release);
}
return null;
}
public ReleaseHistoryBO findLatestByPreviousReleaseIdAndOperation(Env env, long previousReleaseId, int operation){
PageDTO<ReleaseHistoryDTO> pageDTO = releaseHistoryAPI.findByPreviousReleaseIdAndOperation(env, previousReleaseId, operation, 0, 1);
if (pageDTO != null && pageDTO.hasContent()){
ReleaseHistoryDTO releaseHistory = pageDTO.getContent().get(0);
ReleaseDTO release = releaseService.findReleaseById(env, releaseHistory.getReleaseId());
return transformReleaseHistoryDTO2BO(releaseHistory, release);
}
return null;
}
public List<ReleaseHistoryBO> findNamespaceReleaseHistory(String appId, Env env, String clusterName,
String namespaceName, int page, int size) {
PageDTO<ReleaseHistoryDTO> result = releaseHistoryAPI.findReleaseHistoriesByNamespace(appId, env, clusterName,
namespaceName, page, size);
if (result == null || !result.hasContent()) {
return Collections.emptyList();
}
List<ReleaseHistoryDTO> content = result.getContent();
Set<Long> releaseIds = new HashSet<>();
for (ReleaseHistoryDTO releaseHistoryDTO : content) {
long releaseId = releaseHistoryDTO.getReleaseId();
if (releaseId != 0) {
releaseIds.add(releaseId);
}
}
List<ReleaseDTO> releases = releaseService.findReleaseByIds(env, releaseIds);
return transformReleaseHistoryDTO2BO(content, releases);
}
private List<ReleaseHistoryBO> transformReleaseHistoryDTO2BO(List<ReleaseHistoryDTO> source,
List<ReleaseDTO> releases) {
Map<Long, ReleaseDTO> releasesMap = BeanUtils.mapByKey("id", releases);
List<ReleaseHistoryBO> bos = new ArrayList<>(source.size());
for (ReleaseHistoryDTO dto : source) {
ReleaseDTO release = releasesMap.get(dto.getReleaseId());
bos.add(transformReleaseHistoryDTO2BO(dto, release));
}
return bos;
}
private ReleaseHistoryBO transformReleaseHistoryDTO2BO(ReleaseHistoryDTO dto, ReleaseDTO release){
ReleaseHistoryBO bo = new ReleaseHistoryBO();
bo.setId(dto.getId());
bo.setAppId(dto.getAppId());
bo.setClusterName(dto.getClusterName());
bo.setNamespaceName(dto.getNamespaceName());
bo.setBranchName(dto.getBranchName());
bo.setReleaseId(dto.getReleaseId());
bo.setPreviousReleaseId(dto.getPreviousReleaseId());
bo.setOperator(dto.getDataChangeCreatedBy());
bo.setOperation(dto.getOperation());
Date releaseTime = dto.getDataChangeLastModifiedTime();
bo.setReleaseTime(releaseTime);
bo.setReleaseTimeFormatted(RelativeDateFormat.format(releaseTime));
bo.setOperationContext(dto.getOperationContext());
//set release info
setReleaseInfoToReleaseHistoryBO(bo, release);
return bo;
}
private void setReleaseInfoToReleaseHistoryBO(ReleaseHistoryBO bo, ReleaseDTO release) {
if (release != null) {
bo.setReleaseTitle(release.getName());
bo.setReleaseComment(release.getComment());
Map<String, String> configuration = gson.fromJson(release.getConfigurations(), GsonType.CONFIG);
List<EntityPair<String>> items = new ArrayList<>(configuration.size());
for (Map.Entry<String, String> entry : configuration.entrySet()) {
EntityPair<String> entityPair = new EntityPair<>(entry.getKey(), entry.getValue());
items.add(entityPair);
}
bo.setConfiguration(items);
} else {
bo.setReleaseTitle("no release information");
bo.setConfiguration(null);
}
}
}