diff --git a/app/config/api/raw/demo.yml b/app/config/api/raw/demo.yml index c4fddd1..7a47c94 100755 --- a/app/config/api/raw/demo.yml +++ b/app/config/api/raw/demo.yml @@ -2,6 +2,29 @@ ## Raw ######################################## Demo\Domain\Model\Administrator\Administrator: + itemOperations: + get: ~ + put: ~ + delete: ~ + post_send_administrator_activation_email: + method: 'POST' + path: '/administrators/{id}/send_activation_email' + route_name: 'post_send_administrator_activation_email' + requirements: + id: '\d+' + swagger_context: + summary: 'Sends activation email to an Administrator' + parameters: + - in: body # avoid api platform to inject default parameters + produces: + - 'application/json' + responses: + '200': + description: Verification email sent + '404': + description: Resource not found + '400': + description: Bad request attributes: access_control: '"ROLE_ADMIN" in roles' order: diff --git a/app/config/packages/security.yaml b/app/config/packages/security.yaml index a422501..34d4efc 100755 --- a/app/config/packages/security.yaml +++ b/app/config/packages/security.yaml @@ -43,6 +43,10 @@ security: pattern: ^/token/refresh stateless: true + activate_admin: + pattern: ^/activate_admin/\d+$ + security: false + api: pattern: ^/.+ stateless: true diff --git a/app/config/routes.yaml b/app/config/routes.yaml index 9bd7b0d..3a84f30 100755 --- a/app/config/routes.yaml +++ b/app/config/routes.yaml @@ -7,3 +7,21 @@ api_base_path: api_admin_login: path: admin_login + +post_send_administrator_activation_email: + path: '/administrators/{id}/send_activation_email' + methods: ['POST'] + requirements: + id: '\d+' + defaults: + _controller: App\Controller\Administrator\SendActivationEmail + _api_item_operation_name: 'send_activacion_email' + _api_receive: false + +get_activate_administrator: + path: '/activate_admin/{id}' + methods: ['GET'] + requirements: + id: '\d+' + defaults: + _controller: App\Controller\Administrator\Activate diff --git a/app/src/App/Controller/Administrator/Activate.php b/app/src/App/Controller/Administrator/Activate.php new file mode 100644 index 0000000..2a07d8c --- /dev/null +++ b/app/src/App/Controller/Administrator/Activate.php @@ -0,0 +1,24 @@ +get('id'); + + $this->activateAdministrator->execute($administratorId); + + return new Response('Administrator activated', 200); + } +} diff --git a/app/src/App/Controller/Administrator/SendActivationEmail.php b/app/src/App/Controller/Administrator/SendActivationEmail.php new file mode 100644 index 0000000..b39044c --- /dev/null +++ b/app/src/App/Controller/Administrator/SendActivationEmail.php @@ -0,0 +1,35 @@ +attributes->get('id'); + + $administrator = $this->administratorRepository->find($administratorId); + if ($administrator === null) { + throw new \DomainException("Resource not found", 404); + } + + $this->sendActivationEmail->execute($administrator); + $response->setStatusCode(200); + + return $response; + } +} diff --git a/app/src/Demo/Application/Service/Administrator/ActivateAdministrator.php b/app/src/Demo/Application/Service/Administrator/ActivateAdministrator.php new file mode 100644 index 0000000..1f0e706 --- /dev/null +++ b/app/src/Demo/Application/Service/Administrator/ActivateAdministrator.php @@ -0,0 +1,30 @@ +administratorRepository->find($administratorId); + + if ($administrator === null) { + throw new \DomainException('Administrator not found.', 404); + } + + /** @var AdministratorDto $administratorDto */ + $administratorDto = $this->entityTools->entityToDto($administrator); + $administratorDto->setActive(1); + $this->entityTools->persistDto($administratorDto, $administrator); + } +} diff --git a/app/src/Demo/Domain/Service/Administrator/AdministratorLifecycleEventHandlerInterface.php b/app/src/Demo/Domain/Service/Administrator/AdministratorLifecycleEventHandlerInterface.php new file mode 100644 index 0000000..f45210c --- /dev/null +++ b/app/src/Demo/Domain/Service/Administrator/AdministratorLifecycleEventHandlerInterface.php @@ -0,0 +1,11 @@ + $bindedBaseServices */ + public static $bindedBaseServices = [ + "on_commit" => + [ + \Demo\Domain\Service\Administrator\SendActivationEmail::class => 200, + ], + ]; + + protected function addService(string $event, LifecycleEventHandlerInterface|DomainEventSubscriberInterface $service): void + { + Assertion::isInstanceof($service, AdministratorLifecycleEventHandlerInterface::class); + $this->services[$event][] = $service; + } +} diff --git a/app/src/Demo/Domain/Service/Administrator/SendActivationEmail.php b/app/src/Demo/Domain/Service/Administrator/SendActivationEmail.php new file mode 100644 index 0000000..0ea63f3 --- /dev/null +++ b/app/src/Demo/Domain/Service/Administrator/SendActivationEmail.php @@ -0,0 +1,45 @@ + + */ + public static function getSubscribedEvents(): array + { + return [ + self::EVENT_ON_COMMIT => self::ON_COMMIT_PRIORITY + ]; + } + + /** + * @throws \DomainException + */ + public function execute(AdministratorInterface $administrator): void + { + $isNew = $administrator->isNew(); + if (!$isNew) { + return; + } + + $isActive = $administrator->getActive(); + if ($isActive) { + return; + } + + $this->sendActivationEmail->execute($administrator); + } +} diff --git a/app/src/Demo/Domain/Service/Administrator/SendActivationEmailInterface.php b/app/src/Demo/Domain/Service/Administrator/SendActivationEmailInterface.php new file mode 100644 index 0000000..578892f --- /dev/null +++ b/app/src/Demo/Domain/Service/Administrator/SendActivationEmailInterface.php @@ -0,0 +1,10 @@ +getId(); + $body = 'Hello, please activate your account following this link: ' . PHP_EOL + . 'https://10.189.4.23/demo/api/activate_admin/' . $administratorId . PHP_EOL; + + $mail = new Message(); + $mail->setBody($body, 'text/plain') + ->setSubject('Activate your new account') + ->setFromAddress('noreplay@irontec.com') + ->setFromName('Irontec demo') + ->setToAddress($administrator->getEmail()); + + try { + $this->mailer->send($mail); + } catch (\Exception $e) { + $errorMsg = 'Unable to send activation email'; + $this->logger->error($errorMsg . ':' . $e->getMessage()); + + throw new \DomainException( + $errorMsg, + $e->getCode(), + $e + ); + } + } +}