diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/AppController.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/AppController.java index f94bdc608441561348a35d2bde3129d58cf79eb1..65873d9d5cb7f4969776ae2cf23444ba72ca76f1 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/AppController.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/AppController.java @@ -11,17 +11,20 @@ import com.ctrip.framework.apollo.common.utils.InputValidator; import com.ctrip.framework.apollo.common.utils.RequestPrecondition; import com.ctrip.framework.apollo.core.enums.Env; import com.ctrip.framework.apollo.portal.component.PortalSettings; -import com.ctrip.framework.apollo.portal.entity.bo.UserInfo; +import com.ctrip.framework.apollo.portal.entity.model.AppModel; import com.ctrip.framework.apollo.portal.entity.vo.EnvClusterInfo; import com.ctrip.framework.apollo.portal.listener.AppCreationEvent; import com.ctrip.framework.apollo.portal.service.AppService; -import com.ctrip.framework.apollo.portal.spi.UserService; +import com.ctrip.framework.apollo.portal.service.RolePermissionService; +import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; +import com.ctrip.framework.apollo.portal.util.RoleUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -32,36 +35,37 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.HttpClientErrorException; import java.util.List; +import java.util.Set; @RestController @RequestMapping("/apps") public class AppController { + @Autowired + private UserInfoHolder userInfoHolder; @Autowired private AppService appService; - @Autowired private PortalSettings portalSettings; - @Autowired private ApplicationEventPublisher publisher; - @Autowired - private UserService userService; + private RolePermissionService rolePermissionService; + @RequestMapping(value = "", method = RequestMethod.GET) public List findApps(@RequestParam(value = "appIds", required = false) String appIds) { - if (StringUtils.isEmpty(appIds)){ + if (StringUtils.isEmpty(appIds)) { return appService.findAll(); - }else { + } else { return appService.findByAppIds(Sets.newHashSet(appIds.split(","))); } } @RequestMapping(value = "/by-owner", method = RequestMethod.GET) - public List findAppsByOwner(@RequestParam("owner") String owner, Pageable page){ + public List findAppsByOwner(@RequestParam("owner") String owner, Pageable page) { return appService.findByOwnerName(owner, page); } @@ -75,38 +79,46 @@ public class AppController { response.addResponseEntity(RichResponseEntity.ok(appService.createEnvNavNode(env, appId))); } catch (Exception e) { response.addResponseEntity(RichResponseEntity.error(HttpStatus.INTERNAL_SERVER_ERROR, - "load env:" + env.name() + " cluster error." + e - .getMessage())); + "load env:" + env.name() + " cluster error." + e + .getMessage())); } } return response; } - /** - * 创建App流程: 1.先在portal db中创建 2.再保存到各个环境的apollo db中 - * - * 只要第一步成功,就算这次创建app是成功操作,如果某个环境的apollo db创建失败,可通过portal db中的app信息再次创建. - */ @RequestMapping(value = "", method = RequestMethod.POST) - public ResponseEntity create(@RequestBody App app) { + public App create(@RequestBody AppModel appModel) { - RequestPrecondition.checkArgumentsNotEmpty(app.getName(), app.getAppId(), app.getOwnerName(), - app.getOrgId(), app.getOrgName()); - if (!InputValidator.isValidClusterNamespace(app.getAppId())) { + String appId = appModel.getAppId(); + String appName = appModel.getName(); + String ownerName = appModel.getOwnerName(); + String orgId = appModel.getOrgId(); + String orgName = appModel.getOrgName(); + + RequestPrecondition.checkArgumentsNotEmpty(appId, appName, ownerName, orgId, orgName); + + if (!InputValidator.isValidClusterNamespace(appModel.getAppId())) { throw new BadRequestException(String.format("AppId格式错误: %s", InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE)); } - UserInfo userInfo = userService.findByUserId(app.getOwnerName()); - if (userInfo == null) { - throw new BadRequestException("应用负责人不存在"); - } - app.setOwnerEmail(userInfo.getEmail()); - appService.enrichUserInfo(app); + App app = new App(); + app.setAppId(appId); + app.setName(appName); + app.setOwnerName(ownerName); + app.setOrgId(orgId); + app.setOrgName(orgName); + App createdApp = appService.create(app); publisher.publishEvent(new AppCreationEvent(createdApp)); - return ResponseEntity.ok().build(); + Set admins = appModel.getAdmins(); + if (!CollectionUtils.isEmpty(admins)) { + rolePermissionService + .assignRoleToUsers(RoleUtils.buildAppMasterRoleName(appId), admins, userInfoHolder.getUser().getUserId()); + } + + return createdApp; } @RequestMapping(value = "/envs/{env}", method = RequestMethod.POST, consumes = { @@ -114,7 +126,7 @@ public class AppController { public ResponseEntity create(@PathVariable String env, @RequestBody App app) { RequestPrecondition.checkArgumentsNotEmpty(app.getName(), app.getAppId(), app.getOwnerEmail(), app.getOwnerName(), - app.getOrgId(), app.getOrgName()); + app.getOrgId(), app.getOrgName()); if (!InputValidator.isValidClusterNamespace(app.getAppId())) { throw new BadRequestException(InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE); } @@ -143,11 +155,10 @@ public class AppController { response.addResponseEntity(RichResponseEntity.ok(env)); } else { response.addResponseEntity(RichResponseEntity.error(HttpStatus.INTERNAL_SERVER_ERROR, - String.format("load appId:%s from env %s error.", appId, env) - + e.getMessage())); + String.format("load appId:%s from env %s error.", appId,env) + + e.getMessage())); } } - } return response; diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/model/AppModel.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/model/AppModel.java new file mode 100644 index 0000000000000000000000000000000000000000..91c8a85ed3e9fe6525b0d617e56cbdd135be8682 --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/model/AppModel.java @@ -0,0 +1,67 @@ +package com.ctrip.framework.apollo.portal.entity.model; + + +import java.util.Set; + +public class AppModel { + + private String name; + + private String appId; + + private String orgId; + + private String orgName; + + private String ownerName; + + private Set admins; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getOrgId() { + return orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public String getOwnerName() { + return ownerName; + } + + public void setOwnerName(String ownerName) { + this.ownerName = ownerName; + } + + public Set getAdmins() { + return admins; + } + + public void setAdmins(Set admins) { + this.admins = admins; + } +} diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java index bbacd6c6d4df99478576a81ad7afea5640766c56..280ab5e471e3ae78575ae881d5251e8cb46a474e 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java @@ -10,9 +10,11 @@ import com.ctrip.framework.apollo.common.utils.ExceptionUtils; import com.ctrip.framework.apollo.core.enums.Env; import com.ctrip.framework.apollo.portal.api.AdminServiceAPI; import com.ctrip.framework.apollo.portal.constant.CatEventType; +import com.ctrip.framework.apollo.portal.entity.bo.UserInfo; import com.ctrip.framework.apollo.portal.entity.vo.EnvClusterInfo; import com.ctrip.framework.apollo.portal.repository.AppRepository; import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; +import com.ctrip.framework.apollo.portal.spi.UserService; import com.ctrip.framework.apollo.tracer.Tracer; import org.slf4j.Logger; @@ -35,17 +37,17 @@ public class AppService { @Autowired private UserInfoHolder userInfoHolder; @Autowired + private AdminServiceAPI.AppAPI appAPI; + @Autowired + private AppRepository appRepository; + @Autowired private ClusterService clusterService; @Autowired private AppNamespaceService appNamespaceService; @Autowired private RoleInitializationService roleInitializationService; - - @Autowired - private AdminServiceAPI.AppAPI appAPI; - @Autowired - private AppRepository appRepository; + private UserService userService; public List findAll() { @@ -56,11 +58,11 @@ public class AppService { return Lists.newArrayList((apps)); } - public List findByAppIds(Set appIds){ + public List findByAppIds(Set appIds) { return appRepository.findByAppIdIn(appIds); } - public List findByOwnerName(String ownerName, Pageable page){ + public List findByOwnerName(String ownerName, Pageable page) { return appRepository.findByOwnerName(ownerName, page); } @@ -100,16 +102,27 @@ public class AppService { App managedApp = appRepository.findByAppId(appId); if (managedApp != null) { - throw new BadRequestException(String.format("app id %s already exists!", app.getAppId())); - } else { - App createdApp = appRepository.save(app); - appNamespaceService.createDefaultAppNamespace(appId); - //role - roleInitializationService.initAppRoles(createdApp); - - Tracer.logEvent(CatEventType.CREATE_APP, appId); - return createdApp; + throw new BadRequestException(String.format("App already exists. AppId = %s", appId)); + } + + UserInfo owner = userService.findByUserId(app.getOwnerName()); + if (owner == null) { + throw new BadRequestException("Application's owner not exist."); } + app.setOwnerEmail(owner.getEmail()); + + String operator = userInfoHolder.getUser().getUserId(); + app.setDataChangeCreatedBy(operator); + app.setDataChangeLastModifiedBy(operator); + + App createdApp = appRepository.save(app); + + appNamespaceService.createDefaultAppNamespace(appId); + roleInitializationService.initAppRoles(createdApp); + + Tracer.logEvent(CatEventType.CREATE_APP, appId); + + return createdApp; } public EnvClusterInfo createEnvNavNode(Env env, String appId) { diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/RoleInitializationService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/RoleInitializationService.java index 6b5a5793ef02b71c856b18a6acff4c9c75a062ae..830606206e9afe07ac696201b957388dfae8070d 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/RoleInitializationService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/RoleInitializationService.java @@ -76,7 +76,7 @@ public class RoleInitializationService { Set appPermissions = FluentIterable.from(Lists.newArrayList( PermissionType.CREATE_CLUSTER, PermissionType.CREATE_NAMESPACE, PermissionType.ASSIGN_ROLE)) - .transform(permissionType -> createPermisson(appId, permissionType)).toSet(); + .transform(permissionType -> createPermission(appId, permissionType)).toSet(); Set createdAppPermissions = rolePermissionService.createPermissions(appPermissions); Set appPermissionIds = @@ -88,9 +88,9 @@ public class RoleInitializationService { rolePermissionService.createRoleWithPermissions(appMasterRole, appPermissionIds); } - private Permission createPermisson(String targetId, String permisson) { + private Permission createPermission(String targetId, String permissionType) { Permission permission = new Permission(); - permission.setPermissionType(permisson); + permission.setPermissionType(permissionType); permission.setTargetId(targetId); String userId = userInfoHolder.getUser().getUserId(); permission.setDataChangeCreatedBy(userId); @@ -101,17 +101,17 @@ public class RoleInitializationService { private Role createRole(String roleName) { Role role = new Role(); role.setRoleName(roleName); - String operaterUserId = userInfoHolder.getUser().getUserId(); - role.setDataChangeCreatedBy(operaterUserId); - role.setDataChangeLastModifiedBy(operaterUserId); + String operator = userInfoHolder.getUser().getUserId(); + role.setDataChangeCreatedBy(operator); + role.setDataChangeLastModifiedBy(operator); return role; } private void createDefaultNamespaceRole(String appId, String namespaceName, String permissionType, String roleName) { - Permission permisson = - createPermisson(RoleUtils.buildNamespaceTargetId(appId, namespaceName), permissionType); - Permission createdPermission = rolePermissionService.createPermission(permisson); + Permission permission = + createPermission(RoleUtils.buildNamespaceTargetId(appId, namespaceName), permissionType); + Permission createdPermission = rolePermissionService.createPermission(permission); Role role = createRole(roleName); rolePermissionService diff --git a/apollo-portal/src/main/resources/static/app.html b/apollo-portal/src/main/resources/static/app.html index 546c0984bf4cc462898169ac4c99fe754a6a77cd..5b69ebbddd936e116abf67152ba56c7c2fbb13d9 100644 --- a/apollo-portal/src/main/resources/static/app.html +++ b/apollo-portal/src/main/resources/static/app.html @@ -29,7 +29,7 @@
-
-
-
-