content: package com.ctrip.framework.apollo.openapi.service;
  
  import com.google.common.collect.FluentIterable;
  
  import com.ctrip.framework.apollo.openapi.entity.ConsumerRole;
  import com.ctrip.framework.apollo.openapi.repository.ConsumerRoleRepository;
  import com.ctrip.framework.apollo.portal.entity.po.Permission;
  import com.ctrip.framework.apollo.portal.entity.po.RolePermission;
  import com.ctrip.framework.apollo.portal.repository.PermissionRepository;
  import com.ctrip.framework.apollo.portal.repository.RolePermissionRepository;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Service;
  import org.springframework.util.CollectionUtils;
  
  import java.util.List;
  import java.util.Set;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  @Service
  public class ConsumerRolePermissionService {
    @Autowired
    private PermissionRepository permissionRepository;
    @Autowired
    private ConsumerRoleRepository consumerRoleRepository;
    @Autowired
    private RolePermissionRepository rolePermissionRepository;
  
    /**
     * Check whether user has the permission
     */
    public boolean consumerHasPermission(long consumerId, String permissionType, String targetId) {
      Permission permission =
          permissionRepository.findTopByPermissionTypeAndTargetId(permissionType, targetId);
      if (permission == null) {
        return false;
      }
  
      List<ConsumerRole> consumerRoles = consumerRoleRepository.findByConsumerId(consumerId);
      if (CollectionUtils.isEmpty(consumerRoles)) {
        return false;
      }
  
      Set<Long> roleIds =
          FluentIterable.from(consumerRoles).transform(consumerRole -> consumerRole.getRoleId())
              .toSet();
      List<RolePermission> rolePermissions = rolePermissionRepository.findByRoleIdIn(roleIds);
      if (CollectionUtils.isEmpty(rolePermissions)) {
        return false;
      }
  
      for (RolePermission rolePermission : rolePermissions) {
        if (rolePermission.getPermissionId() == permission.getId()) {
          return true;
        }
      }
  
      return false;
    }
  }
  