Skip to content
Snippets Groups Projects
Commit 3ea71fd2 authored by Christian Foidl's avatar Christian Foidl
Browse files

Allow override of email notification on request basis for registration

parent 297c5ca7
No related branches found
No related tags found
No related merge requests found
Pipeline #195402 failed
......@@ -13,6 +13,8 @@ use Drupal\user_api\Event\AdvancedUserRegistrationEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
/**
......@@ -35,6 +37,13 @@ use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
*/
class AdvancedUserRegistrationResource extends UserRegistrationResource {
const HEADER_DISABLE_EMAIL_NOTIFICATION = 'X-Disable-Email-Notification';
/**
* The current request.
*/
protected Request|null $currentRequest;
/**
* Constructs a new UserRegistrationResource instance.
*
......@@ -46,6 +55,8 @@ class AdvancedUserRegistrationResource extends UserRegistrationResource {
* The plugin implementation definition.
* @param array $serializer_formats
* The available serialization formats.
* @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
* The request stack.
* @param \Psr\Log\LoggerInterface $logger
* A logger instance.
* @param \Drupal\Core\Config\ImmutableConfig $user_settings
......@@ -62,6 +73,7 @@ class AdvancedUserRegistrationResource extends UserRegistrationResource {
$plugin_id,
$plugin_definition,
array $serializer_formats,
RequestStack $requestStack,
LoggerInterface $logger,
ImmutableConfig $user_settings,
AccountInterface $current_user,
......@@ -69,6 +81,8 @@ class AdvancedUserRegistrationResource extends UserRegistrationResource {
protected array $fieldsToValidate,
) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger, $user_settings, $current_user);
$this->currentRequest = $requestStack->getCurrentRequest();
}
/**
......@@ -80,6 +94,7 @@ class AdvancedUserRegistrationResource extends UserRegistrationResource {
$plugin_id,
$plugin_definition,
$container->getParameter('serializer.formats'),
$container->get('request_stack'),
$container->get('logger.factory')->get('rest'),
$container->get('config.factory')->get('user.settings'),
$container->get('current_user'),
......@@ -200,4 +215,16 @@ class AdvancedUserRegistrationResource extends UserRegistrationResource {
return array_intersect_key($errors, array_flip($this->fieldsToValidate));
}
/**
* {@inheritdoc}
*/
protected function sendEmailNotifications(UserInterface $account) {
// Skip email notifications if explicitly disabled via request.
if ($this->currentRequest->headers->get(self::HEADER_DISABLE_EMAIL_NOTIFICATION) === '1') {
return;
}
return parent::sendEmailNotifications($account);
}
}
......@@ -13,6 +13,7 @@ use Drupal\user\Entity\Role;
use Drupal\user\Entity\User;
use Drupal\user\UserInterface;
use Drupal\user_api\Event\AdvancedUserRegistrationEvent;
use Drupal\user_api\Plugin\rest\resource\AdvancedUserRegistrationResource;
use Drupal\user_api\UserApiEvents;
use Symfony\Component\HttpFoundation\Response;
......@@ -149,6 +150,50 @@ class AdvancedUserRegistrationTest extends EntityKernelTestBase {
$this->assertEquals(422, $response->getStatusCode());
}
/**
* Test register user with verify email but disabled in request.
*/
public function testRegisterUserWithVerifyEmailOverride() {
// Test with username, email and password.
$username = 'test_user_' . time();
$content = [
'name' => [
'value' => $username,
],
'mail' => [
'value' => $username . '@example.com',
],
];
$request = $this->createJsonRequest('POST', $this->url->toString(), $content, [
AdvancedUserRegistrationResource::HEADER_DISABLE_EMAIL_NOTIFICATION => '1',
]);
$response = $this->httpKernel->handle($request);
$this->assertValidRegistrationResponse($response);
$this->assertUser($username, TRUE, TRUE);
// Email is still required when verify email is disabled.
$username = 'test_user_' . time();
$content = [
'name' => [
'value' => $username,
],
'pass' => [
'value' => 'test_password',
],
];
$request = $this->createJsonRequest('POST', $this->url->toString(), $content, [
AdvancedUserRegistrationResource::HEADER_DISABLE_EMAIL_NOTIFICATION => '1',
]);
$response = $this->httpKernel->handle($request);
$this->assertEquals(422, $response->getStatusCode());
$this->assertEquals(0, count($this->getMails()));
}
/**
* Test register user without verify email.
*/
......
......@@ -23,16 +23,22 @@ trait UserApiTestTrait {
* The URI.
* @param array $content
* The content.
* @param array $headers
* Additional headers for the request.
*
* @return \Symfony\Component\HttpFoundation\Request
* The request.
*/
protected function createJsonRequest(string $method, string $uri, array $content): Request {
protected function createJsonRequest(string $method, string $uri, array $content, array $headers = []): Request {
$encodedContent = Json::encode($content);
$request = Request::create($uri, $method, [], [], [], [], $encodedContent);
$request->headers->set('Content-Type', 'application/json');
foreach ($headers as $key => $value) {
$request->headers->set($key, $value);
}
return $request;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment