group_permissions-1.0.0-alpha1/src/Access/GroupPermissionCalculator.php

src/Access/GroupPermissionCalculator.php
<?php

namespace Drupal\group_permissions\Access;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\group\Access\CalculatedGroupPermissionsItem;
use Drupal\group\Access\CalculatedGroupPermissionsItemInterface;
use Drupal\group\Access\GroupPermissionCalculatorBase;
use Drupal\group\Access\RefinableCalculatedGroupPermissions;
use Drupal\group\Entity\GroupType;
use Drupal\group\GroupMembershipLoaderInterface;
use Drupal\group_permissions\GroupPermissionsManager;

/**
 * Calculates group permissions for an account.
 */
class GroupPermissionCalculator extends GroupPermissionCalculatorBase {

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The membership loader service.
   *
   * @var \Drupal\group\GroupMembershipLoaderInterface
   */
  protected $membershipLoader;

  /**
   * The group permissions manager.
   *
   * @var \Drupal\group_permissions\GroupPermissionsManager
   */
  protected $groupPermissionsManager;

  /**
   * The user memberships cache.
   *
   * @var array
   */
  protected $memberships;

  /**
   * Constructs a DefaultGroupPermissionCalculator object.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\group\GroupMembershipLoaderInterface $membership_loader
   *   The group membership loader service.
   * @param \Drupal\group_permissions\GroupPermissionsManager $group_permissions_manager
   *   The group permissions manager.
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, GroupMembershipLoaderInterface $membership_loader, GroupPermissionsManager $group_permissions_manager) {
    $this->entityTypeManager = $entity_type_manager;
    $this->membershipLoader = $membership_loader;
    $this->groupPermissionsManager = $group_permissions_manager;
  }

  /**
   * {@inheritdoc}
   */
  public function calculateMemberPermissions(AccountInterface $account) {
    $calculated_permissions = new RefinableCalculatedGroupPermissions();
    $calculated_permissions->addCacheContexts(['user']);

    $user = $this->entityTypeManager->getStorage('user')->load($account->id());
    $calculated_permissions->addCacheableDependency($user);

    foreach ($this->getUserMembership($account) as $group_membership) {
      $group = $group_membership->getGroup();
      $calculated_permissions->addCacheableDependency($group);

      // Group permissions are disabled.
      if (empty($group->getGroupType()->getThirdPartySetting('group_permissions', 'enabled', 0))) {
        continue;
      }

      $custom_permissions = $this->groupPermissionsManager->getCustomPermissions($group);

      if (!empty($custom_permissions)) {
        $calculated_permissions->addCacheableDependency($this->groupPermissionsManager->getGroupPermission($group));
        foreach ($group_membership->getRoles() as $group_role) {
          $item = new CalculatedGroupPermissionsItem(
            CalculatedGroupPermissionsItemInterface::SCOPE_GROUP,
            $group_membership->getGroup()->id(),
            $custom_permissions[$group_role->id()] ?? []
          );

          $calculated_permissions->addItem($item);
          $calculated_permissions->addCacheableDependency($group_role);
        }
      }
    }
    return $calculated_permissions;
  }

  /**
   * Get user memberships.
   *
   * @param \Drupal\Core\Session\AccountInterface $account
   *   User.
   *
   * @return \Drupal\group\GroupMembership[]|mixed
   *   Array of group memberships.
   */
  protected function getUserMembership(AccountInterface $account) {
    $account_id = $account->id();
    if (!isset($this->memberships[$account_id])) {
      $this->memberships[$account_id] = $this->membershipLoader->loadByUser($account);
    }

    return $this->memberships[$account_id];
  }

  /**
   * {@inheritdoc}
   */
  public function calculateAnonymousPermissions() {
    $calculated_permissions = new RefinableCalculatedGroupPermissions();

    $calculated_permissions->addCacheTags(['group_list']);

    $group_permissions = $this->groupPermissionsManager->getAll();
    foreach ($group_permissions as $group_permission) {
      if (empty($group_permission)) {
        continue;
      }
      $group = $group_permission->getGroup();
      if (empty($group)) {
        continue;
      }

      $group_type = $group->getGroupType();
      // Group permissions are disabled.
      if (empty($group->getGroupType()->getThirdPartySetting('group_permissions', 'enabled', 0))) {
        continue;
      }

      $calculated_permissions->addCacheableDependency($group_permission);

      $custom_permissions = $group_permission->getPermissions();
      $group_role = $group_type->getAnonymousRole();

      $item = new CalculatedGroupPermissionsItem(
        CalculatedGroupPermissionsItemInterface::SCOPE_GROUP,
        $group->id(),
        $custom_permissions[$group_role->id()] ?? []
      );

      $calculated_permissions->addItem($item);
      $calculated_permissions->addCacheableDependency($group);
      $calculated_permissions->addCacheableDependency($group_role);
    }

    return $calculated_permissions;
  }

  /**
   * {@inheritdoc}
   */
  public function calculateOutsiderPermissions(AccountInterface $account) {

    $calculated_permissions = new RefinableCalculatedGroupPermissions();
    $calculated_permissions->addCacheTags(['group_list']);
    $calculated_permissions->addCacheContexts(['user']);

    $user = $this->entityTypeManager->getStorage('user')->load($account->id());
    $calculated_permissions->addCacheableDependency($user);

    $user_membership_groups = [];
    foreach ($this->getUserMembership($account) as $group_membership) {
      $user_membership_groups[] = $group_membership->getGroup()->id();
    }

    $group_permissions = $this->groupPermissionsManager->getAll();
    foreach ($group_permissions as $group_permission) {
      if (empty($group_permission)) {
        continue;
      }
      $group = $group_permission->getGroup();
      if (empty($group)) {
        continue;
      }

      // Group permissions are disabled.
      if (empty($group->getGroupType()->getThirdPartySetting('group_permissions', 'enabled', 0))) {
        continue;
      }

      // We skip the group where we have membership.
      if (in_array($group->id(), $user_membership_groups)) {
        continue;
      }

      $calculated_permissions->addCacheableDependency($group_permission);

      // Get all outsider roles.
      $roles = $this->groupPermissionsManager->getOutsiderRoles($group, $account);
      $calculated_permissions->addCacheableDependency($group_permission);

      $custom_permissions = $group_permission->getPermissions();

      foreach ($roles as $group_role) {
        $item = new CalculatedGroupPermissionsItem(
          CalculatedGroupPermissionsItemInterface::SCOPE_GROUP,
          $group->id(),
          $custom_permissions[$group_role->id()] ?? [],
        );

        $calculated_permissions->addItem($item);
        $calculated_permissions->addCacheableDependency($group);
        $calculated_permissions->addCacheableDependency($group_role);
      }
    }

    return $calculated_permissions;
  }

  /**
   * Gets account outsider roles.
   *
   * @param \Drupal\Core\Session\AccountInterface $account
   *   User account.
   * @param \Drupal\group\Entity\GroupType $group_type
   *   Group type.
   *
   * @return array
   *   Roles ids.
   */
  protected function getAccountOutsiderRoles(AccountInterface $account, GroupType $group_type) {
    $roles = $account->getRoles(TRUE);
    $group_role_ids = [];
    foreach ($roles as $role_id) {
      $group_role_ids[] = $this->groupRoleSynchronizer->getGroupRoleId($group_type->id(), $role_id);
    }

    return $group_role_ids;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc