You are here

protected function ActivityFilterPersonalisedHomepage::getAvailablePostIds in Open Social 10.3.x

Same name and namespace in other branches
  1. 10.1.x modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::getAvailablePostIds()
  2. 10.2.x modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::getAvailablePostIds()

Gets list of post IDs to which user has access.

Parameters

\Drupal\Core\Session\AccountInterface $user: The current user.

array $memberships: List of user memberships.

Return value

array List of post IDs.

1 call to ActivityFilterPersonalisedHomepage::getAvailablePostIds()
ActivityFilterPersonalisedHomepage::query in modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php
Filters out activity items the user is not allowed to see.

File

modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php, line 298

Class

ActivityFilterPersonalisedHomepage
Filters activity for a personalised homepage.

Namespace

Drupal\activity_viewer\Plugin\views\filter

Code

protected function getAvailablePostIds(AccountInterface $user, array $memberships) {
  $query = $this->connection
    ->select('post_field_data', 'pfd');
  $query
    ->fields('pfd', [
    'id',
  ]);
  $query
    ->leftJoin('post__field_visibility', 'pfv', 'pfv.entity_id = pfd.id');
  $query
    ->leftJoin('post__field_recipient_group', 'pfrg', 'pfrg.entity_id = pfd.id');
  $or = $query
    ->orConditionGroup();
  if ($user
    ->isAuthenticated()) {

    // Posts for authenticated users if has permission.
    if ($user
      ->hasPermission('view community posts')) {

      // Posts community visibility.
      $community_access = $or
        ->andConditionGroup()
        ->condition('pfv.field_visibility_value', [
        '0',
        '1',
        '2',
      ], 'IN')
        ->isNull('pfrg.entity_id');
      $or
        ->condition($community_access);
    }

    // Posts related to the group where the user is a member.
    if (count($memberships) > 0) {
      $access_by_group = $or
        ->andConditionGroup();
      $access_by_group
        ->condition('pfv.field_visibility_value', [
        '0',
        '1',
        '2',
        '3',
      ], 'IN');
      $access_by_group
        ->condition('pfrg.field_recipient_group_target_id', $memberships, 'IN');
      $or
        ->condition($access_by_group);
    }
  }
  else {

    // Public posts or do not have visibility settings.
    if ($user
      ->hasPermission('view public posts')) {
      $anonymous_access = $or
        ->andConditionGroup()
        ->condition('pfv.field_visibility_value', '1')
        ->isNull('pfrg.entity_id');
      $or
        ->condition($anonymous_access);
    }
  }
  $or
    ->isNull('pfv.entity_id');
  $query
    ->condition($or);

  // Alter query for custom conditions.
  $this->moduleHandler
    ->alter('activity_viewer_available_posts_query', $query, $user);

  // Check posts status and user access to it.
  $post_status = [
    '1',
  ];
  if ($user
    ->hasPermission('view unpublished post entities')) {
    $post_status[] = '0';
  }
  $query
    ->condition('pfd.status', $post_status, 'IN');
  $pids = $query
    ->execute()
    ->fetchCol();
  return array_unique($pids);
}