Loading config/schema/ginvite.schema.yml +4 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,10 @@ group_content_enabler.config.existing_user_invitation_body: type: 'text' label: 'Body' group_relation.config.autoaccept_invitees: type: 'boolean' label: 'Automatically accept invitation' group_content_enabler.config.unblock_invitees: type: 'boolean' label: 'Unblock invitees' Loading ginvite.module +41 −9 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\ginvite\Event\UserLoginWithInvitationEvent; use Drupal\ginvite\Event\UserRegisteredFromInvitationEvent; use Drupal\ginvite\Plugin\GroupContentEnabler\GroupInvitation; use Drupal\group\Access\GroupAccessResult; Loading Loading @@ -149,7 +150,7 @@ function ginvite_group_content_delete(GroupContentInterface $group_content) { if ($group_invite_config['send_cancel_email'] && $group_content->get('invitation_status')->value == GroupInvitation::INVITATION_PENDING) { $mail = $group_content->get('invitee_mail')->getString(); $mailManager = \Drupal::service('plugin.manager.mail'); $mail_manager = \Drupal::service('plugin.manager.mail'); $from = $group_content->getEntity(); if ($from instanceof UserInterface) { Loading @@ -159,7 +160,7 @@ function ginvite_group_content_delete(GroupContentInterface $group_content) { 'group_content' => $group_content, ]; $langcode = $from->getPreferredLangcode(); $mailManager->mail('ginvite', 'cancel', $mail, $langcode, $params, NULL, TRUE); $mail_manager->mail('ginvite', 'cancel', $mail, $langcode, $params, NULL, TRUE); } } } Loading Loading @@ -372,10 +373,10 @@ function ginvite_form_user_register_form_alter(&$form, FormStateInterface $form_ $replace = ['+', '/']; $invitee_mail = base64_decode(str_replace($search, $replace, $invitee_mail)); if (\Drupal::service('email.validator')->isValid($invitee_mail)) { $form["account"]["mail"]["#default_value"] = $invitee_mail; $form["account"]["mail"]["#disabled"] = TRUE; $form['account']['mail']['#default_value'] = $invitee_mail; $form['account']['mail']['#disabled'] = TRUE; } // $form['#cache']['max-age'] = 0; $form['#cache']['max-age'] = 0; } } Loading @@ -395,11 +396,14 @@ function ginvite_cron() { return; } $group_type_storage = \Drupal::entityTypeManager()->getStorage('group_type'); $entity_type_manager = \Drupal::entityTypeManager(); $content_enabler_manager = \Drupal::service('plugin.manager.group_content_enabler'); $group_type_storage = $entity_type_manager->getStorage('group_type'); $group_content_storage = $entity_type_manager->getStorage('group_content'); /** @var \Drupal\group\Entity\GroupTypeInterface $group_type */ foreach ($group_type_storage->loadMultiple() as $group_type_id => $group_type) { foreach ($group_type_storage->loadMultiple() as $group_type) { // Foreach group type get the configuration for the invites expired time. $group_plugin_collection = \Drupal::service('plugin.manager.group_content_enabler')->getInstalled($group_type); $group_plugin_collection = $content_enabler_manager->getInstalled($group_type); $days = $group_plugin_collection->getConfiguration()['group_invitation']['invitation_expire'] ?? NULL; $keep_invitations = (bool) ($group_plugin_collection->getConfiguration()['group_invitation']['invitation_expire_keep'] ?? FALSE); Loading @@ -409,7 +413,7 @@ function ginvite_cron() { } // Query for all the invites that are expired for this group type. $group_content_storage = \Drupal::entityTypeManager()->getStorage('group_content'); $config_id = $group_type->getContentPlugin('group_invitation')->getContentTypeConfigId(); $expired_invites = $group_content_storage->getQuery() ->accessCheck(FALSE) Loading Loading @@ -441,3 +445,31 @@ function ginvite_cron() { // often. \Drupal::state()->set('ginvite.last_expire_removal', $request_time); } /** * Implements hook_user_login(). */ function ginvite_user_login(UserInterface $user) { // If a user is created without e-mail (because the field is optional or // because they are created through SSO) then we can not use the mail to check // for pending invites, so we exit early. if ($user->get('mail')->isEmpty()) { return; } $properties = [ 'invitee_mail' => $user->getEmail(), 'invitation_status' => GroupInvitation::INVITATION_PENDING, 'entity_id' => $user->id(), ]; /** @var \Drupal\ginvite\GroupInvitation[] $invitations */ $invitations = \Drupal::service('ginvite.invitation_loader')->loadByProperties($properties); /** @var \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher */ $event_dispatcher = \Drupal::service('event_dispatcher'); foreach ($invitations as $invitation) { $event = new UserLoginWithInvitationEvent($invitation); $event_dispatcher->dispatch($event, UserLoginWithInvitationEvent::EVENT_NAME); } } ginvite.routing.yml +4 −2 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ ginvite.invitation.accept: _controller: '\Drupal\ginvite\Controller\InvitationOperations::accept' _title: 'Accept invitation and join group' requirements: _group_installed_content: 'group_invitation' _custom_access: '\Drupal\ginvite\Controller\InvitationOperations::checkAccess' options: parameters: Loading @@ -28,7 +29,7 @@ ginvite.invitation.bulk: _form: '\Drupal\ginvite\Form\BulkGroupInvitation' _title_callback: '\Drupal\ginvite\Controller\InvitationOperations::invitationTitle' requirements: _custom_access: '\Drupal\ginvite\Controller\InvitationOperations::access' _group_installed_content: 'group_invitation' options: parameters: group: Loading @@ -40,7 +41,8 @@ ginvite.invitation.bulk.confirm: _form: '\Drupal\ginvite\Form\BulkGroupInvitationConfirm' _title_callback: '\Drupal\ginvite\Controller\InvitationOperations::invitationTitle' requirements: _custom_access: '\Drupal\ginvite\Controller\InvitationOperations::access' _group_permission: 'invite users to group' _group_installed_content: 'group_invitation' options: parameters: group: Loading src/Controller/InvitationOperations.php +0 −24 Original line number Diff line number Diff line Loading @@ -71,30 +71,6 @@ class InvitationOperations extends ControllerBase { ); } /** * Custom access check for the invitation routes. * * @param \Drupal\Core\Session\AccountInterface $account * The user account. * @param \Drupal\group\Entity\GroupInterface $group * The group entity. * * @return \Drupal\Core\Access\AccessResultInterface */ public function access(AccountInterface $account, GroupInterface $group) { // Check if plugin is enabled for this group type. if (!$group->getGroupType()->hasContentPlugin('group_invitation')) { return AccessResult::forbidden(); } // Check if user account has permission. if ($group->hasPermission('invite users to group', $account)) { return AccessResult::allowed(); } return AccessResult::forbidden(); } /** * Create user membership and change invitation status. * Loading src/Event/InvitationBaseEvent.php 0 → 100644 +42 −0 Original line number Diff line number Diff line <?php namespace Drupal\ginvite\Event; use Drupal\ginvite\GroupInvitation; use Drupal\Component\EventDispatcher\Event; /** * Base invitation event. * * @package Drupal\ginvite\Event */ class InvitationBaseEvent extends Event { /** * The group invitation. * * @var \Drupal\ginvite\GroupInvitation */ protected $groupInvitation; /** * Constructs the object. * * @param \Drupal\ginvite\GroupInvitation $group_invitation * The group invitation. */ public function __construct(GroupInvitation $group_invitation) { $this->groupInvitation = $group_invitation; } /** * Get the group invitation. * * @return \Drupal\ginvite\GroupInvitation * The group invitation. */ public function getGroupInvitation(): GroupInvitation { return $this->groupInvitation; } } Loading
config/schema/ginvite.schema.yml +4 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,10 @@ group_content_enabler.config.existing_user_invitation_body: type: 'text' label: 'Body' group_relation.config.autoaccept_invitees: type: 'boolean' label: 'Automatically accept invitation' group_content_enabler.config.unblock_invitees: type: 'boolean' label: 'Unblock invitees' Loading
ginvite.module +41 −9 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\ginvite\Event\UserLoginWithInvitationEvent; use Drupal\ginvite\Event\UserRegisteredFromInvitationEvent; use Drupal\ginvite\Plugin\GroupContentEnabler\GroupInvitation; use Drupal\group\Access\GroupAccessResult; Loading Loading @@ -149,7 +150,7 @@ function ginvite_group_content_delete(GroupContentInterface $group_content) { if ($group_invite_config['send_cancel_email'] && $group_content->get('invitation_status')->value == GroupInvitation::INVITATION_PENDING) { $mail = $group_content->get('invitee_mail')->getString(); $mailManager = \Drupal::service('plugin.manager.mail'); $mail_manager = \Drupal::service('plugin.manager.mail'); $from = $group_content->getEntity(); if ($from instanceof UserInterface) { Loading @@ -159,7 +160,7 @@ function ginvite_group_content_delete(GroupContentInterface $group_content) { 'group_content' => $group_content, ]; $langcode = $from->getPreferredLangcode(); $mailManager->mail('ginvite', 'cancel', $mail, $langcode, $params, NULL, TRUE); $mail_manager->mail('ginvite', 'cancel', $mail, $langcode, $params, NULL, TRUE); } } } Loading Loading @@ -372,10 +373,10 @@ function ginvite_form_user_register_form_alter(&$form, FormStateInterface $form_ $replace = ['+', '/']; $invitee_mail = base64_decode(str_replace($search, $replace, $invitee_mail)); if (\Drupal::service('email.validator')->isValid($invitee_mail)) { $form["account"]["mail"]["#default_value"] = $invitee_mail; $form["account"]["mail"]["#disabled"] = TRUE; $form['account']['mail']['#default_value'] = $invitee_mail; $form['account']['mail']['#disabled'] = TRUE; } // $form['#cache']['max-age'] = 0; $form['#cache']['max-age'] = 0; } } Loading @@ -395,11 +396,14 @@ function ginvite_cron() { return; } $group_type_storage = \Drupal::entityTypeManager()->getStorage('group_type'); $entity_type_manager = \Drupal::entityTypeManager(); $content_enabler_manager = \Drupal::service('plugin.manager.group_content_enabler'); $group_type_storage = $entity_type_manager->getStorage('group_type'); $group_content_storage = $entity_type_manager->getStorage('group_content'); /** @var \Drupal\group\Entity\GroupTypeInterface $group_type */ foreach ($group_type_storage->loadMultiple() as $group_type_id => $group_type) { foreach ($group_type_storage->loadMultiple() as $group_type) { // Foreach group type get the configuration for the invites expired time. $group_plugin_collection = \Drupal::service('plugin.manager.group_content_enabler')->getInstalled($group_type); $group_plugin_collection = $content_enabler_manager->getInstalled($group_type); $days = $group_plugin_collection->getConfiguration()['group_invitation']['invitation_expire'] ?? NULL; $keep_invitations = (bool) ($group_plugin_collection->getConfiguration()['group_invitation']['invitation_expire_keep'] ?? FALSE); Loading @@ -409,7 +413,7 @@ function ginvite_cron() { } // Query for all the invites that are expired for this group type. $group_content_storage = \Drupal::entityTypeManager()->getStorage('group_content'); $config_id = $group_type->getContentPlugin('group_invitation')->getContentTypeConfigId(); $expired_invites = $group_content_storage->getQuery() ->accessCheck(FALSE) Loading Loading @@ -441,3 +445,31 @@ function ginvite_cron() { // often. \Drupal::state()->set('ginvite.last_expire_removal', $request_time); } /** * Implements hook_user_login(). */ function ginvite_user_login(UserInterface $user) { // If a user is created without e-mail (because the field is optional or // because they are created through SSO) then we can not use the mail to check // for pending invites, so we exit early. if ($user->get('mail')->isEmpty()) { return; } $properties = [ 'invitee_mail' => $user->getEmail(), 'invitation_status' => GroupInvitation::INVITATION_PENDING, 'entity_id' => $user->id(), ]; /** @var \Drupal\ginvite\GroupInvitation[] $invitations */ $invitations = \Drupal::service('ginvite.invitation_loader')->loadByProperties($properties); /** @var \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher */ $event_dispatcher = \Drupal::service('event_dispatcher'); foreach ($invitations as $invitation) { $event = new UserLoginWithInvitationEvent($invitation); $event_dispatcher->dispatch($event, UserLoginWithInvitationEvent::EVENT_NAME); } }
ginvite.routing.yml +4 −2 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ ginvite.invitation.accept: _controller: '\Drupal\ginvite\Controller\InvitationOperations::accept' _title: 'Accept invitation and join group' requirements: _group_installed_content: 'group_invitation' _custom_access: '\Drupal\ginvite\Controller\InvitationOperations::checkAccess' options: parameters: Loading @@ -28,7 +29,7 @@ ginvite.invitation.bulk: _form: '\Drupal\ginvite\Form\BulkGroupInvitation' _title_callback: '\Drupal\ginvite\Controller\InvitationOperations::invitationTitle' requirements: _custom_access: '\Drupal\ginvite\Controller\InvitationOperations::access' _group_installed_content: 'group_invitation' options: parameters: group: Loading @@ -40,7 +41,8 @@ ginvite.invitation.bulk.confirm: _form: '\Drupal\ginvite\Form\BulkGroupInvitationConfirm' _title_callback: '\Drupal\ginvite\Controller\InvitationOperations::invitationTitle' requirements: _custom_access: '\Drupal\ginvite\Controller\InvitationOperations::access' _group_permission: 'invite users to group' _group_installed_content: 'group_invitation' options: parameters: group: Loading
src/Controller/InvitationOperations.php +0 −24 Original line number Diff line number Diff line Loading @@ -71,30 +71,6 @@ class InvitationOperations extends ControllerBase { ); } /** * Custom access check for the invitation routes. * * @param \Drupal\Core\Session\AccountInterface $account * The user account. * @param \Drupal\group\Entity\GroupInterface $group * The group entity. * * @return \Drupal\Core\Access\AccessResultInterface */ public function access(AccountInterface $account, GroupInterface $group) { // Check if plugin is enabled for this group type. if (!$group->getGroupType()->hasContentPlugin('group_invitation')) { return AccessResult::forbidden(); } // Check if user account has permission. if ($group->hasPermission('invite users to group', $account)) { return AccessResult::allowed(); } return AccessResult::forbidden(); } /** * Create user membership and change invitation status. * Loading
src/Event/InvitationBaseEvent.php 0 → 100644 +42 −0 Original line number Diff line number Diff line <?php namespace Drupal\ginvite\Event; use Drupal\ginvite\GroupInvitation; use Drupal\Component\EventDispatcher\Event; /** * Base invitation event. * * @package Drupal\ginvite\Event */ class InvitationBaseEvent extends Event { /** * The group invitation. * * @var \Drupal\ginvite\GroupInvitation */ protected $groupInvitation; /** * Constructs the object. * * @param \Drupal\ginvite\GroupInvitation $group_invitation * The group invitation. */ public function __construct(GroupInvitation $group_invitation) { $this->groupInvitation = $group_invitation; } /** * Get the group invitation. * * @return \Drupal\ginvite\GroupInvitation * The group invitation. */ public function getGroupInvitation(): GroupInvitation { return $this->groupInvitation; } }