You are here

function social_group_welcome_message_group_content_insert in Open Social 8.8

Same name and namespace in other branches
  1. 8.9 modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
  2. 10.3.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
  3. 10.0.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
  4. 10.1.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()
  5. 10.2.x modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module \social_group_welcome_message_group_content_insert()

Implements hook_ENTITY_TYPE_insert().

File

modules/social_features/social_group/modules/social_group_welcome_message/social_group_welcome_message.module, line 83
Primary module hooks for social_group_welcome_message module.

Code

function social_group_welcome_message_group_content_insert(GroupContentInterface $group_content) {
  $type = $group_content
    ->getContentPlugin()
    ->getPluginId();
  $group = $group_content
    ->getGroup();

  // If new membership is created.
  if ($type === 'group_membership' && !$group
    ->get('private_message_send')
    ->isEmpty() && $group
    ->get('private_message_send')->value == 1 && !$group
    ->get('private_message_body')
    ->isEmpty()) {
    $g_type_id = $group
      ->getGroupType()
      ->id();

    // Load the account of the user who just joined.
    $account = $group_content
      ->getEntity();

    // Skip sending notifications to the owner of the group. They probably know
    // they created the group a second ago.
    if ($group
      ->getOwnerId() === $account
      ->id()) {
      return;
    }

    // Get group admins entities.
    $g_admins = $group
      ->getMembers($g_type_id . '-group_admin');
    $g_admins_users = [];

    /** @var \Drupal\group\GroupMembership $member */
    foreach ($g_admins as $key => $member) {
      $g_admins_users[$key] = $member
        ->getUser();
    }

    // Get group managers entities.
    $g_managers = $group
      ->getMembers($g_type_id . '-group_manager');
    $g_managers_users = [];

    /** @var \Drupal\group\GroupMembership $member */
    foreach ($g_managers as $key => $member) {
      $g_managers_users[$key] = $member
        ->getUser();
    }

    // Set sender (owner) of the pm.
    if (count($g_admins_users) === 1) {
      list($owner) = $g_admins_users;
    }
    elseif (count($g_managers_users) > 0) {
      list($owner) = $g_managers_users;
    }
    else {
      $owner = $group
        ->getOwner();
    }

    // Merge all managers of the group to recipients array.
    $recipients = array_merge($g_admins_users, $g_managers_users, [
      $group
        ->getOwner(),
    ]);

    // Add the joined user to the already existing recipients array.
    $recipients[] = $account;

    /** @var \Drupal\private_message\Service\PrivateMessageServiceInterface $private_message_service */
    $private_message_service = \Drupal::service('private_message.service');

    // Create a pm thread between these users.
    $thread = $private_message_service
      ->getThreadForMembers($recipients);

    // Get body of pm.
    $private_message_body = $group
      ->get('private_message_body')
      ->first()
      ->getValue();

    // Create a single message with the pm body.
    $private_message = \Drupal::entityTypeManager()
      ->getStorage('private_message')
      ->create([
      'owner' => $owner,
      'message' => $private_message_body,
    ]);
    $private_message
      ->save();
    $thread
      ->addMessage($private_message)
      ->save();

    // There is a contrib private message bug that when creating a new thread
    // and adding messages to it, for the recipient the $last_message and
    // $thread_last_check get the same timestamp. Showing no new messages badge.
    // https://www.drupal.org/project/private_message/issues/3043898
    // TODO:: Update to the correct version when issue has been solved.

    /** @var UserDataInterface $userData */
    $userData = \Drupal::service('user.data');
    $userData
      ->set('private_message', $account
      ->id(), 'private_message_thread:' . $thread
      ->id(), 0);
  }
}