diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java index a697d8fac3aa2facd0090c92967c5b0d80a1b11d..6603239f95bb45a636dd1abc669eaca295958db9 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/api/AdminServiceAPI.java @@ -71,13 +71,6 @@ public class AdminServiceAPI { return dto; } - public List findPublicAppNamespaces(Env env) { - AppNamespaceDTO[] - appNamespaceDTOs = - restTemplate.getForObject("{host}/appnamespaces/public", AppNamespaceDTO[].class - , getAdminServiceHost(env)); - return Arrays.asList(appNamespaceDTOs); - } public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) { return restTemplate @@ -85,7 +78,7 @@ public class AdminServiceAPI { getAdminServiceHost(env), namespace.getAppId(), namespace.getClusterName()).getBody(); } - public AppNamespaceDTO createOrUpdate(Env env, AppNamespaceDTO appNamespace) { + public AppNamespaceDTO createOrUpdateAppNamespace(Env env, AppNamespaceDTO appNamespace) { return restTemplate.postForEntity("{host}/apps/{appId}/appnamespaces", appNamespace, AppNamespaceDTO.class, getAdminServiceHost(env), appNamespace.getAppId()).getBody(); } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java index 938b97ae60e4754c23e3f34dcd941ff91736c86f..b985433d5edc1edcd6155cce67e663d2658abc15 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java @@ -1,13 +1,16 @@ package com.ctrip.framework.apollo.portal.controller; import com.ctrip.framework.apollo.common.entity.AppNamespace; -import com.ctrip.framework.apollo.core.dto.AppNamespaceDTO; import com.ctrip.framework.apollo.core.dto.NamespaceDTO; import com.ctrip.framework.apollo.core.enums.Env; +import com.ctrip.framework.apollo.core.utils.StringUtils; +import com.ctrip.framework.apollo.portal.auth.UserInfoHolder; import com.ctrip.framework.apollo.portal.entity.vo.NamespaceVO; +import com.ctrip.framework.apollo.portal.listener.AppNamespaceCreationEvent; import com.ctrip.framework.apollo.portal.service.NamespaceService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -22,6 +25,10 @@ import static com.ctrip.framework.apollo.portal.util.RequestPrecondition.checkAr @RestController public class NamespaceController { + @Autowired + private ApplicationEventPublisher publisher; + @Autowired + private UserInfoHolder userInfoHolder; @Autowired private NamespaceService namespaceService; @@ -30,7 +37,7 @@ public class NamespaceController { return namespaceService.findPublicAppNamespaces(); } - @PreAuthorize(value = "@permissionValidator.hasCreateNamespacePermission(#appId)") + @PreAuthorize(value = "@permissionValidator.hasCreateNamespacePermission(#namespace.appId)") @RequestMapping(value = "/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces", method = RequestMethod.POST) public NamespaceDTO createNamespace(@PathVariable String env, @RequestBody NamespaceDTO namespace) { @@ -40,11 +47,19 @@ public class NamespaceController { } @RequestMapping(value = "/apps/{appId}/appnamespaces", method = RequestMethod.POST) - public void createAppNamespace(@PathVariable String appId, @RequestBody AppNamespaceDTO appNamespace) { + public void createAppNamespace(@PathVariable String appId, @RequestBody AppNamespace appNamespace) { checkArgument(appNamespace.getAppId(), appNamespace.getName()); - namespaceService.createRemoteAppNamespace(appNamespace); + String operator = userInfoHolder.getUser().getUserId(); + if (StringUtils.isEmpty(appNamespace.getDataChangeCreatedBy())) { + appNamespace.setDataChangeCreatedBy(operator); + } + appNamespace.setDataChangeLastModifiedBy(operator); + AppNamespace createdAppNamespace = namespaceService.createAppNamespaceInLocal(appNamespace); + + publisher.publishEvent(new AppNamespaceCreationEvent(createdAppNamespace)); + } @RequestMapping("/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces") diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppCreationEvent.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppCreationEvent.java index 25d7868521c079d276c17f48c66d08f0ae69e0e5..407a1c18ecd602ec9ba1333183f9f182e71973e9 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppCreationEvent.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppCreationEvent.java @@ -8,11 +8,6 @@ import org.springframework.context.ApplicationEvent; public class AppCreationEvent extends ApplicationEvent { - /** - * Create a new ApplicationEvent. - * - * @param source the object on which the event initially occurred (never {@code null}) - */ public AppCreationEvent(Object source) { super(source); } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppNamespaceCreationEvent.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppNamespaceCreationEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..fd9a66c29d5d5ed34f543fccd0525e0e2fa07e7e --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/AppNamespaceCreationEvent.java @@ -0,0 +1,19 @@ +package com.ctrip.framework.apollo.portal.listener; + +import com.google.common.base.Preconditions; + +import com.ctrip.framework.apollo.common.entity.AppNamespace; + +import org.springframework.context.ApplicationEvent; + +public class AppNamespaceCreationEvent extends ApplicationEvent { + + public AppNamespaceCreationEvent(Object source) { + super(source); + } + + public AppNamespace getAppNamespace() { + Preconditions.checkState(source != null); + return (AppNamespace) this.source; + } +} diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/CreationListener.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/CreationListener.java index 11778ad1214966d4249b5dd3adbc8a7669dc7072..f67e30b79ae34eabcc5358303c2ade0323c5492a 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/CreationListener.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/listener/CreationListener.java @@ -3,6 +3,7 @@ package com.ctrip.framework.apollo.portal.listener; import com.ctrip.framework.apollo.common.utils.BeanUtils; import com.ctrip.framework.apollo.common.utils.ExceptionUtils; import com.ctrip.framework.apollo.core.dto.AppDTO; +import com.ctrip.framework.apollo.core.dto.AppNamespaceDTO; import com.ctrip.framework.apollo.core.enums.Env; import com.ctrip.framework.apollo.portal.PortalSettings; import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; @@ -25,6 +26,8 @@ public class CreationListener { private PortalSettings portalSettings; @Autowired private AdminServiceAPI.AppAPI appAPI; + @Autowired + private AdminServiceAPI.NamespaceAPI namespaceAPI; @EventListener public void onAppCreationEvent(AppCreationEvent event) { @@ -39,4 +42,17 @@ public class CreationListener { } } + @EventListener + public void onAppNamespaceCreationEvent(AppNamespaceCreationEvent event){ + AppNamespaceDTO dto = BeanUtils.transfrom(AppNamespaceDTO.class, event.getAppNamespace()); + List envs = portalSettings.getActiveEnvs(); + for (Env env : envs) { + try { + namespaceAPI.createOrUpdateAppNamespace(env, dto); + } catch (HttpStatusCodeException e) { + logger.error(ExceptionUtils.toString(e)); + } + } + } + } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/NamespaceService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/NamespaceService.java index 3339b29f0a3610f5c7ce995d29cb5f4f968da70b..c133ab813e0794bc9582618fead12fc7532da4c8 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/NamespaceService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/NamespaceService.java @@ -95,19 +95,15 @@ public class NamespaceService { return Objects.isNull(appNamespaceRepository.findByAppIdAndName(appId, namespaceName)); } - public void createRemoteAppNamespace(AppNamespaceDTO appNamespace) { - String operator = userInfoHolder.getUser().getUserId(); - if (StringUtils.isEmpty(appNamespace.getDataChangeCreatedBy())) { - appNamespace.setDataChangeCreatedBy(operator); - } - appNamespace.setDataChangeLastModifiedBy(operator); - for (Env env : portalSettings.getActiveEnvs()) { - try { - namespaceAPI.createOrUpdate(env, appNamespace); - } catch (HttpStatusCodeException e) { - logger.error(ExceptionUtils.toString(e)); - throw e; - } + @Transactional + public AppNamespace createAppNamespaceInLocal(AppNamespace appNamespace) { + AppNamespace managedAppNamespace = appNamespaceRepository.findByAppIdAndName(appNamespace.getAppId(), appNamespace.getName()); + //update + if (managedAppNamespace != null){ + BeanUtils.copyEntityProperties(appNamespace, managedAppNamespace); + return appNamespaceRepository.save(managedAppNamespace); + }else { + return appNamespaceRepository.save(appNamespace); } }