content: package com.ctrip.framework.apollo.adminservice.controller;
  
  import com.ctrip.framework.apollo.biz.entity.Cluster;
  import com.ctrip.framework.apollo.biz.service.ClusterService;
  import com.ctrip.framework.apollo.common.dto.ClusterDTO;
  import com.ctrip.framework.apollo.common.exception.BadRequestException;
  import com.ctrip.framework.apollo.common.exception.NotFoundException;
  import com.ctrip.framework.apollo.common.utils.BeanUtils;
  import com.ctrip.framework.apollo.common.utils.InputValidator;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestBody;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestMethod;
  import org.springframework.web.bind.annotation.RequestParam;
  import org.springframework.web.bind.annotation.RestController;
  
  import java.util.List;
  
  @RestController
  public class ClusterController {
  
    @Autowired
    private ClusterService clusterService;
  
    @RequestMapping(path = "/apps/{appId}/clusters", method = RequestMethod.POST)
    public ClusterDTO create(@PathVariable("appId") String appId,
                             @RequestParam(value = "autoCreatePrivateNamespace", defaultValue = "true") boolean autoCreatePrivateNamespace,
                             @RequestBody ClusterDTO dto) {
      if (!InputValidator.isValidClusterNamespace(dto.getName())) {
        throw new BadRequestException(String.format("Cluster格式错误: %s", InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));
      }
  
      Cluster entity = BeanUtils.transfrom(Cluster.class, dto);
      Cluster managedEntity = clusterService.findOne(appId, entity.getName());
      if (managedEntity != null) {
        throw new BadRequestException("cluster already exist.");
      }
  
      if (autoCreatePrivateNamespace) {
        entity = clusterService.saveWithInstanceOfAppNamespaces(entity);
      } else {
        entity = clusterService.saveWithoutInstanceOfAppNamespaces(entity);
      }
  
      dto = BeanUtils.transfrom(ClusterDTO.class, entity);
      return dto;
    }
  
    @RequestMapping(path = "/apps/{appId}/clusters/{clusterName:.+}", method = RequestMethod.DELETE)
    public void delete(@PathVariable("appId") String appId,
                       @PathVariable("clusterName") String clusterName, @RequestParam String operator) {
      Cluster entity = clusterService.findOne(appId, clusterName);
      if (entity == null) {
        throw new NotFoundException("cluster not found for clusterName " + clusterName);
      }
      clusterService.delete(entity.getId(), operator);
    }
  
    @RequestMapping(value = "/apps/{appId}/clusters", method = RequestMethod.GET)
    public List<ClusterDTO> find(@PathVariable("appId") String appId) {
      List<Cluster> clusters = clusterService.findParentClusters(appId);
      return BeanUtils.batchTransform(ClusterDTO.class, clusters);
    }
  
    @RequestMapping(value = "/apps/{appId}/clusters/{clusterName:.+}", method = RequestMethod.GET)
    public ClusterDTO get(@PathVariable("appId") String appId,
                          @PathVariable("clusterName") String clusterName) {
      Cluster cluster = clusterService.findOne(appId, clusterName);
      if (cluster == null) {
        throw new NotFoundException("cluster not found for name " + clusterName);
      }
      return BeanUtils.transfrom(ClusterDTO.class, cluster);
    }
  
    @RequestMapping(value = "/apps/{appId}/cluster/{clusterName}/unique", method = RequestMethod.GET)
    public boolean isAppIdUnique(@PathVariable("appId") String appId,
                                 @PathVariable("clusterName") String clusterName) {
      return clusterService.isClusterNameUnique(appId, clusterName);
    }
  }
  