content: package com.ctrip.framework.apollo.portal.component;
  
  import com.ctrip.framework.apollo.common.entity.AppNamespace;
  import com.ctrip.framework.apollo.portal.component.config.PortalConfig;
  import com.ctrip.framework.apollo.portal.constant.PermissionType;
  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.stereotype.Component;
  
  @Component("permissionValidator")
  public class PermissionValidator {
  
    @Autowired
    private UserInfoHolder userInfoHolder;
    @Autowired
    private RolePermissionService rolePermissionService;
    @Autowired
    private PortalConfig portalConfig;
  
    public boolean hasModifyNamespacePermission(String appId, String namespaceName) {
      return rolePermissionService.userHasPermission(userInfoHolder.getUser().getUserId(),
                                                     PermissionType.MODIFY_NAMESPACE,
                                                     RoleUtils.buildNamespaceTargetId(appId, namespaceName));
    }
  
    public boolean hasReleaseNamespacePermission(String appId, String namespaceName) {
      return rolePermissionService.userHasPermission(userInfoHolder.getUser().getUserId(),
                                                     PermissionType.RELEASE_NAMESPACE,
                                                     RoleUtils.buildNamespaceTargetId(appId, namespaceName));
    }
  
    public boolean hasDeleteNamespacePermission(String appId) {
      return hasAssignRolePermission(appId) || isSuperAdmin();
    }
  
    public boolean hasOperateNamespacePermission(String appId, String namespaceName) {
      return hasModifyNamespacePermission(appId, namespaceName) || hasReleaseNamespacePermission(appId, namespaceName);
    }
  
    public boolean hasAssignRolePermission(String appId) {
      return rolePermissionService.userHasPermission(userInfoHolder.getUser().getUserId(),
                                                     PermissionType.ASSIGN_ROLE,
                                                     appId);
    }
  
    public boolean hasCreateNamespacePermission(String appId) {
  
      return rolePermissionService.userHasPermission(userInfoHolder.getUser().getUserId(),
                                                     PermissionType.CREATE_NAMESPACE,
                                                     appId);
    }
  
    public boolean hasCreateAppNamespacePermission(String appId, AppNamespace appNamespace) {
  
      boolean isPublicAppNamespace = appNamespace.isPublic();
  
      if (portalConfig.canAppAdminCreatePrivateNamespace() || isPublicAppNamespace) {
        return hasCreateNamespacePermission(appId);
      }
  
      return isSuperAdmin();
    }
  
    public boolean hasCreateClusterPermission(String appId) {
      return rolePermissionService.userHasPermission(userInfoHolder.getUser().getUserId(),
                                                     PermissionType.CREATE_CLUSTER,
                                                     appId);
    }
  
    public boolean isAppAdmin(String appId) {
      return isSuperAdmin() || hasAssignRolePermission(appId);
    }
  
    public boolean isSuperAdmin() {
      return rolePermissionService.isSuperAdmin(userInfoHolder.getUser().getUserId());
    }
  }
  