Starbugstone/SnowTricks

View on GitHub
src/EventSubscriber/User/UserAccountSubscriber.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace App\EventSubscriber\User;

use App\Entity\User;
use App\Event\User\UserChangepasswordEvent;
use App\Event\User\AbstractUserEvent;
use App\Event\User\UserForgotpasswordEvent;
use App\Event\User\AbstractUserPasswordEvent;
use App\Event\User\UserRegisteredEvent;
use App\Event\User\UserResetpasswordEvent;
use App\Event\User\UserUpdateAccountEvent;
use App\FlashMessage\FlashMessageCategory;
use App\Mail\SendMail;
use App\Security\UserSetHash;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;


class UserAccountSubscriber extends AbstractUserSubscriber implements EventSubscriberInterface
{

    /**
     * @var UserPasswordEncoderInterface
     */
    private $passwordEncoder;
    /**
     * @var UserSetHash
     */
    private $setHash;
    /**
     * @var SendMail
     */
    private $mail;


    public function __construct(
        UserPasswordEncoderInterface $passwordEncoder,
        UserSetHash $setHash,
        SendMail $mail
    ) {
        $this->passwordEncoder = $passwordEncoder;
        $this->setHash = $setHash;
        $this->mail = $mail;
    }

    public function setPassword(AbstractUserPasswordEvent $event)
    {
        /** @var User $user */
        $user = $event->getEntity();
        $password = $event->getPlainPassword();
        // encode the plain password
        $user->setPassword(
            $this->passwordEncoder->encodePassword(
                $user,
                $password
            )
        );

        $this->persist($event);
    }

    public function registerHash(AbstractUserEvent $event)
    {
        /** @var User $user */
        $user = $event->getEntity();
        $this->setHash->set($user);
        $this->persist($event);
    }

    public function updateUser(AbstractUserEvent $event)
    {
        $this->persist($event);
    }

    public function sendForgotpasswordMail(AbstractUserEvent $event)
    {
        /** @var User $user */
        $user = $event->getEntity();
        $this->mail->send(
            'Forgot Password',
            'emails/forgotpassword.html.twig',
            $user,
            $user->getEmail()
        );
    }

    public function sendResetpasswordMail(AbstractUserEvent $event)
    {
        /** @var User $user */
        $user = $event->getEntity();
        $this->mail->send(
            'Reset Password',
            'emails/resetpassword.html.twig',
            $user,
            $user->getEmail()
        );
    }


    public function sendValidationMail(AbstractUserEvent $event)
    {
        /** @var User $user */
        $user = $event->getEntity();
        $mailSent = $this->mail->send(
            'Email Validation',
            'emails/hash.html.twig',
            $user,
            $user->getEmail()
        );

        if ($mailSent) {
            $this->addFlashMessage(FlashMessageCategory::SUCCESS, "A validation mail has been sent to " . $user->getEmail());
            return;
        }

        $this->addFlashMessage(FlashMessageCategory::ERROR, "Error sending email");
    }

    /**
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents()
    {
        return [
            UserRegisteredEvent::NAME => [
                ['setPassword', 50],
                ['registerHash', 40],
                ['flush', 20],
                ['sendValidationMail', 10],
            ],
            UserForgotpasswordEvent::NAME => [
                ['registerHash', 40],
                ['flush', 20],
                ['sendForgotpasswordMail', 10],
            ],
            UserResetpasswordEvent::NAME => [
                ['setPassword', 50],
                ['flush', 20],
                ['sendResetpasswordMail', 10],
            ],
            UserChangepasswordEvent::NAME => [
                ['setPassword', 50],
                ['flush', 20],
            ],
            UserUpdateAccountEvent::NAME => [
                ['updateUser', 50],
                ['flush', 20],
            ],
        ];
    }
}