From 8de9bf6c76ba24c863159650defcb20f3fd1d6e4 Mon Sep 17 00:00:00 2001 From: Ilya Vasilenko <i.vasilenko@iqdev.digital> Date: Mon, 24 Jun 2024 13:38:39 +0500 Subject: [PATCH] new autowire --- README.md | 15 ++++ app/config/packages/security.yaml | 2 +- app/config/services.yaml | 67 +---------------- app/src/Controller/AuthController.php | 37 +++++++--- app/src/Controller/ProfileController.php | 41 ++++++---- app/src/Entity/User.php | 22 +++--- app/src/Entity/UserHistory.php | 3 + app/src/Listeners/KernelExceptionListener.php | 25 +++++++ app/src/Listeners/UserListener.php | 6 ++ .../Service/Action/ActionServiceInterface.php | 14 ++++ app/src/Service/Action/BaseActionService.php | 70 +++++++++++++++++- .../Service/Action/Classes/ChangeProfile.php | 67 ++++++++++------- .../Action/Classes/CheckRecoveryCode.php | 36 ++++----- .../Action/Classes/CheckRegisterCode.php | 65 ++++++++-------- .../Service/Action/Classes/DeleteImage.php | 48 +++++------- .../Service/Action/Classes/DeleteProfile.php | 45 ++++------- app/src/Service/Action/Classes/GetProfile.php | 54 ++++++-------- app/src/Service/Action/Classes/None.php | 9 ++- .../Action/Classes/RecoveryProfile.php | 48 ++++++------ app/src/Service/Action/Classes/Register.php | 74 +++++++++---------- app/src/Service/Action/Classes/ResetEmail.php | 55 +++++--------- .../Service/Action/Classes/ResetPassword.php | 55 ++++++++------ .../Action/Classes/ResetPasswordCode.php | 37 ++++++---- app/src/Service/Action/Classes/SaveImage.php | 73 +++++++++--------- .../Action/Classes/SendRegisterCode.php | 60 +++++++-------- .../Action/Classes/SendResetPasswordCode.php | 41 ++++++---- .../Service/Action/UserBaseActionService.php | 42 +++++++++++ app/src/Service/Dto/BaseDto.php | 3 + .../Service/Dto/Classes/ChangePasswordDto.php | 2 + .../Service/Dto/Classes/ChangeProfileDto.php | 2 + app/src/Service/Dto/Classes/ImageDto.php | 2 + app/src/Service/Dto/Classes/NoneDto.php | 2 + .../Service/Dto/Classes/RecoveryCodeDto.php | 2 + app/src/Service/Dto/Classes/RecoveryDto.php | 2 + .../Service/Dto/Classes/RegisterCodeDto.php | 2 + app/src/Service/Dto/Classes/RegisterDto.php | 2 + .../Dto/Classes/ResetPasswordCodeDto.php | 2 + .../Response/Classes/ProfileResponse.php | 2 + app/src/Service/Response/Classes/Response.php | 5 ++ .../Response/Classes/TokenResponse.php | 2 + .../Response/ResponseServiceInterface.php | 2 + .../Classes/Code/PasswordCodeSendService.php | 2 + .../Classes/Code/RecoveryCodeSendService.php | 2 + .../Classes/Code/RegisterCodeSendService.php | 2 + .../Service/Send/Classes/CodeSendService.php | 2 + app/src/Service/Send/SendService.php | 1 - 46 files changed, 659 insertions(+), 493 deletions(-) create mode 100644 app/src/Listeners/KernelExceptionListener.php create mode 100644 app/src/Service/Action/UserBaseActionService.php diff --git a/README.md b/README.md index a99a2a1..362f296 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,21 @@ ## ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ +## Kafka +<details> +<summary>ИнÑтрукциÑ</summary> + +1. Создание топика + 1. ЗапуÑтить команду - `make create-kafka-topic` +2. ЗапуÑк воркера + 1. Перейти в командную Ñтроку php - `make shell` + 2. ЗапуÑтить команду - `bin/console messenger:consume send_transport` +3. ОÑтановка воркера + 1. Перейти в командную Ñтроку php - `make shell` + 2. ЗапуÑтить команду - `bin/console messenger:stop-workers` + +</details> + ## ÐаÑтройка Xdebug (PHPStorm) <details> <summary>ИнÑтрукциÑ</summary> diff --git a/app/config/packages/security.yaml b/app/config/packages/security.yaml index 37c76cf..ffde54b 100644 --- a/app/config/packages/security.yaml +++ b/app/config/packages/security.yaml @@ -49,9 +49,9 @@ security: - { path: ^/api/register/send, roles: ROLE_USER } - { path: ^/api/register/check, roles: ROLE_USER } + - { path: ^/api/password/reset/check, roles: PUBLIC_ACCESS } - { path: ^/api/password/reset, roles: ROLE_USER } - { path: ^/api/password/send, roles: PUBLIC_ACCESS } - - { path: ^/api/password/reset/check, roles: PUBLIC_ACCESS } - { path: ^/api/profile/recovery, roles: PUBLIC_ACCESS } - { path: ^/api/profile/recovery/check, roles: PUBLIC_ACCESS } diff --git a/app/config/services.yaml b/app/config/services.yaml index 43d8e48..02884eb 100644 --- a/app/config/services.yaml +++ b/app/config/services.yaml @@ -25,67 +25,10 @@ services: - '../src/Entity/' - '../src/Kernel.php' - # СервиÑÑ‹ дейÑтвий - App\Service\Action\ActionServiceInterface $registerService: '@App\Service\Action\Classes\Register' - - App\Service\Action\ActionServiceInterface $profileService: '@App\Service\Action\Classes\GetProfile' - - App\Service\Action\ActionServiceInterface $deleteProfileService: '@App\Service\Action\Classes\DeleteProfile' - - App\Service\Action\ActionServiceInterface $recoveryProfileService: '@App\Service\Action\Classes\RecoveryProfile' - - App\Service\Action\ActionServiceInterface $checkRegisterService: '@App\Service\Action\Classes\CheckRegisterCode' - - App\Service\Action\ActionServiceInterface $checkRecoveryService: '@App\Service\Action\Classes\CheckRecoveryCode' - - App\Service\Action\ActionServiceInterface $sendRegisterService: '@App\Service\Action\Classes\SendRegisterCode' - - App\Service\Action\ActionServiceInterface $sendPasswordCodeService: '@App\Service\Action\Classes\SendResetPasswordCode' - - App\Service\Action\ActionServiceInterface $resetPasswordCodeService: '@App\Service\Action\Classes\ResetPasswordCode' - - App\Service\Action\ActionServiceInterface $resetPasswordService: '@App\Service\Action\Classes\ResetPassword' - - App\Service\Action\ActionServiceInterface $profileChangeService: '@App\Service\Action\Classes\ChangeProfile' - - App\Service\Action\ActionServiceInterface $resetEmailService: '@App\Service\Action\Classes\ResetEmail' - - App\Service\Action\ActionServiceInterface $deleteImageService: '@App\Service\Action\Classes\DeleteImage' - - App\Service\Action\ActionServiceInterface $saveImageService: '@App\Service\Action\Classes\SaveImage' - App\Service\Action\Classes\SaveImage: arguments: $targetDirectory: '%images_directory%' - App\Service\Action\ActionServiceInterface: '@App\Service\Action\Classes\None' - - - # СервиÑÑ‹ Dto - App\Service\Dto\DtoServiceInterface $registerDto: '@App\Service\Dto\Classes\RegisterDto' - - App\Service\Dto\DtoServiceInterface $registerCodeDto: '@App\Service\Dto\Classes\RegisterCodeDto' - - App\Service\Dto\DtoServiceInterface $recoveryCodeDto: '@App\Service\Dto\Classes\RecoveryCodeDto' - - App\Service\Dto\DtoServiceInterface $passwordResetDto: '@App\Service\Dto\Classes\ResetPasswordCodeDto' - - App\Service\Dto\DtoServiceInterface $passwordDto: '@App\Service\Dto\Classes\ChangePasswordDto' - - App\Service\Dto\DtoServiceInterface $profileDto: '@App\Service\Dto\Classes\ChangeProfileDto' - - App\Service\Dto\DtoServiceInterface $recoveryDto: '@App\Service\Dto\Classes\RecoveryDto' - - App\Service\Dto\DtoServiceInterface $imageDto: '@App\Service\Dto\Classes\ImageDto' - - App\Service\Dto\DtoServiceInterface: '@App\Service\Dto\Classes\NoneDto' - - - # СервиÑÑ‹ ответа - App\Service\Response\ResponseServiceInterface $profileResponse: '@App\Service\Response\Classes\ProfileResponse' - - App\Service\Response\ResponseServiceInterface: '@App\Service\Response\Classes\Response' - # Ð¡ÐµÑ€Ð²Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ App\Service\Send\SendService: @@ -93,13 +36,9 @@ services: $confirmType: '%confirm_type%' $fromEmail: '%from_email%' - App\Service\Send\SendServiceInterface $codeSendService: '@App\Service\Send\Classes\CodeSendService' - - App\Service\Send\SendServiceInterface $registerCodeSendService: '@App\Service\Send\Classes\Code\RegisterCodeSendService' - - App\Service\Send\SendServiceInterface $recoveryCodeSendService: '@App\Service\Send\Classes\Code\RecoveryCodeSendService' - - App\Service\Send\SendServiceInterface $passwordCodeSendService: '@App\Service\Send\Classes\Code\PasswordCodeSendService' + App\Listeners\KernelExceptionListener: + tags: + - { name: kernel.event_listener, event: kernel.exception } # Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ JWT авторизации acme_api.event.authentication_success_listener: diff --git a/app/src/Controller/AuthController.php b/app/src/Controller/AuthController.php index 9135e2a..cc257a8 100644 --- a/app/src/Controller/AuthController.php +++ b/app/src/Controller/AuthController.php @@ -11,6 +11,7 @@ use App\Service\Dto\Classes\ResetPasswordCodeDto; use App\Service\Response\Classes\Response; use Nelmio\ApiDocBundle\Annotation\Model; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Attribute\Route; use OpenApi\Attributes as OA; @@ -31,18 +32,20 @@ class AuthController extends AbstractController content: new OA\JsonContent(ref: new Model(type: RegisterDto::class)) )] public function register( - ActionServiceInterface $registerService + #[Autowire(service: 'action.register')] + ActionServiceInterface $actionService ): JsonResponse { - return $registerService->getResponse(); + return $actionService->getResponse(); } #[Route('/register/send', name: 'register_send', methods: ['GET'])] public function sendRegisterCode( - ActionServiceInterface $sendRegisterService, + #[Autowire(service: 'action.register.send')] + ActionServiceInterface $actionService, ): JsonResponse { - return $sendRegisterService->getResponse(); + return $actionService->getResponse(); } #[Route('/register/check', name: 'register_check', methods: ['POST'])] @@ -50,36 +53,46 @@ class AuthController extends AbstractController content: new OA\JsonContent(ref: new Model(type: RegisterCodeDto::class)) )] public function checkRegisterCode( - ActionServiceInterface $checkRegisterService + #[Autowire(service: 'action.register.code')] + ActionServiceInterface $actionService ): JsonResponse { - return $checkRegisterService->getResponse(); + return $actionService->getResponse(); } #[Route('/password/reset', name: 'password_reset', methods: ['POST'])] #[OA\RequestBody( content: new OA\JsonContent(ref: new Model(type: ChangePasswordDto::class)) )] - public function resetPassword(ActionServiceInterface $resetPasswordService): JsonResponse + public function resetPassword( + #[Autowire(service: 'action.reset.password.change')] + ActionServiceInterface $actionService + ): JsonResponse { - return $resetPasswordService->getResponse(); + return $actionService->getResponse(); } #[Route('/password/send', name: 'password_send', methods: ['POST'])] #[OA\RequestBody( content: new OA\JsonContent(ref: new Model(type: RecoveryDto::class)) )] - public function sendResetPassword(ActionServiceInterface $sendPasswordCodeService): JsonResponse + public function sendResetPassword( + #[Autowire(service: 'action.reset.password.send')] + ActionServiceInterface $actionService + ): JsonResponse { - return $sendPasswordCodeService->getResponse(); + return $actionService->getResponse(); } #[Route('/password/reset/check', name: 'password_reset_check', methods: ['POST'])] #[OA\RequestBody( content: new OA\JsonContent(ref: new Model(type: ResetPasswordCodeDto::class)) )] - public function resetCheckPassword(ActionServiceInterface $resetPasswordCodeService): JsonResponse + public function resetCheckPassword( + #[Autowire(service: 'action.reset.password.code')] + ActionServiceInterface $actionService + ): JsonResponse { - return $resetPasswordCodeService->getResponse(); + return $actionService->getResponse(); } } diff --git a/app/src/Controller/ProfileController.php b/app/src/Controller/ProfileController.php index dda47fc..2f94488 100644 --- a/app/src/Controller/ProfileController.php +++ b/app/src/Controller/ProfileController.php @@ -11,6 +11,7 @@ use App\Service\Response\Classes\ProfileResponse; use App\Service\Response\Classes\Response; use Nelmio\ApiDocBundle\Annotation\Model; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Attribute\Route; use OpenApi\Attributes as OA; @@ -28,10 +29,11 @@ class ProfileController extends AbstractController ) )] public function profile( - ActionServiceInterface $profileService + #[Autowire(service: 'action.profile')] + ActionServiceInterface $actionService ): JsonResponse { - return $profileService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/delete', name: 'profile_delete', methods: ['GET'])] @@ -43,10 +45,11 @@ class ProfileController extends AbstractController ) )] public function deleteProfile( - ActionServiceInterface $deleteProfileService, + #[Autowire(service: 'action.profile.delete')] + ActionServiceInterface $actionService, ): JsonResponse { - return $deleteProfileService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/recovery', name: 'profile_recovery', methods: ['POST'])] @@ -61,10 +64,11 @@ class ProfileController extends AbstractController ) )] public function recoveryProfile( - ActionServiceInterface $recoveryProfileService, + #[Autowire(service: 'action.recovery.send')] + ActionServiceInterface $actionService, ): JsonResponse { - return $recoveryProfileService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/recovery/check', name: 'profile_recovery_check', methods: ['POST'])] @@ -79,10 +83,11 @@ class ProfileController extends AbstractController ) )] public function recoveryCodeProfile( - ActionServiceInterface $checkRecoveryService, + #[Autowire(service: 'action.recovery.code')] + ActionServiceInterface $actionService, ): JsonResponse { - return $checkRecoveryService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/change', name: 'profile_change', methods: ['POST'])] @@ -97,10 +102,11 @@ class ProfileController extends AbstractController ) )] public function changeProfile( - ActionServiceInterface $profileChangeService, + #[Autowire(service: 'action.profile.change')] + ActionServiceInterface $actionService, ): JsonResponse { - return $profileChangeService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/reset/email', name: 'profile_reset_email', methods: ['GET'])] @@ -112,10 +118,11 @@ class ProfileController extends AbstractController ) )] public function resetLastConfirmEmail( - ActionServiceInterface $resetEmailService, + #[Autowire(service: 'action.reset.email')] + ActionServiceInterface $actionService, ): JsonResponse { - return $resetEmailService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/image', name: 'profile_image', methods: ['POST'])] @@ -130,10 +137,11 @@ class ProfileController extends AbstractController ) )] public function saveImage( - ActionServiceInterface $saveImageService, + #[Autowire(service: 'action.profile.image.save')] + ActionServiceInterface $actionService, ): JsonResponse { - return $saveImageService->getResponse(); + return $actionService->getResponse(); } #[Route('/profile/image/delete', name: 'profile_image_delete', methods: ['GET'])] @@ -145,9 +153,10 @@ class ProfileController extends AbstractController ) )] public function deleteImage( - ActionServiceInterface $deleteImageService, + #[Autowire(service: 'action.profile.image.delete')] + ActionServiceInterface $actionService, ): JsonResponse { - return $deleteImageService->getResponse(); + return $actionService->getResponse(); } } diff --git a/app/src/Entity/User.php b/app/src/Entity/User.php index 2082aa3..348b043 100644 --- a/app/src/Entity/User.php +++ b/app/src/Entity/User.php @@ -87,7 +87,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this->id; } - #[Groups(['all', 'profile', 'edit', 'card', 'detail'])] + #[Groups(['all', 'profile', 'edit', 'card', 'detail', 'listen'])] public function getEmail(): ?string { return $this->email; @@ -146,7 +146,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface /** * @see PasswordAuthenticatedUserInterface */ - #[Groups(['all'])] + #[Groups(['all', 'listen'])] public function getPassword(): string { return $this->password; @@ -168,7 +168,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface // $this->plainPassword = null; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function getName(): ?string { return $this->name; @@ -181,7 +181,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function getSurname(): ?string { return $this->surname; @@ -194,7 +194,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function getPatronymic(): ?string { return $this->patronymic; @@ -207,7 +207,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function getPhoneNumber(): ?string { return $this->phone_number; @@ -220,7 +220,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function getImage(): ?UserImage { return $this->image; @@ -243,7 +243,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function isConfirm(): ?bool { return $this->confirm; @@ -256,7 +256,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - #[Groups(['all', 'profile', 'edit'])] + #[Groups(['all', 'profile', 'edit', 'listen'])] public function isDeleted(): ?bool { return $this->deleted; @@ -353,7 +353,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface * @return self */ #[Ignore()] - public static function createByArray(array $data, array $groups = ['edit']): ?self + public static function createByArray(array $data, array $groups = ['listen']): ?self { try { $normalizer = new ObjectNormalizer( @@ -380,7 +380,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface } #[Ignore()] - public function newCopy(array $groups = ['edit']): ?self + public function newCopy(array $groups = ['listen']): ?self { $normalizer = new ObjectNormalizer( new ClassMetadataFactory(new AttributeLoader()), diff --git a/app/src/Entity/UserHistory.php b/app/src/Entity/UserHistory.php index 887b4b9..3cf93de 100644 --- a/app/src/Entity/UserHistory.php +++ b/app/src/Entity/UserHistory.php @@ -129,6 +129,9 @@ class UserHistory $type = $this->getType(); switch ($field = $this->getField()) { + case 'password': + $text = 'Пароль изменен'; + break; case 'image': switch ($type) { case self::TYPE_CREATE: diff --git a/app/src/Listeners/KernelExceptionListener.php b/app/src/Listeners/KernelExceptionListener.php new file mode 100644 index 0000000..a9ef3cc --- /dev/null +++ b/app/src/Listeners/KernelExceptionListener.php @@ -0,0 +1,25 @@ +<?php + +namespace App\Listeners; + +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +class KernelExceptionListener +{ + public static function getSubscribedEvents() + { + return [ + KernelEvents::EXCEPTION => 'onKernelException', + ]; + } + + public function onKernelException(ExceptionEvent $event) + { + $response = new \App\Service\Response\Classes\Response(); + $response->setStatusCode(Response::HTTP_FORBIDDEN); + $response->addError($event->getThrowable()->getMessage()); + $event->setResponse($response->getResponse()); + } +} \ No newline at end of file diff --git a/app/src/Listeners/UserListener.php b/app/src/Listeners/UserListener.php index 7af6d63..9c2ae42 100644 --- a/app/src/Listeners/UserListener.php +++ b/app/src/Listeners/UserListener.php @@ -107,6 +107,12 @@ class UserListener $newUserHistory->setField('confirm'); $user->addUserHistory($newUserHistory); } + if ($userExists->getPassword() !== $user->getPassword()) { + $newUserHistory = new UserHistory(); + $newUserHistory->setType(UserHistory::TYPE_UPDATE); + $newUserHistory->setField('password'); + $user->addUserHistory($newUserHistory); + } } } else { $newUserHistory = new UserHistory(); diff --git a/app/src/Service/Action/ActionServiceInterface.php b/app/src/Service/Action/ActionServiceInterface.php index 0f16176..f3e7391 100644 --- a/app/src/Service/Action/ActionServiceInterface.php +++ b/app/src/Service/Action/ActionServiceInterface.php @@ -2,6 +2,10 @@ namespace App\Service\Action; +use App\Service\Dto\DtoServiceInterface; +use App\Service\Response\ResponseServiceInterface; +use App\Service\Send\SendServiceInterface; +use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\HttpFoundation\JsonResponse; interface ActionServiceInterface @@ -11,4 +15,14 @@ interface ActionServiceInterface public function runAction(): void; public function validate(): bool; + + public function customValidate(): bool; + + public function initResponse(ResponseServiceInterface $responseService): void; + + public function initDto(DtoServiceInterface $dtoService): void; + + public function initDoctrine(ManagerRegistry $doctrine): void; + + public function initSend(SendServiceInterface $sendService): void; } \ No newline at end of file diff --git a/app/src/Service/Action/BaseActionService.php b/app/src/Service/Action/BaseActionService.php index 97235c5..df831f0 100644 --- a/app/src/Service/Action/BaseActionService.php +++ b/app/src/Service/Action/BaseActionService.php @@ -2,21 +2,54 @@ namespace App\Service\Action; +use App\Service\Dto\DtoServiceInterface; use App\Service\Response\Classes\Response; use App\Service\Response\ResponseServiceInterface; +use App\Service\Send\SendServiceInterface; +use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Contracts\Service\Attribute\Required; abstract class BaseActionService implements ActionServiceInterface { protected ?ResponseServiceInterface $responseService; - public function __construct( - ResponseServiceInterface $baseResponseService, - ) + protected ?DtoServiceInterface $dtoService; + + protected ?ManagerRegistry $doctrine; + + protected ?SendServiceInterface $sendService; + + #[Required] + public function initResponse( + ResponseServiceInterface $responseService + ): void + { + $this->responseService = $responseService; + } + + #[Required] + public function initDto( + DtoServiceInterface $dtoService + ): void { - $this->responseService = $baseResponseService; + $this->dtoService = $dtoService; } + #[Required] + public function initDoctrine(ManagerRegistry $doctrine): void + { + $this->doctrine = $doctrine; + } + + #[Required] + public function initSend(SendServiceInterface $sendService): void + { + $this->sendService = $sendService; + } + + abstract public function needDto(): bool; + public function getResponse(): JsonResponse { if ($this->validate()) { @@ -31,4 +64,33 @@ abstract class BaseActionService implements ActionServiceInterface $response->addError('Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð°'); return $response->getResponse(); } + + protected function getDto(): ?DtoServiceInterface + { + if ($this->dtoService) { + return $this->dtoService->getClass(); + } + + return null; + } + + public function validate(): bool + { + $valid = true; + + if ($this->needDto() && $this->dtoService) { + $valid = $this->dtoService->validate($this->responseService); + } + + if ($valid) { + $valid = $this->customValidate(); + } + + return $valid; + } + + public function customValidate(): bool + { + return true; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/ChangeProfile.php b/app/src/Service/Action/Classes/ChangeProfile.php index 62d1ef0..9c155d8 100644 --- a/app/src/Service/Action/Classes/ChangeProfile.php +++ b/app/src/Service/Action/Classes/ChangeProfile.php @@ -3,32 +3,37 @@ namespace App\Service\Action\Classes; use App\Entity\User; -use App\Service\Action\BaseActionService; +use App\Service\Action\UserBaseActionService; use App\Service\Dto\Classes\ChangeProfileDto; use App\Service\Dto\DtoServiceInterface; use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; -class ChangeProfile extends BaseActionService +#[AsAlias(id: 'action.profile.change', public: true)] +class ChangeProfile extends UserBaseActionService { - private ?User $user; - - public function __construct( - private ResponseServiceInterface $profileResponse, - private DtoServiceInterface $profileDto, - private ManagerRegistry $doctrine, - Security $security - ) + #[Required] public function initResponse( + #[Autowire(service: 'response.profile')] + ResponseServiceInterface $responseService + ): void { - $this->user = $security->getUser(); - parent::__construct($profileResponse); + parent::initResponse($responseService); + } + + #[Required] public function initDto( + #[Autowire(service: 'dto.profile.change')] + DtoServiceInterface $dtoService + ): void + { + parent::initDto($dtoService); } public function runAction(): void { /** @var ChangeProfileDto $dto */ - $dto = $this->profileDto->getClass(); + $dto = $this->getDto(); /** @var ?User $userExists */ $userExists = $this->doctrine->getRepository(User::class) @@ -36,11 +41,11 @@ class ChangeProfile extends BaseActionService if ($userExists !== null) { if ($userExists->getEmail() === $dto->email) { - $this->profileResponse->addError('Email занÑÑ‚ другим пользователем'); + $this->responseService->addError('Email занÑÑ‚ другим пользователем'); } elseif ($userExists->getPhoneNumber() === $dto->phoneNumber) { - $this->profileResponse->addError('Ðомер телефона занÑÑ‚ другим пользователем'); + $this->responseService->addError('Ðомер телефона занÑÑ‚ другим пользователем'); } else { - $this->profileResponse->addError('Email или номер телефона занÑÑ‚ другим пользователем'); + $this->responseService->addError('Email или номер телефона занÑÑ‚ другим пользователем'); } } else { $changed = false; @@ -65,7 +70,7 @@ class ChangeProfile extends BaseActionService $changed = true; } - if ($dto->email !== null && $dto->email !== $this->user->getEmail()) { + if ($dto->email !== null && $dto->email !== $this->user->getEmail()) { $this->user->setEmail($dto->email); $changed = true; } @@ -75,22 +80,28 @@ class ChangeProfile extends BaseActionService $em = $this->doctrine->getManager(); $em->persist($this->user); $em->flush(); - $this->profileResponse->setData($this->user); + $this->responseService->setData($this->user); } catch (\Exception $e) { - $this->profileResponse->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ'); + $this->responseService->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ'); } } else { - $this->profileResponse->setData($this->user); + $this->responseService->setData($this->user); } } } - public function validate(): bool + public function checkDelete(): bool { - if ($this->user === null) { - $this->profileResponse->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - return $this->profileDto->validate($this->profileResponse); + return true; + } + + public function checkConfirm(): bool + { + return false; + } + + public function needDto(): bool + { + return true; } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/CheckRecoveryCode.php b/app/src/Service/Action/Classes/CheckRecoveryCode.php index 4a1d3a0..afdfff9 100644 --- a/app/src/Service/Action/Classes/CheckRecoveryCode.php +++ b/app/src/Service/Action/Classes/CheckRecoveryCode.php @@ -6,20 +6,22 @@ use App\Entity\User; use App\Service\Action\BaseActionService; use App\Service\Dto\Classes\RecoveryCodeDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; +#[AsAlias(id: 'action.recovery.code', public: true)] class CheckRecoveryCode extends BaseActionService { - public function __construct( - private DtoServiceInterface $recoveryCodeDto, - private ResponseServiceInterface $response, - private ManagerRegistry $doctrine, - ) + #[Required] public function initDto( + #[Autowire(service: 'dto.recovery.code')] + DtoServiceInterface $dtoService + ): void { - parent::__construct($response); + parent::initDto($dtoService); } + /** * ВоÑÑтановление учетной запиÑи по коду * @@ -28,7 +30,7 @@ class CheckRecoveryCode extends BaseActionService public function runAction(): void { /** @var RecoveryCodeDto $dto */ - $dto = $this->recoveryCodeDto->getClass(); + $dto = $this->getDto(); /** @var User $userExists */ $userExists = $this->doctrine->getRepository(User::class) ->findOneByUniq($dto->email, $dto->phoneNumber); @@ -38,7 +40,7 @@ class CheckRecoveryCode extends BaseActionService $code = $dto->code; $registerCode = $userExists->getRegisterCode(); if ($registerCode === null) { - $this->response->addError('Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ отправлен'); + $this->responseService->addError('Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ отправлен'); } else { if ($registerCodeDate = $registerCode->getDate()) { if ($registerCode->getCode() === $code && $currentDate->getTimestamp() < $registerCodeDate->getTimestamp()) { @@ -48,24 +50,24 @@ class CheckRecoveryCode extends BaseActionService $em->persist($userExists); $em->remove($registerCode); $em->flush(); - $this->response->addMessage('Профиль воÑÑтановлен'); + $this->responseService->addMessage('Профиль воÑÑтановлен'); } catch (\Exception $exception) { - $this->response->addError('Ошибка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ'); + $this->responseService->addError('Ошибка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ'); } } else { - $this->response->addError('Код недейÑтвителен'); + $this->responseService->addError('Код недейÑтвителен'); } } else { - $this->response->addError('Код недейÑтвителен'); + $this->responseService->addError('Код недейÑтвителен'); } } } else { - $this->response->addError('Пользователь не найден'); + $this->responseService->addError('Пользователь не найден'); } } - public function validate(): bool + public function needDto(): bool { - return $this->recoveryCodeDto->validate($this->response); + return true; } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/CheckRegisterCode.php b/app/src/Service/Action/Classes/CheckRegisterCode.php index 6411a73..3a26d7f 100644 --- a/app/src/Service/Action/Classes/CheckRegisterCode.php +++ b/app/src/Service/Action/Classes/CheckRegisterCode.php @@ -2,35 +2,24 @@ namespace App\Service\Action\Classes; -use App\Entity\User; -use App\Service\Action\BaseActionService; -use App\Service\Dto\Classes\RegisterCodeDto; +use App\Service\Action\UserBaseActionService; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; -class CheckRegisterCode extends BaseActionService +#[AsAlias(id: 'action.register.code', public: true)] +class CheckRegisterCode extends UserBaseActionService { - private ?User $user; - - /** - * @param RegisterCodeDto $registerCodeDto - * @param ResponseServiceInterface $response - * @param ManagerRegistry $doctrine - * @param Security $security - */ - public function __construct( - private DtoServiceInterface $registerCodeDto, - private ResponseServiceInterface $response, - private ManagerRegistry $doctrine, - Security $security, - ) + #[Required] public function initDto( + #[Autowire(service: 'dto.register.code')] + DtoServiceInterface $dtoService + ): void { - $this->user = $security->getUser(); - parent::__construct($response); + parent::initDto($dtoService); } + /** * Подтверждение региÑтрации по коду * @@ -39,10 +28,10 @@ class CheckRegisterCode extends BaseActionService public function runAction(): void { $currentDate = new \DateTime(); - $code = $this->registerCodeDto->getClass()->code; + $code = $this->getDto()->code; $registerCode = $this->user->getRegisterCode(); if ($registerCode === null) { - $this->response->addError('Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ отправлен'); + $this->responseService->addError('Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ отправлен'); } else { if ($registerCodeDate = $registerCode->getDate()) { if ($registerCode->getCode() === $code && $currentDate->getTimestamp() < $registerCodeDate->getTimestamp()) { @@ -52,25 +41,31 @@ class CheckRegisterCode extends BaseActionService $em->persist($this->user); $em->remove($registerCode); $em->flush(); - $this->response->addMessage('РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð°'); + $this->responseService->addMessage('РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð°'); } catch (\Exception $exception) { - $this->response->addError('Ошибка Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтрации'); + $this->responseService->addError('Ошибка Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтрации'); } } else { - $this->response->addError('Код недейÑтвителен'); + $this->responseService->addError('Код недейÑтвителен'); } } else { - $this->response->addError('Код недейÑтвителен'); + $this->responseService->addError('Код недейÑтвителен'); } } } - public function validate(): bool + public function needDto(): bool { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - return $this->registerCodeDto->validate($this->response); + return true; + } + + public function checkDelete(): bool + { + return true; + } + + public function checkConfirm(): bool + { + return false; } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/DeleteImage.php b/app/src/Service/Action/Classes/DeleteImage.php index 6431f4f..ff32f3d 100644 --- a/app/src/Service/Action/Classes/DeleteImage.php +++ b/app/src/Service/Action/Classes/DeleteImage.php @@ -2,27 +2,13 @@ namespace App\Service\Action\Classes; -use App\Entity\User; use App\Entity\UserHistory; -use App\Service\Action\BaseActionService; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use App\Service\Action\UserBaseActionService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; -class DeleteImage extends BaseActionService +#[AsAlias(id: 'action.profile.image.delete', public: true)] +class DeleteImage extends UserBaseActionService { - private ?User $user; - - public function __construct( - private ResponseServiceInterface $response, - private ManagerRegistry $doctrine, - Security $security - ) - { - $this->user = $security->getUser(); - parent::__construct($response); - } - public function runAction(): void { $image = $this->user->getImage(); @@ -37,25 +23,27 @@ class DeleteImage extends BaseActionService $this->user->addUserHistory($newUserHistory); $em->remove($image); $em->flush(); - $this->response->addMessage('Изображение удалено'); + $this->responseService->addMessage('Изображение удалено'); } catch (\Exception $exception) { - $this->response->addError('Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ'); + $this->responseService->addError('Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ'); } } else { - $this->response->addError('Ðет изображениÑ'); + $this->responseService->addError('Ðет изображениÑ'); } } - public function validate(): bool + public function needDto(): bool + { + return false; + } + + public function checkDelete(): bool { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - if ($this->user->isDeleted()) { - $this->response->addError('Профиль удален'); - return false; - } return true; } + + public function checkConfirm(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/DeleteProfile.php b/app/src/Service/Action/Classes/DeleteProfile.php index 9408091..d50a894 100644 --- a/app/src/Service/Action/Classes/DeleteProfile.php +++ b/app/src/Service/Action/Classes/DeleteProfile.php @@ -2,26 +2,12 @@ namespace App\Service\Action\Classes; -use App\Entity\User; -use App\Service\Action\BaseActionService; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use App\Service\Action\UserBaseActionService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; -class DeleteProfile extends BaseActionService +#[AsAlias(id: 'action.profile.delete', public: true)] +class DeleteProfile extends UserBaseActionService { - private ?User $user; - - public function __construct( - private ResponseServiceInterface $response, - Security $security, - private ManagerRegistry $doctrine, - ) - { - $this->user = $security->getUser(); - parent::__construct($response); - } - /** * Ð”ÐµÐ°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи * @@ -34,23 +20,24 @@ class DeleteProfile extends BaseActionService $em = $this->doctrine->getManager(); $em->persist($this->user); $em->flush(); - $this->response->addMessage('Профиль удален'); + $this->responseService->addMessage('Профиль удален'); } catch (\Exception $exception) { - $this->response->addError('Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ'); + $this->responseService->addError('Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ'); } } - public function validate(): bool + public function needDto(): bool { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } + return false; + } - if ($this->user->isDeleted()) { - $this->response->addError('Профиль уже удален'); - return false; - } + public function checkDelete(): bool + { return true; } + + public function checkConfirm(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/GetProfile.php b/app/src/Service/Action/Classes/GetProfile.php index 8a98a3a..73a47bf 100644 --- a/app/src/Service/Action/Classes/GetProfile.php +++ b/app/src/Service/Action/Classes/GetProfile.php @@ -2,32 +2,24 @@ namespace App\Service\Action\Classes; -use App\Entity\User; -use App\Service\Action\BaseActionService; -use App\Service\Response\Classes\ProfileResponse; +use App\Service\Action\UserBaseActionService; use App\Service\Response\ResponseServiceInterface; -use Symfony\Bundle\SecurityBundle\Security; -use Symfony\Component\Security\Http\Attribute\CurrentUser; -use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; -class GetProfile extends BaseActionService +#[AsAlias(id: 'action.profile', public: true)] +class GetProfile extends UserBaseActionService { - private ?User $user; - - /** - * @param ProfileResponse $profileResponse - * @param Security $security - */ - public function __construct( - private ResponseServiceInterface $profileResponse, - Security $security - ) + #[Required] + public function initResponse( + #[Autowire(service: 'response.profile')] + ResponseServiceInterface $responseService + ): void { - $this->user = $security->getUser(); - parent::__construct($profileResponse); + parent::initResponse($responseService); } - /** * Получение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ * @@ -37,19 +29,21 @@ class GetProfile extends BaseActionService */ public function runAction(): void { - $this->profileResponse->setData($this->user); + $this->responseService->setData($this->user); } - public function validate(): bool + public function checkDelete(): bool { - if ($this->user === null) { - $this->profileResponse->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - if ($this->user->isDeleted()) { - $this->profileResponse->addError('Профиль удален'); - return false; - } return true; } + + public function checkConfirm(): bool + { + return false; + } + + public function needDto(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/None.php b/app/src/Service/Action/Classes/None.php index f891845..4dea602 100644 --- a/app/src/Service/Action/Classes/None.php +++ b/app/src/Service/Action/Classes/None.php @@ -3,7 +3,9 @@ namespace App\Service\Action\Classes; use App\Service\Action\BaseActionService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +#[AsAlias] class None extends BaseActionService { @@ -12,11 +14,16 @@ class None extends BaseActionService } - public function validate(): bool + public function customValidate(): bool { if ($this->responseService) { $this->responseService->addError('ДейÑтвие не выбрано'); } return false; } + + public function needDto(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/RecoveryProfile.php b/app/src/Service/Action/Classes/RecoveryProfile.php index d6e7e68..7cad306 100644 --- a/app/src/Service/Action/Classes/RecoveryProfile.php +++ b/app/src/Service/Action/Classes/RecoveryProfile.php @@ -6,27 +6,31 @@ use App\Entity\User; use App\Service\Action\BaseActionService; use App\Service\Dto\Classes\RecoveryDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; use App\Service\Send\SendServiceInterface; -use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; +#[AsAlias(id: 'action.recovery.send', public: true)] class RecoveryProfile extends BaseActionService { - /** - * @param DtoServiceInterface $recoveryDto - * @param ResponseServiceInterface $response - * @param ManagerRegistry $doctrine - */ - public function __construct( - private DtoServiceInterface $recoveryDto, - private ResponseServiceInterface $response, - private ManagerRegistry $doctrine, - private SendServiceInterface $recoveryCodeSendService - ) + #[Required] public function initDto( + #[Autowire(service: 'dto.recovery.send')] + DtoServiceInterface $dtoService + ): void + { + parent::initDto($dtoService); + } + + #[Required] public function initSend( + #[Autowire(service: 'send.code.recovery')] + SendServiceInterface $sendService + ): void { - parent::__construct($response); + parent::initSend($sendService); } + /** * Отправка кода воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи * @@ -35,26 +39,26 @@ class RecoveryProfile extends BaseActionService public function runAction(): void { /** @var RecoveryDto $dto */ - $dto = $this->recoveryDto->getClass(); + $dto = $this->getDto(); /** @var User $userExists */ $userExists = $this->doctrine->getRepository(User::class) ->findOneByUniq($dto->email, $dto->phoneNumber); if ($userExists !== null) { if (!$userExists->isDeleted()) { - $this->response->addError('Профиль не удален'); + $this->responseService->addError('Профиль не удален'); } else { - $this->recoveryCodeSendService->setUser($userExists); - $this->recoveryCodeSendService->setResponse($this->response); - $this->recoveryCodeSendService->send(); + $this->sendService->setUser($userExists); + $this->sendService->setResponse($this->responseService); + $this->sendService->send(); } } else { - $this->response->addError('Пользователь не найден'); + $this->responseService->addError('Пользователь не найден'); } } - public function validate(): bool + public function needDto(): bool { - return $this->recoveryDto->validate($this->response); + return true; } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/Register.php b/app/src/Service/Action/Classes/Register.php index 1229109..42117d6 100644 --- a/app/src/Service/Action/Classes/Register.php +++ b/app/src/Service/Action/Classes/Register.php @@ -4,37 +4,43 @@ namespace App\Service\Action\Classes; use App\Entity\User; use App\Service\Action\BaseActionService; -use App\Service\Dto\Classes\RegisterDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; -use App\Service\Send\Classes\Code\RegisterCodeSendService; -use App\Service\Send\Classes\CodeSendService; -use App\Service\Send\SendService; use App\Service\Send\SendServiceInterface; -use Doctrine\Persistence\ManagerRegistry; use ReflectionClass; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; +use Symfony\Contracts\Service\Attribute\Required; +#[AsAlias(id: 'action.register', public: true)] class Register extends BaseActionService { /** - * @param RegisterDto $registerDto - * @param ResponseServiceInterface $response * @param UserPasswordHasherInterface $passwordHasher - * @param ManagerRegistry $doctrine - * @param RegisterCodeSendService $registerCodeSendService */ public function __construct( - private DtoServiceInterface $registerDto, - private ResponseServiceInterface $response, private UserPasswordHasherInterface $passwordHasher, - private ManagerRegistry $doctrine, - private SendServiceInterface $registerCodeSendService, ) { - parent::__construct($response); } + #[Required] public function initDto( + #[Autowire(service: 'dto.register')] + DtoServiceInterface $dtoService + ): void + { + parent::initDto($dtoService); + } + + #[Required] public function initSend( + #[Autowire(service: 'send.code.register')] + SendServiceInterface $sendService + ): void + { + parent::initSend($sendService); + } + + /** * РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ * @@ -42,20 +48,21 @@ class Register extends BaseActionService */ public function runAction(): void { + $dto = $this->getDto(); $user = $this->createUser(); - if ($user !== null) { + if ($user !== null && $dto) { $userExists = $this->doctrine->getRepository(User::class) ->findOneByUniq($user->getEmail(), $user->getPhoneNumber()); if ($userExists) { - $this->response->addError('Пользователь уже ÑущеÑтвует'); + $this->responseService->addError('Пользователь уже ÑущеÑтвует'); } else { try { $user->setDeleted(false); $user->setConfirm(false); $hashedPassword = $this->passwordHasher->hashPassword( $user, - $this->registerDto->getClass()->password ?: '' + $dto->password ?: '' ); $user->setPassword($hashedPassword); @@ -63,30 +70,18 @@ class Register extends BaseActionService $em->persist($user); $em->flush(); - $this->response->addMessage('Пользователь зарегиÑтрирован'); + $this->responseService->addMessage('Пользователь зарегиÑтрирован'); - $this->registerCodeSendService->setUser($user); - $this->registerCodeSendService->setResponse($this->response); - $this->registerCodeSendService->send(); + $this->sendService->setUser($user); + $this->sendService->setResponse($this->responseService); + $this->sendService->send(); } catch (\Exception $exception) { - dd($exception); - $this->response->addError('Ошибка региÑтрации пользователÑ'); + $this->responseService->addError('Ошибка региÑтрации пользователÑ'); } - } } } - /** - * Ð’Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ñ - * - * @return bool - */ - public function validate(): bool - { - return $this->registerDto->validate($this->response); - } - /** * Создание Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· Dto * @@ -96,7 +91,7 @@ class Register extends BaseActionService { $user = null; - $data = $this->registerDto->toArray(); + $data = $this->dtoService->toArray(); if ($data) { $user = new User(); @@ -112,9 +107,14 @@ class Register extends BaseActionService } } } else { - $this->response->addError('Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…'); + $this->responseService->addError('Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…'); } return $user; } + + public function needDto(): bool + { + return true; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/ResetEmail.php b/app/src/Service/Action/Classes/ResetEmail.php index 07f2709..cd5e06c 100644 --- a/app/src/Service/Action/Classes/ResetEmail.php +++ b/app/src/Service/Action/Classes/ResetEmail.php @@ -2,62 +2,45 @@ namespace App\Service\Action\Classes; -use App\Entity\User; -use App\Service\Action\BaseActionService; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use App\Service\Action\UserBaseActionService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; -class ResetEmail extends BaseActionService +#[AsAlias(id: 'action.reset.email', public: true)] +class ResetEmail extends UserBaseActionService { - private ?User $user; - - /** - * @param ResponseServiceInterface $response - * @param ManagerRegistry $doctrine - * @param Security $security - */ - public function __construct( - private ResponseServiceInterface $response, - private ManagerRegistry $doctrine, - Security $security - ) - { - $this->user = $security->getUser(); - parent::__construct($response); - } - public function runAction(): void { if ($email = $this->user->getLastConfirmEmail()) { if ($email === $this->user->getEmail()) { - $this->response->addMessage('Подтвержденный email уже уÑтановлен'); + $this->responseService->addMessage('Подтвержденный email уже уÑтановлен'); } else { try { $this->user->setEmail($email); $em = $this->doctrine->getManager(); $em->persist($this->user); $em->flush(); - $this->response->addMessage('УÑтановлен email: ' . $email); + $this->responseService->addMessage('УÑтановлен email: ' . $email); } catch (\Exception $e) { - $this->response->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ email'); + $this->responseService->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ email'); } } } else { - $this->response->addError('Ðет поÑледнего подтвержденного email'); + $this->responseService->addError('Ðет поÑледнего подтвержденного email'); } } - public function validate(): bool + public function needDto(): bool + { + return false; + } + + public function checkDelete(): bool { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - if ($this->user->isDeleted()) { - $this->response->addError('Профиль удален'); - return false; - } return true; } + + public function checkConfirm(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/ResetPassword.php b/app/src/Service/Action/Classes/ResetPassword.php index ec611ab..21d0e7b 100644 --- a/app/src/Service/Action/Classes/ResetPassword.php +++ b/app/src/Service/Action/Classes/ResetPassword.php @@ -2,35 +2,36 @@ namespace App\Service\Action\Classes; -use App\Entity\User; -use App\Service\Action\BaseActionService; +use App\Service\Action\UserBaseActionService; use App\Service\Dto\Classes\ChangePasswordDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; +use Symfony\Contracts\Service\Attribute\Required; -class ResetPassword extends BaseActionService +#[AsAlias(id: 'action.reset.password.change', public: true)] +class ResetPassword extends UserBaseActionService { - private ?User $user; - public function __construct( - private ResponseServiceInterface $response, private UserPasswordHasherInterface $passwordHasher, - private DtoServiceInterface $passwordDto, - private ManagerRegistry $doctrine, - Security $security ) { - $this->user = $security->getUser(); - parent::__construct($response); } + #[Required] public function initDto( + #[Autowire(service: 'dto.password.change')] + DtoServiceInterface $dtoService + ): void + { + parent::initDto($dtoService); + } + + public function runAction(): void { /** @var ChangePasswordDto $dto */ - $dto = $this->passwordDto->getClass(); + $dto = $this->getDto(); if ($this->passwordHasher->isPasswordValid($this->user, $dto->oldPassword)) { $hashedPassword = $this->passwordHasher->hashPassword( @@ -43,21 +44,27 @@ class ResetPassword extends BaseActionService $em = $this->doctrine->getManager(); $em->persist($this->user); $em->flush(); - $this->response->addMessage('Пароль изменен'); + $this->responseService->addMessage('Пароль изменен'); } catch (\Exception $exception) { - $this->response->addError('Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ'); + $this->responseService->addError('Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ'); } } else { - $this->response->addError('Текущий пароль неверен'); + $this->responseService->addError('Текущий пароль неверен'); } } - public function validate(): bool + public function needDto(): bool { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - return $this->passwordDto->validate($this->response); + return true; + } + + public function checkDelete(): bool + { + return true; + } + + public function checkConfirm(): bool + { + return false; } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/ResetPasswordCode.php b/app/src/Service/Action/Classes/ResetPasswordCode.php index bc5ecd4..8368ef2 100644 --- a/app/src/Service/Action/Classes/ResetPasswordCode.php +++ b/app/src/Service/Action/Classes/ResetPasswordCode.php @@ -6,27 +6,34 @@ use App\Entity\User; use App\Service\Action\BaseActionService; use App\Service\Dto\Classes\ResetPasswordCodeDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; +use Symfony\Contracts\Service\Attribute\Required; +#[AsAlias(id: 'action.reset.password.code', public: true)] class ResetPasswordCode extends BaseActionService { public function __construct( - private ResponseServiceInterface $response, private UserPasswordHasherInterface $passwordHasher, - private DtoServiceInterface $passwordResetDto, - private ManagerRegistry $doctrine ) { - parent::__construct($response); } + #[Required] public function initDto( + #[Autowire(service: 'dto.password.code')] + DtoServiceInterface $dtoService + ): void + { + parent::initDto($dtoService); + } + + public function runAction(): void { /** @var ResetPasswordCodeDto $dto */ - $dto = $this->passwordResetDto->getClass(); + $dto = $this->getDto(); /** @var User $userExists */ $userExists = $this->doctrine->getRepository(User::class) ->findOneByUniq($dto->email, $dto->phoneNumber); @@ -36,7 +43,7 @@ class ResetPasswordCode extends BaseActionService $code = $dto->code; $registerCode = $userExists->getRegisterCode(); if ($registerCode === null) { - $this->response->addError('Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ отправлен'); + $this->responseService->addError('Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ отправлен'); } else { if ($registerCodeDate = $registerCode->getDate()) { if ($registerCode->getCode() === $code && $currentDate->getTimestamp() < $registerCodeDate->getTimestamp()) { @@ -50,24 +57,24 @@ class ResetPasswordCode extends BaseActionService $em->persist($userExists); $em->remove($registerCode); $em->flush(); - $this->response->addMessage('Пароль изменен'); + $this->responseService->addMessage('Пароль изменен'); } catch (\Exception $exception) { - $this->response->addError('Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ'); + $this->responseService->addError('Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ'); } } else { - $this->response->addError('Код недейÑтвителен'); + $this->responseService->addError('Код недейÑтвителен'); } } else { - $this->response->addError('Код недейÑтвителен'); + $this->responseService->addError('Код недейÑтвителен'); } } } else { - $this->response->addError('Пользователь не найден'); + $this->responseService->addError('Пользователь не найден'); } } - public function validate(): bool + public function needDto(): bool { - return $this->passwordResetDto->validate($this->response); + return true; } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/SaveImage.php b/app/src/Service/Action/Classes/SaveImage.php index 4e437de..36fb0f9 100644 --- a/app/src/Service/Action/Classes/SaveImage.php +++ b/app/src/Service/Action/Classes/SaveImage.php @@ -2,21 +2,21 @@ namespace App\Service\Action\Classes; -use App\Entity\User; use App\Entity\UserHistory; use App\Entity\UserImage; -use App\Service\Action\BaseActionService; +use App\Service\Action\UserBaseActionService; use App\Service\Dto\Classes\ImageDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; -use Doctrine\Persistence\ManagerRegistry; -use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\Mime\MimeTypes; use Symfony\Component\String\Slugger\SluggerInterface; +use Symfony\Contracts\Service\Attribute\Required; -class SaveImage extends BaseActionService +#[AsAlias(id: 'action.profile.image.save', public: true)] +class SaveImage extends UserBaseActionService { // ДоÑтупные раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² public const IMAGE_EXTENSIONS = [ @@ -24,21 +24,22 @@ class SaveImage extends BaseActionService 'png' ]; - private ?User $user; - public function __construct( private string $targetDirectory, - private DtoServiceInterface $imageDto, - private ResponseServiceInterface $response, - private SluggerInterface $slugger, - private ManagerRegistry $doctrine, - Security $security + private SluggerInterface $slugger ) { - $this->user = $security->getUser(); - parent::__construct($response); } + #[Required] public function initDto( + #[Autowire(service: 'dto.image')] + DtoServiceInterface $dtoService + ): void + { + parent::initDto($dtoService); + } + + public function runAction(): void { $file = $this->saveFile(); @@ -62,32 +63,19 @@ class SaveImage extends BaseActionService try { $em->persist($file); $em->flush(); - $this->response->addMessage('Изображение Ñохранено'); + $this->responseService->addMessage('Изображение Ñохранено'); } catch (\Exception $exception) { - $this->response->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° пользователÑ'); + $this->responseService->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° пользователÑ'); } } else { - $this->response->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°'); - } - } - - public function validate(): bool - { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } - if ($this->user->isDeleted()) { - $this->response->addError('Профиль удален'); - return false; + $this->responseService->addError('Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°'); } - return $this->imageDto->validate($this->response); } public function saveFile(): ?UserImage { /** @var ImageDto $dto */ - $dto = $this->imageDto->getClass(); + $dto = $this->getDto(); $matches = []; if (!preg_match('/^data:([a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}\/[a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}(;[a-z0-9\-]+\=[a-z0-9\-]+)?)?(;base64)?,([a-z0-9\!\$\&\\\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$)/i', $dto->data ?: '', $matches)) { @@ -99,11 +87,11 @@ class SaveImage extends BaseActionService $mimeTypes = new MimeTypes(); $types = $mimeTypes->getExtensions($extension); if (empty($types)) { - $this->response->addError('ÐеизвеÑтное раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°'); + $this->responseService->addError('ÐеизвеÑтное раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°'); return null; } if (empty(array_intersect($types, self::IMAGE_EXTENSIONS))) { - $this->response->addError('Файл раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ "'. reset($types) .'" недоÑтупен Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸. ДоÑтупные раÑширениÑ: ' . implode(', ', self::IMAGE_EXTENSIONS) . '.'); + $this->responseService->addError('Файл раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ "'. reset($types) .'" недоÑтупен Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸. ДоÑтупные раÑширениÑ: ' . implode(', ', self::IMAGE_EXTENSIONS) . '.'); return null; } @@ -113,7 +101,7 @@ class SaveImage extends BaseActionService $decoded = base64_decode($content); if (!$decoded) { - $this->response->addError('Ошибка Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°'); + $this->responseService->addError('Ошибка Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°'); return null; } @@ -141,4 +129,19 @@ class SaveImage extends BaseActionService return null; } + + public function needDto(): bool + { + return true; + } + + public function checkDelete(): bool + { + return true; + } + + public function checkConfirm(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/SendRegisterCode.php b/app/src/Service/Action/Classes/SendRegisterCode.php index 8796d95..135e2f9 100644 --- a/app/src/Service/Action/Classes/SendRegisterCode.php +++ b/app/src/Service/Action/Classes/SendRegisterCode.php @@ -2,30 +2,21 @@ namespace App\Service\Action\Classes; -use App\Entity\User; -use App\Service\Action\BaseActionService; -use App\Service\Response\ResponseServiceInterface; -use App\Service\Send\Classes\Code\RegisterCodeSendService; +use App\Service\Action\UserBaseActionService; use App\Service\Send\SendServiceInterface; -use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; -class SendRegisterCode extends BaseActionService +#[AsAlias(id: 'action.register.send', public: true)] +class SendRegisterCode extends UserBaseActionService { - private ?User $user; - - /** - * @param ResponseServiceInterface $response - * @param RegisterCodeSendService $registerCodeSendService - * @param Security $security - */ - public function __construct( - private ResponseServiceInterface $response, - private SendServiceInterface $registerCodeSendService, - Security $security - ) + #[Required] public function initSend( + #[Autowire(service: 'send.code.register')] + SendServiceInterface $sendService + ): void { - $this->user = $security->getUser(); - parent::__construct($response); + parent::initSend($sendService); } @@ -38,22 +29,33 @@ class SendRegisterCode extends BaseActionService */ public function runAction(): void { - $this->registerCodeSendService->setUser($this->user); - $this->registerCodeSendService->setResponse($this->response); - $this->registerCodeSendService->send(); + $this->sendService->setUser($this->user); + $this->sendService->setResponse($this->responseService); + $this->sendService->send(); } - public function validate(): bool + public function customValidate(): bool { - if ($this->user === null) { - $this->response->addError('Ð’Ñ‹ не авторизованы'); - return false; - } if ($this->user->isConfirm()) { - $this->response->addError('Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже подтверждена'); + $this->responseService->addError('Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже подтверждена'); return false; } return true; } + + public function needDto(): bool + { + return false; + } + + public function checkDelete(): bool + { + return true; + } + + public function checkConfirm(): bool + { + return false; + } } \ No newline at end of file diff --git a/app/src/Service/Action/Classes/SendResetPasswordCode.php b/app/src/Service/Action/Classes/SendResetPasswordCode.php index 7426d9b..6984819 100644 --- a/app/src/Service/Action/Classes/SendResetPasswordCode.php +++ b/app/src/Service/Action/Classes/SendResetPasswordCode.php @@ -6,41 +6,50 @@ use App\Entity\User; use App\Service\Action\BaseActionService; use App\Service\Dto\Classes\RecoveryDto; use App\Service\Dto\DtoServiceInterface; -use App\Service\Response\ResponseServiceInterface; use App\Service\Send\SendServiceInterface; -use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Contracts\Service\Attribute\Required; +#[AsAlias(id: 'action.reset.password.send', public: true)] class SendResetPasswordCode extends BaseActionService { - public function __construct( - private ResponseServiceInterface $response, - private DtoServiceInterface $recoveryDto, - private ManagerRegistry $doctrine, - private SendServiceInterface $passwordCodeSendService - ) + #[Required] public function initDto( + #[Autowire(service: 'dto.recovery.send')] + DtoServiceInterface $dtoService + ): void { - parent::__construct($response); + parent::initDto($dtoService); } + #[Required] public function initSend( + #[Autowire(service: 'send.code.password')] + SendServiceInterface $sendService + ): void + { + parent::initSend($sendService); + } + + public function runAction(): void { /** @var RecoveryDto $dto */ - $dto = $this->recoveryDto->getClass(); + $dto = $this->getDto(); /** @var User $userExists */ $userExists = $this->doctrine->getRepository(User::class) ->findOneByUniq($dto->email, $dto->phoneNumber); if ($userExists !== null) { - $this->passwordCodeSendService->setUser($userExists); - $this->passwordCodeSendService->setResponse($this->response); - $this->passwordCodeSendService->send(); + $this->sendService->setUser($userExists); + $this->sendService->setResponse($this->responseService); + $this->sendService->send(); } else { - $this->response->addError('Пользователь не найден'); + $this->responseService->addError('Пользователь не найден'); } } - public function validate(): bool + public function needDto(): bool { - return $this->recoveryDto->validate($this->response); + return true; } } \ No newline at end of file diff --git a/app/src/Service/Action/UserBaseActionService.php b/app/src/Service/Action/UserBaseActionService.php new file mode 100644 index 0000000..c6b2019 --- /dev/null +++ b/app/src/Service/Action/UserBaseActionService.php @@ -0,0 +1,42 @@ +<?php + +namespace App\Service\Action; + +use App\Entity\User; +use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Contracts\Service\Attribute\Required; + +abstract class UserBaseActionService extends BaseActionService +{ + protected ?User $user; + + #[Required] + public function initUser(Security $security): void + { + $this->user = $security->getUser(); + } + + abstract public function checkDelete(): bool; + + abstract public function checkConfirm(): bool; + + public function customValidate(): bool + { + if ($this->user === null) { + $this->responseService->addError('Ð’Ñ‹ не авторизованы'); + return false; + } + + if ($this->checkDelete() && $this->user->isDeleted()) { + $this->responseService->addError('Профиль удален'); + return false; + } + + if ($this->checkConfirm() && !$this->user->isConfirm()) { + $this->responseService->addError('Профиль не подтвержден'); + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/app/src/Service/Dto/BaseDto.php b/app/src/Service/Dto/BaseDto.php index b3abff0..363af97 100644 --- a/app/src/Service/Dto/BaseDto.php +++ b/app/src/Service/Dto/BaseDto.php @@ -5,6 +5,7 @@ namespace App\Service\Dto; use App\Service\Response\ResponseServiceInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\Serializer\Annotation\Ignore; use Symfony\Component\Serializer\Encoder\JsonEncoder; @@ -90,11 +91,13 @@ abstract class BaseDto implements DtoServiceInterface if (count($aErrors) > 0) { foreach ($aErrors as $error) { $response->addError($error->getMessage()); + $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $bValid = false; } } else { $response->addError("Данные не получены"); + $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); $bValid = false; } diff --git a/app/src/Service/Dto/Classes/ChangePasswordDto.php b/app/src/Service/Dto/Classes/ChangePasswordDto.php index f15145b..952993f 100644 --- a/app/src/Service/Dto/Classes/ChangePasswordDto.php +++ b/app/src/Service/Dto/Classes/ChangePasswordDto.php @@ -4,11 +4,13 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; use App\Validators\PasswordValidator; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; #[Assert\Callback([PasswordValidator::class, 'validateRepeatPassword'])] #[Assert\Callback([PasswordValidator::class, 'validateNewPassword'])] #[Assert\Callback([PasswordValidator::class, 'validatePassword'])] +#[AsAlias(id: 'dto.password.change', public: true)] class ChangePasswordDto extends BaseDto { #[Assert\NotBlank( diff --git a/app/src/Service/Dto/Classes/ChangeProfileDto.php b/app/src/Service/Dto/Classes/ChangeProfileDto.php index 129af96..9ab7166 100644 --- a/app/src/Service/Dto/Classes/ChangeProfileDto.php +++ b/app/src/Service/Dto/Classes/ChangeProfileDto.php @@ -3,8 +3,10 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; +#[AsAlias(id: 'dto.profile.change', public: true)] class ChangeProfileDto extends BaseDto { #[Assert\Email( diff --git a/app/src/Service/Dto/Classes/ImageDto.php b/app/src/Service/Dto/Classes/ImageDto.php index 5f47f0d..51ade14 100644 --- a/app/src/Service/Dto/Classes/ImageDto.php +++ b/app/src/Service/Dto/Classes/ImageDto.php @@ -3,8 +3,10 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; +#[AsAlias(id: 'dto.image', public: true)] class ImageDto extends BaseDto { #[Assert\NotBlank( diff --git a/app/src/Service/Dto/Classes/NoneDto.php b/app/src/Service/Dto/Classes/NoneDto.php index bb31bf3..37981d8 100644 --- a/app/src/Service/Dto/Classes/NoneDto.php +++ b/app/src/Service/Dto/Classes/NoneDto.php @@ -3,7 +3,9 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +#[AsAlias] class NoneDto extends BaseDto { diff --git a/app/src/Service/Dto/Classes/RecoveryCodeDto.php b/app/src/Service/Dto/Classes/RecoveryCodeDto.php index 2e9757e..20f5917 100644 --- a/app/src/Service/Dto/Classes/RecoveryCodeDto.php +++ b/app/src/Service/Dto/Classes/RecoveryCodeDto.php @@ -4,9 +4,11 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; use App\Validators\UserValidator; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; #[Assert\Callback([UserValidator::class, 'validateEmailOrPhone'])] +#[AsAlias(id: 'dto.recovery.code', public: true)] class RecoveryCodeDto extends BaseDto { #[Assert\Email( diff --git a/app/src/Service/Dto/Classes/RecoveryDto.php b/app/src/Service/Dto/Classes/RecoveryDto.php index 3f99521..3558c6e 100644 --- a/app/src/Service/Dto/Classes/RecoveryDto.php +++ b/app/src/Service/Dto/Classes/RecoveryDto.php @@ -4,9 +4,11 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; use App\Validators\UserValidator; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; #[Assert\Callback([UserValidator::class, 'validateEmailOrPhone'])] +#[AsAlias(id: 'dto.recovery.send', public: true)] class RecoveryDto extends BaseDto { #[Assert\Email( diff --git a/app/src/Service/Dto/Classes/RegisterCodeDto.php b/app/src/Service/Dto/Classes/RegisterCodeDto.php index 2989049..ff5859c 100644 --- a/app/src/Service/Dto/Classes/RegisterCodeDto.php +++ b/app/src/Service/Dto/Classes/RegisterCodeDto.php @@ -3,8 +3,10 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; +#[AsAlias(id: 'dto.register.code', public: true)] class RegisterCodeDto extends BaseDto { #[Assert\NotBlank( diff --git a/app/src/Service/Dto/Classes/RegisterDto.php b/app/src/Service/Dto/Classes/RegisterDto.php index 74247d5..1659ba0 100644 --- a/app/src/Service/Dto/Classes/RegisterDto.php +++ b/app/src/Service/Dto/Classes/RegisterDto.php @@ -4,10 +4,12 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; use App\Validators\PasswordValidator; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; #[Assert\Callback([PasswordValidator::class, 'validateRepeatPassword'])] #[Assert\Callback([PasswordValidator::class, 'validatePassword'])] +#[AsAlias(id: 'dto.register', public: true)] class RegisterDto extends BaseDto { #[Assert\NotBlank( diff --git a/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php b/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php index 302631a..25c9268 100644 --- a/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php +++ b/app/src/Service/Dto/Classes/ResetPasswordCodeDto.php @@ -5,11 +5,13 @@ namespace App\Service\Dto\Classes; use App\Service\Dto\BaseDto; use App\Validators\PasswordValidator; use App\Validators\UserValidator; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Validator\Constraints as Assert; #[Assert\Callback([UserValidator::class, 'validateEmailOrPhone'])] #[Assert\Callback([PasswordValidator::class, 'validateRepeatPassword'])] #[Assert\Callback([PasswordValidator::class, 'validatePassword'])] +#[AsAlias(id: 'dto.password.code', public: true)] class ResetPasswordCodeDto extends BaseDto { #[Assert\Email( diff --git a/app/src/Service/Response/Classes/ProfileResponse.php b/app/src/Service/Response/Classes/ProfileResponse.php index 91c773c..5d63c7b 100644 --- a/app/src/Service/Response/Classes/ProfileResponse.php +++ b/app/src/Service/Response/Classes/ProfileResponse.php @@ -3,8 +3,10 @@ namespace App\Service\Response\Classes; use App\Entity\User; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Serializer\Annotation\Groups; +#[AsAlias(id: 'response.profile', public: true)] class ProfileResponse extends Response { /** diff --git a/app/src/Service/Response/Classes/Response.php b/app/src/Service/Response/Classes/Response.php index 5e10801..b0f32f1 100644 --- a/app/src/Service/Response/Classes/Response.php +++ b/app/src/Service/Response/Classes/Response.php @@ -3,6 +3,7 @@ namespace App\Service\Response\Classes; use App\Service\Response\ResponseServiceInterface; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\Serializer\Annotation\Groups; @@ -15,6 +16,7 @@ use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\Serializer; +#[AsAlias] class Response implements ResponseServiceInterface { /** @@ -123,6 +125,9 @@ class Response implements ResponseServiceInterface $groups = ['message']; if (!empty($this->errors)) { $this->status = false; + if ($this->statusCode === 200) { + $this->statusCode = \Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST; + } } else { $this->status = true; } diff --git a/app/src/Service/Response/Classes/TokenResponse.php b/app/src/Service/Response/Classes/TokenResponse.php index 8ce5a95..c97b562 100644 --- a/app/src/Service/Response/Classes/TokenResponse.php +++ b/app/src/Service/Response/Classes/TokenResponse.php @@ -2,8 +2,10 @@ namespace App\Service\Response\Classes; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Serializer\Annotation\Groups; +#[AsAlias(id: 'response.token', public: true)] class TokenResponse extends Response { /** diff --git a/app/src/Service/Response/ResponseServiceInterface.php b/app/src/Service/Response/ResponseServiceInterface.php index e20fdd5..2f0b6e5 100644 --- a/app/src/Service/Response/ResponseServiceInterface.php +++ b/app/src/Service/Response/ResponseServiceInterface.php @@ -13,4 +13,6 @@ interface ResponseServiceInterface public function addMessage(string $message): self; public function isSuccess(): bool; + + public function setStatusCode(int $code): self; } \ No newline at end of file diff --git a/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php b/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php index a571254..041b335 100644 --- a/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php +++ b/app/src/Service/Send/Classes/Code/PasswordCodeSendService.php @@ -3,7 +3,9 @@ namespace App\Service\Send\Classes\Code; use App\Service\Send\Classes\CodeSendService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +#[AsAlias(id: 'send.code.password', public: true)] class PasswordCodeSendService extends CodeSendService { public function getSubject(): string diff --git a/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php b/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php index 0e9c5e6..306e169 100644 --- a/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php +++ b/app/src/Service/Send/Classes/Code/RecoveryCodeSendService.php @@ -3,7 +3,9 @@ namespace App\Service\Send\Classes\Code; use App\Service\Send\Classes\CodeSendService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +#[AsAlias(id: 'send.code.recovery', public: true)] class RecoveryCodeSendService extends CodeSendService { public function getSubject(): string diff --git a/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php b/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php index 9371af7..4a3dbb9 100644 --- a/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php +++ b/app/src/Service/Send/Classes/Code/RegisterCodeSendService.php @@ -3,7 +3,9 @@ namespace App\Service\Send\Classes\Code; use App\Service\Send\Classes\CodeSendService; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; +#[AsAlias(id: 'send.code.register', public: true)] class RegisterCodeSendService extends CodeSendService { public function getSubject(): string diff --git a/app/src/Service/Send/Classes/CodeSendService.php b/app/src/Service/Send/Classes/CodeSendService.php index eabbcb8..1aafc51 100644 --- a/app/src/Service/Send/Classes/CodeSendService.php +++ b/app/src/Service/Send/Classes/CodeSendService.php @@ -8,8 +8,10 @@ use App\Service\Response\ResponseServiceInterface; use App\Service\Send\SendService; use App\Service\Send\SendServiceInterface; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\DependencyInjection\Attribute\AsAlias; use Symfony\Component\Serializer\SerializerInterface; +#[AsAlias] class CodeSendService implements SendServiceInterface { private ?User $user = null; diff --git a/app/src/Service/Send/SendService.php b/app/src/Service/Send/SendService.php index eb1d5e3..4870235 100644 --- a/app/src/Service/Send/SendService.php +++ b/app/src/Service/Send/SendService.php @@ -80,7 +80,6 @@ class SendService $this->confirmType )); } catch (Throwable $e) { - dd($e); } } } \ No newline at end of file -- GitLab