diff --git a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppController.java b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppController.java index 7acd0eb74f540380840ef3948549ec7941680c67..b2d324ed0c942c2f2d9454549abc006bb0628314 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppController.java @@ -73,4 +73,9 @@ public class AppController { return BeanUtils.transfrom(AppDTO.class, app); } + @RequestMapping("/apps/{appId}/unique") + public boolean isAppIdUnique(@PathVariable("appId") String appId) { + return appService.isAppIdUnique(appId); + } + } diff --git a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppNamespaceController.java b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppNamespaceController.java new file mode 100644 index 0000000000000000000000000000000000000000..c0e63b83a2ab718923fc30ca6f22c66f93ced32f --- /dev/null +++ b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/AppNamespaceController.java @@ -0,0 +1,21 @@ +package com.ctrip.apollo.adminservice.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ctrip.apollo.biz.service.AppNamespaceService; + +@RestController +public class AppNamespaceController { + + @Autowired + private AppNamespaceService appNamespaceService; + + @RequestMapping("/apps/{appId}/appnamespace/{appnamespace}/unique") + public boolean isAppNamespaceUnique(@PathVariable("appId") String appId, + @PathVariable("appnamespace") String appnamespace) { + return appNamespaceService.isAppNamespaceNameUnique(appId, appnamespace); + } +} diff --git a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ClusterController.java b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ClusterController.java index e866fd5ad81736cc5804b2e22d632a5f83c2de6a..eea822ded157cce4e46ad1665a5a51ac4a429b21 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ClusterController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ClusterController.java @@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.RestController; import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.service.ClusterService; -import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.common.auth.ActiveUser; import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.core.dto.ClusterDTO; @@ -21,9 +20,6 @@ import com.ctrip.apollo.core.exception.NotFoundException; @RestController public class ClusterController { - @Autowired - private ViewService viewService; - @Autowired private ClusterService clusterService; @@ -56,7 +52,7 @@ public class ClusterController { @RequestMapping("/apps/{appId}/clusters") public List find(@PathVariable("appId") String appId) { - List clusters = viewService.findClusters(appId); + List clusters = clusterService.findClusters(appId); return BeanUtils.batchTransform(ClusterDTO.class, clusters); } @@ -68,4 +64,9 @@ public class ClusterController { return BeanUtils.transfrom(ClusterDTO.class, cluster); } + @RequestMapping("/apps/{appId}/cluster/{clusterName}/unique") + public boolean isAppIdUnique(@PathVariable("appId") String appId, + @PathVariable("clusterName") String clusterName) { + return clusterService.isClusterNameUnique(appId, clusterName); + } } diff --git a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ItemController.java b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ItemController.java index 726267098fc36a584c5c4b9eab8096e7a2ff5ed6..502941902032511ed07798398c4e6870084b1fa4 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ItemController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ItemController.java @@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.RestController; import com.ctrip.apollo.biz.entity.Item; import com.ctrip.apollo.biz.service.ItemService; -import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.common.auth.ActiveUser; import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.core.dto.ItemDTO; @@ -22,9 +21,6 @@ import com.ctrip.apollo.core.exception.NotFoundException; @RestController public class ItemController { - @Autowired - private ViewService viewService; - @Autowired private ItemService itemService; @@ -59,7 +55,7 @@ public class ItemController { public List findItems(@PathVariable("appId") String appId, @PathVariable("clusterName") String clusterName, @PathVariable("namespaceName") String namespaceName) { - List items = viewService.findItems(appId, clusterName, namespaceName); + List items = itemService.findItems(appId, clusterName, namespaceName); List itemDTOs = new LinkedList<>(); for (Item item: items){ diff --git a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/NamespaceController.java b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/NamespaceController.java index 5bc826f48d3aea479935c1783a610436f40e2ba1..3df6ad2a0b5eed70583d0974044b1ef3f5bf5abc 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/NamespaceController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/NamespaceController.java @@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.RestController; import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.service.NamespaceService; -import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.common.auth.ActiveUser; import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.core.dto.NamespaceDTO; @@ -21,9 +20,6 @@ import com.ctrip.apollo.core.exception.NotFoundException; @RestController public class NamespaceController { - @Autowired - private ViewService viewService; - @Autowired private NamespaceService namespaceService; @@ -59,7 +55,7 @@ public class NamespaceController { @RequestMapping("/apps/{appId}/clusters/{clusterName}/namespaces") public List find(@PathVariable("appId") String appId, @PathVariable("clusterName") String clusterName) { - List groups = viewService.findNamespaces(appId, clusterName); + List groups = namespaceService.findNamespaces(appId, clusterName); return BeanUtils.batchTransform(NamespaceDTO.class, groups); } diff --git a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ReleaseController.java b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ReleaseController.java index e8fc573251f12e63ccb7727287e7826d54bd5eb6..97fdb7179856319e5857dcecb6a8643348b24290 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ReleaseController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/apollo/adminservice/controller/ReleaseController.java @@ -15,7 +15,6 @@ import com.ctrip.apollo.biz.entity.Release; import com.ctrip.apollo.biz.service.ConfigService; import com.ctrip.apollo.biz.service.NamespaceService; import com.ctrip.apollo.biz.service.ReleaseService; -import com.ctrip.apollo.biz.service.ViewService; import com.ctrip.apollo.common.auth.ActiveUser; import com.ctrip.apollo.common.utils.BeanUtils; import com.ctrip.apollo.core.dto.ReleaseDTO; @@ -24,9 +23,6 @@ import com.ctrip.apollo.core.exception.NotFoundException; @RestController public class ReleaseController { - @Autowired - private ViewService viewSerivce; - @Autowired private ReleaseService releaseService; @@ -48,7 +44,7 @@ public class ReleaseController { public List find(@PathVariable("appId") String appId, @PathVariable("clusterName") String clusterName, @PathVariable("namespaceName") String namespaceName) { - List releases = viewSerivce.findReleases(appId, clusterName, namespaceName); + List releases = releaseService.findReleases(appId, clusterName, namespaceName); return BeanUtils.batchTransform(ReleaseDTO.class, releases); } diff --git a/apollo-adminservice/src/test/java/com/ctrip/apollo/adminservice/controller/AppControllerTest.java b/apollo-adminservice/src/test/java/com/ctrip/apollo/adminservice/controller/AppControllerTest.java index 909e58288a9a1548a2abdebfc9d2870a1fb61896..9393201036e4148249c369bb128a0208a932b5f1 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/apollo/adminservice/controller/AppControllerTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/apollo/adminservice/controller/AppControllerTest.java @@ -23,6 +23,24 @@ public class AppControllerTest extends AbstractControllerTest { return "http://localhost:" + port + "/apps/"; } + @Test + public void testCheckIfAppIdUnique() { + AppDTO dto = generateSampleDTOData(); + ResponseEntity response = + restTemplate.postForEntity(getBaseAppUrl(), dto, AppDTO.class); + AppDTO result = response.getBody(); + Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); + Assert.assertEquals(dto.getAppId(), result.getAppId()); + Assert.assertTrue(result.getId() > 0); + + Boolean falseUnique = + restTemplate.getForObject(getBaseAppUrl() + dto.getAppId() + "/unique", Boolean.class); + Assert.assertFalse(falseUnique); + Boolean trueUnique = restTemplate + .getForObject(getBaseAppUrl() + dto.getAppId() + "true" + "/unique", Boolean.class); + Assert.assertTrue(trueUnique); + } + @Test @Sql(scripts = "/controller/cleanup.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD) public void testCreate() { diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/repository/AppNamespaceRepository.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/repository/AppNamespaceRepository.java index 827aa8154ce533fd2162276c8f42df4493ba0a50..31519028d8c4e14042569a290e6b084896807ea0 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/repository/AppNamespaceRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/repository/AppNamespaceRepository.java @@ -6,4 +6,6 @@ import com.ctrip.apollo.biz.entity.AppNamespace; public interface AppNamespaceRepository extends PagingAndSortingRepository{ + AppNamespace findByAppIdAndName(String appId, String namespaceName); + } diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AdminService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AdminService.java index 1baf72765d7e27726bed5785ad466892e1b9fc17..7b4b935061020c52d656ae4b7317ac2f8c70d916 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AdminService.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AdminService.java @@ -5,85 +5,36 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ctrip.apollo.biz.entity.App; -import com.ctrip.apollo.biz.entity.AppNamespace; -import com.ctrip.apollo.biz.entity.Audit; -import com.ctrip.apollo.biz.entity.Cluster; -import com.ctrip.apollo.biz.entity.Namespace; -import com.ctrip.apollo.biz.repository.AppNamespaceRepository; -import com.ctrip.apollo.biz.repository.AppRepository; -import com.ctrip.apollo.biz.repository.ClusterRepository; -import com.ctrip.apollo.biz.repository.NamespaceRepository; -import com.ctrip.apollo.core.ConfigConsts; @Service public class AdminService { @Autowired - private AppRepository appRepository; + private AppService appService; @Autowired - private AppNamespaceRepository appNamespaceRepository; + private AppNamespaceService appNamespaceService; @Autowired - private NamespaceRepository namespaceRepository; + private ClusterService clusterService; @Autowired - private ClusterRepository clusterRepository; - - @Autowired - private AuditService auditService; + private NamespaceService namespaceService; @Transactional public App createNewApp(App app) { String createBy = app.getDataChangeCreatedBy(); - App createdApp = appRepository.save(app); - - auditService.audit(App.class.getSimpleName(), createdApp.getId(), Audit.OP.INSERT, createBy); + App createdApp = appService.save(app); String appId = createdApp.getAppId(); - createDefaultAppNamespace(appId, createBy); + appNamespaceService.createDefaultAppNamespace(appId, createBy); - createDefaultCluster(appId, createBy); + clusterService.createDefaultCluster(appId, createBy); - createDefaultNamespace(appId, createBy); + namespaceService.createDefaultNamespace(appId, createBy); return app; } - private void createDefaultAppNamespace(String appId, String createBy) { - AppNamespace appNs = new AppNamespace(); - appNs.setAppId(appId); - appNs.setName(appId); - appNs.setComment("default app namespace"); - appNs.setDataChangeCreatedBy(createBy); - appNs.setDataChangeLastModifiedBy(createBy); - appNamespaceRepository.save(appNs); - - auditService.audit(AppNamespace.class.getSimpleName(), appNs.getId(), Audit.OP.INSERT, - createBy); - } - - private void createDefaultCluster(String appId, String createBy) { - Cluster cluster = new Cluster(); - cluster.setName(ConfigConsts.CLUSTER_NAME_DEFAULT); - cluster.setAppId(appId); - cluster.setDataChangeCreatedBy(createBy); - cluster.setDataChangeLastModifiedBy(createBy); - clusterRepository.save(cluster); - - auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT, createBy); - } - - private void createDefaultNamespace(String appId, String createBy) { - Namespace ns = new Namespace(); - ns.setAppId(appId); - ns.setClusterName(ConfigConsts.CLUSTER_NAME_DEFAULT); - ns.setNamespaceName(appId); - ns.setDataChangeCreatedBy(createBy); - ns.setDataChangeLastModifiedBy(createBy); - namespaceRepository.save(ns); - - auditService.audit(Namespace.class.getSimpleName(), ns.getId(), Audit.OP.INSERT, createBy); - } } diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppNamespaceService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppNamespaceService.java new file mode 100644 index 0000000000000000000000000000000000000000..86681f6e5973a6f913b48e7303eebd4d57636f26 --- /dev/null +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppNamespaceService.java @@ -0,0 +1,45 @@ +package com.ctrip.apollo.biz.service; + +import java.util.Objects; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ctrip.apollo.biz.entity.AppNamespace; +import com.ctrip.apollo.biz.entity.Audit; +import com.ctrip.apollo.biz.repository.AppNamespaceRepository; +import com.ctrip.apollo.core.exception.ServiceException; + +@Service +public class AppNamespaceService { + + @Autowired + private AppNamespaceRepository appNamespaceRepository; + + @Autowired + private AuditService auditService; + + public boolean isAppNamespaceNameUnique(String appId, String namespaceName) { + Objects.requireNonNull(appId, "AppId must not be null"); + Objects.requireNonNull(namespaceName, "Namespace must not be null"); + return Objects.isNull(appNamespaceRepository.findByAppIdAndName(appId, namespaceName)); + } + + @Transactional + public void createDefaultAppNamespace(String appId, String createBy) { + if (!isAppNamespaceNameUnique(appId, appId)) { + throw new ServiceException("appnamespace not unique"); + } + AppNamespace appNs = new AppNamespace(); + appNs.setAppId(appId); + appNs.setName(appId); + appNs.setComment("default app namespace"); + appNs.setDataChangeCreatedBy(createBy); + appNs.setDataChangeLastModifiedBy(createBy); + appNamespaceRepository.save(appNs); + + auditService.audit(AppNamespace.class.getSimpleName(), appNs.getId(), Audit.OP.INSERT, + createBy); + } +} diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppService.java index 247d668a29687643767fcb37e0c61ed6bac0a5ae..6640f809424f523cd895fbe52298a50d896bd263 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppService.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/AppService.java @@ -1,6 +1,7 @@ package com.ctrip.apollo.biz.service; import java.util.List; +import java.util.Objects; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -12,6 +13,7 @@ import com.ctrip.apollo.biz.entity.App; import com.ctrip.apollo.biz.entity.Audit; import com.ctrip.apollo.biz.repository.AppRepository; import com.ctrip.apollo.common.utils.BeanUtils; +import com.ctrip.apollo.core.exception.ServiceException; @Service public class AppService { @@ -22,6 +24,11 @@ public class AppService { @Autowired private AuditService auditService; + public boolean isAppIdUnique(String appId) { + Objects.requireNonNull(appId, "AppId must not be null"); + return Objects.isNull(appRepository.findByAppId(appId)); + } + @Transactional public void delete(long id, String owner) { appRepository.delete(id); @@ -44,6 +51,9 @@ public class AppService { @Transactional public App save(App entity) { + if (!isAppIdUnique(entity.getAppId())) { + throw new ServiceException("appId not unique"); + } App app = appRepository.save(entity); auditService.audit(App.class.getSimpleName(), app.getId(), Audit.OP.INSERT, diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ClusterService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ClusterService.java index 83c2831548c9424a2a7ea55a65b97f20ed27878d..cc5222692200bf62afc510c4b1746006fca5f36d 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ClusterService.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ClusterService.java @@ -1,5 +1,9 @@ package com.ctrip.apollo.biz.service; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -8,6 +12,9 @@ import com.ctrip.apollo.biz.entity.Audit; import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.repository.ClusterRepository; import com.ctrip.apollo.common.utils.BeanUtils; +import com.ctrip.apollo.core.ConfigConsts; +import com.ctrip.apollo.core.exception.ServiceException; +import com.google.common.base.Strings; @Service public class ClusterService { @@ -18,12 +25,33 @@ public class ClusterService { @Autowired private AuditService auditService; + public boolean isClusterNameUnique(String appId, String clusterName) { + Objects.requireNonNull(appId, "AppId must not be null"); + Objects.requireNonNull(clusterName, "ClusterName must not be null"); + return Objects.isNull(clusterRepository.findByAppIdAndName(appId, clusterName)); + } + public Cluster findOne(String appId, String name) { return clusterRepository.findByAppIdAndName(appId, name); } + public List findClusters(String appId) { + if (Strings.isNullOrEmpty(appId)) { + return Collections.emptyList(); + } + + List clusters = clusterRepository.findByAppId(appId); + if (clusters == null) { + return Collections.emptyList(); + } + return clusters; + } + @Transactional public Cluster save(Cluster entity) { + if (!isClusterNameUnique(entity.getAppId(), entity.getName())) { + throw new ServiceException("cluster not unique"); + } Cluster cluster = clusterRepository.save(entity); auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT, @@ -51,4 +79,19 @@ public class ClusterService { return managedCluster; } + + @Transactional + public void createDefaultCluster(String appId, String createBy) { + if (!isClusterNameUnique(appId, ConfigConsts.CLUSTER_NAME_DEFAULT)) { + throw new ServiceException("cluster not unique"); + } + Cluster cluster = new Cluster(); + cluster.setName(ConfigConsts.CLUSTER_NAME_DEFAULT); + cluster.setAppId(appId); + cluster.setDataChangeCreatedBy(createBy); + cluster.setDataChangeLastModifiedBy(createBy); + clusterRepository.save(cluster); + + auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT, createBy); + } } diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ItemService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ItemService.java index dcec785086e30acef9f9b6b448e49bc2cfb44473..16d5a00f9c6f18fe9af611f85d7f310f99f6bce5 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ItemService.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ItemService.java @@ -1,5 +1,8 @@ package com.ctrip.apollo.biz.service; +import java.util.Collections; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +50,24 @@ public class ItemService { return item; } + public List findItems(Long namespaceId) { + List items = itemRepository.findByNamespaceIdOrderByLineNumAsc(namespaceId); + if (items == null) { + return Collections.emptyList(); + } + return items; + } + + public List findItems(String appId, String clusterName, String namespaceName) { + Namespace group = namespaceRepository.findByAppIdAndClusterNameAndNamespaceName(appId, clusterName, + namespaceName); + if (group != null) { + return findItems(group.getId()); + } else { + return Collections.emptyList(); + } + } + @Transactional public Item save(Item entity) { Item item = itemRepository.save(entity); diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/NamespaceService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/NamespaceService.java index 9a9410aefbef3b032e4824e17c196c6dcb549749..93433c5b52a79004e4d9bfd6e69ade6886575701 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/NamespaceService.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/NamespaceService.java @@ -1,5 +1,9 @@ package com.ctrip.apollo.biz.service; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -8,6 +12,8 @@ import com.ctrip.apollo.biz.entity.Audit; import com.ctrip.apollo.biz.entity.Namespace; import com.ctrip.apollo.biz.repository.NamespaceRepository; import com.ctrip.apollo.common.utils.BeanUtils; +import com.ctrip.apollo.core.ConfigConsts; +import com.ctrip.apollo.core.exception.ServiceException; @Service public class NamespaceService { @@ -18,6 +24,14 @@ public class NamespaceService { @Autowired private AuditService auditService; + public boolean isNamespaceUnique(String appId, String cluster, String namespace) { + Objects.requireNonNull(appId, "AppId must not be null"); + Objects.requireNonNull(cluster, "Cluster must not be null"); + Objects.requireNonNull(namespace, "Namespace must not be null"); + return Objects.isNull( + namespaceRepository.findByAppIdAndClusterNameAndNamespaceName(appId, cluster, namespace)); + } + @Transactional public void delete(long id, String owner) { namespaceRepository.delete(id); @@ -34,8 +48,19 @@ public class NamespaceService { namespaceName); } + public List findNamespaces(String appId, String clusterName) { + List groups = namespaceRepository.findByAppIdAndClusterName(appId, clusterName); + if (groups == null) { + return Collections.emptyList(); + } + return groups; + } + @Transactional public Namespace save(Namespace entity) { + if (!isNamespaceUnique(entity.getAppId(), entity.getClusterName(), entity.getNamespaceName())) { + throw new ServiceException("namespace not unique"); + } Namespace namespace = namespaceRepository.save(entity); auditService.audit(Namespace.class.getSimpleName(), namespace.getId(), Audit.OP.INSERT, @@ -53,7 +78,24 @@ public class NamespaceService { auditService.audit(Namespace.class.getSimpleName(), managedNamespace.getId(), Audit.OP.UPDATE, managedNamespace.getDataChangeLastModifiedBy()); - + return managedNamespace; } + + @Transactional + public void createDefaultNamespace(String appId, String createBy) { + if (!isNamespaceUnique(appId, ConfigConsts.CLUSTER_NAME_DEFAULT, appId)) { + throw new ServiceException("namespace not unique"); + } + + Namespace ns = new Namespace(); + ns.setAppId(appId); + ns.setClusterName(ConfigConsts.CLUSTER_NAME_DEFAULT); + ns.setNamespaceName(appId); + ns.setDataChangeCreatedBy(createBy); + ns.setDataChangeLastModifiedBy(createBy); + namespaceRepository.save(ns); + + auditService.audit(Namespace.class.getSimpleName(), ns.getId(), Audit.OP.INSERT, createBy); + } } diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ReleaseService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ReleaseService.java index 52e88eec4bc82caef3bffcfbd3c7ceb598195594..c861365907756e39914b004cfb12689ba6e055c0 100644 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ReleaseService.java +++ b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ReleaseService.java @@ -1,5 +1,6 @@ package com.ctrip.apollo.biz.service; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -40,6 +41,15 @@ public class ReleaseService { return release; } + public List findReleases(String appId, String clusterName, String namespaceName) { + List releases = releaseRepository.findByAppIdAndClusterNameAndNamespaceName(appId, + clusterName, namespaceName); + if (releases == null) { + return Collections.emptyList(); + } + return releases; + } + @Transactional public Release buildRelease(String name, String comment, Namespace namespace, String owner) { List items = itemRepository.findByNamespaceIdOrderByLineNumAsc(namespace.getId()); diff --git a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ViewService.java b/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ViewService.java deleted file mode 100644 index a7d2873d1096b65150e3980104c3dba724862125..0000000000000000000000000000000000000000 --- a/apollo-biz/src/main/java/com/ctrip/apollo/biz/service/ViewService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.ctrip.apollo.biz.service; - -import java.util.Collections; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.ctrip.apollo.biz.entity.Cluster; -import com.ctrip.apollo.biz.entity.Namespace; -import com.ctrip.apollo.biz.entity.Item; -import com.ctrip.apollo.biz.entity.Release; -import com.ctrip.apollo.biz.repository.ClusterRepository; -import com.ctrip.apollo.biz.repository.NamespaceRepository; -import com.ctrip.apollo.biz.repository.ItemRepository; -import com.ctrip.apollo.biz.repository.ReleaseRepository; -import com.google.common.base.Strings; - -/** - * config service for admin - */ -@Service -public class ViewService { - - @Autowired - private ClusterRepository clusterRepository; - - @Autowired - private NamespaceRepository namespaceRepository; - - @Autowired - private ItemRepository itemRepository; - - @Autowired - private ReleaseRepository releaseRepository; - - public List findClusters(String appId) { - if (Strings.isNullOrEmpty(appId)) { - return Collections.emptyList(); - } - - List clusters = clusterRepository.findByAppId(appId); - if (clusters == null) { - return Collections.emptyList(); - } - return clusters; - } - - public List findNamespaces(String appId, String clusterName) { - List groups = namespaceRepository.findByAppIdAndClusterName(appId, clusterName); - if (groups == null) { - return Collections.emptyList(); - } - return groups; - } - - public List findItems(String appId, String clusterName, String namespaceName) { - Namespace group = namespaceRepository.findByAppIdAndClusterNameAndNamespaceName(appId, clusterName, - namespaceName); - if (group != null) { - return findItems(group.getId()); - } else { - return Collections.emptyList(); - } - } - - public List findItems(Long namespaceId) { - List items = itemRepository.findByNamespaceIdOrderByLineNumAsc(namespaceId); - if (items == null) { - return Collections.emptyList(); - } - return items; - } - - public List findReleases(String appId, String clusterName, String namespaceName) { - List releases = releaseRepository.findByAppIdAndClusterNameAndNamespaceName(appId, - clusterName, namespaceName); - if (releases == null) { - return Collections.emptyList(); - } - return releases; - } - -} diff --git a/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/AdminServiceTest.java b/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/AdminServiceTest.java index 4fdab1c4d6c495be2758aeb68ac31b6595273726..bff5ae75d2805d9aeabc7a37211f597384050372 100644 --- a/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/AdminServiceTest.java +++ b/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/AdminServiceTest.java @@ -17,7 +17,9 @@ import com.ctrip.apollo.biz.entity.App; import com.ctrip.apollo.biz.entity.Audit; import com.ctrip.apollo.biz.entity.Cluster; import com.ctrip.apollo.biz.entity.Namespace; +import com.ctrip.apollo.biz.repository.AppRepository; import com.ctrip.apollo.core.ConfigConsts; +import com.ctrip.apollo.core.exception.ServiceException; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = BizTestConfiguration.class) @@ -29,10 +31,16 @@ public class AdminServiceTest { private AdminService adminService; @Autowired - private ViewService viewService; + private AuditService auditService; @Autowired - private AuditService auditService; + private AppRepository appRepository; + + @Autowired + private ClusterService clsuterService; + + @Autowired + private NamespaceService namespaceService; @Test public void testCreateNewApp() { @@ -50,11 +58,11 @@ public class AdminServiceTest { app = adminService.createNewApp(app); Assert.assertEquals(appId, app.getAppId()); - List clusters = viewService.findClusters(app.getAppId()); + List clusters = clsuterService.findClusters(app.getAppId()); Assert.assertEquals(1, clusters.size()); Assert.assertEquals(ConfigConsts.CLUSTER_NAME_DEFAULT, clusters.get(0).getName()); - List namespaces = viewService.findNamespaces(appId, clusters.get(0).getName()); + List namespaces = namespaceService.findNamespaces(appId, clusters.get(0).getName()); Assert.assertEquals(1, namespaces.size()); Assert.assertEquals(appId, namespaces.get(0).getNamespaceName()); @@ -62,4 +70,22 @@ public class AdminServiceTest { Assert.assertEquals(4, audits.size()); } + @Test(expected = ServiceException.class) + public void testCreateDuplicateApp() { + String appId = "someAppId"; + App app = new App(); + app.setAppId(appId); + app.setName("someAppName"); + String owner = "someOwnerName"; + app.setOwnerName(owner); + app.setOwnerEmail("someOwnerName@ctrip.com"); + app.setDataChangeCreatedBy(owner); + app.setDataChangeLastModifiedBy(owner); + app.setDataChangeCreatedTime(new Date()); + + appRepository.save(app); + + adminService.createNewApp(app); + } + } diff --git a/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/ClusterServiceTest.java b/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/ClusterServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..08903bf69e544e8e88abac5cf2d414c2a88e87ec --- /dev/null +++ b/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/ClusterServiceTest.java @@ -0,0 +1,46 @@ +package com.ctrip.apollo.biz.service; + +import java.util.Date; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +import com.ctrip.apollo.biz.BizTestConfiguration; +import com.ctrip.apollo.biz.entity.App; +import com.ctrip.apollo.core.exception.ServiceException; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = BizTestConfiguration.class) +@Transactional +@Rollback +public class ClusterServiceTest { + + @Autowired + private AdminService adminService; + + @Autowired + private ClusterService clusterService; + + @Test(expected = ServiceException.class) + public void testCreateDuplicateCluster() { + String appId = "someAppId"; + App app = new App(); + app.setAppId(appId); + app.setName("someAppName"); + String owner = "someOwnerName"; + app.setOwnerName(owner); + app.setOwnerEmail("someOwnerName@ctrip.com"); + app.setDataChangeCreatedBy(owner); + app.setDataChangeLastModifiedBy(owner); + app.setDataChangeCreatedTime(new Date()); + + adminService.createNewApp(app); + + clusterService.createDefaultCluster(appId, owner); + } +} diff --git a/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/PrivilegeServiceTest.java b/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/PrivilegeServiceTest.java index 8b7b7bd9b237a771ee01aa6509c79cba6c1be530..601791983f4ff684c4b9f744ca9e493a9e86cf33 100644 --- a/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/PrivilegeServiceTest.java +++ b/apollo-biz/src/test/java/com/ctrip/apollo/biz/service/PrivilegeServiceTest.java @@ -28,8 +28,11 @@ public class PrivilegeServiceTest { private AdminService adminService; @Autowired - private ViewService viewService; + private ClusterService clusterService; + @Autowired + private NamespaceService namespaceService; + @Autowired private PrivilegeService privilService; @@ -46,9 +49,9 @@ public class PrivilegeServiceTest { app.setDataChangeCreatedTime(new Date()); App newApp = adminService.createNewApp(app); - List clusters = viewService.findClusters(newApp.getAppId()); + List clusters = clusterService.findClusters(newApp.getAppId()); List namespaces = - viewService.findNamespaces(newApp.getAppId(), clusters.get(0).getName()); + namespaceService.findNamespaces(newApp.getAppId(), clusters.get(0).getName()); Namespace namespace = namespaces.get(0); privilService.addPrivilege(namespace.getId(), newApp.getOwnerName(), @@ -76,9 +79,9 @@ public class PrivilegeServiceTest { app.setDataChangeLastModifiedBy(owner); app.setDataChangeCreatedTime(new Date()); App newApp = adminService.createNewApp(app); - List clusters = viewService.findClusters(newApp.getAppId()); + List clusters = clusterService.findClusters(newApp.getAppId()); List namespaces = - viewService.findNamespaces(newApp.getAppId(), clusters.get(0).getName()); + namespaceService.findNamespaces(newApp.getAppId(), clusters.get(0).getName()); Namespace namespace = namespaces.get(0); privilService.addPrivilege(namespace.getId(), newApp.getOwnerName(),