diff --git a/README.md b/README.md index a99a2a1a27eb623e0ddd8d1dc6f8e9ad995da46f..362f2960e4d28895dde5c1c00ddbf88f7ef11f76 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 37c76cf6cff9308a7408e42bc197bad85b5666ed..ffde54bbe1acd25dc1c8a6462b46234216df4561 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 43d8e480779bb893f7497d9388dd953ee6539801..02884eb17e3bae4741b0165e463a6f60db3e9f74 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 9135e2a08ee0da5238ccdd9314ee8d5c057210b5..cc257a82f2799eadc67f039c17c7b204cbce74fa 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 dda47fcff78a10ff0f4f31820c0df1f3e3453be4..2f9448814b83803201199e561c3edde09a81374d 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 2082aa3a28ce85026058de1428e4346b9e05a6e3..348b043e42771781be5de044820ca04043e80c65 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 887b4b90da1be7d3b2bae3294a28824783b87b5a..3cf93def581c33585fe33a42911b65e3b4db13c4 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 0000000000000000000000000000000000000000..a9ef3ccaf9ddbb5ca66d428ee6d4a6ce3a95c5ca --- /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 7af6d636b158c0c349558825fff9db75d920e888..9c2ae4299124bfa4d6c582e9a76f4a342c3a141e 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 0f16176eb57cd3c57ce0817780ead00ca2c2a3d4..f3e7391efa2de1748977f76a248ef86f5b0038d5 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 97235c59f78a0c2c3b5068bcdb3336896b18dd8c..df831f0f045346abc7fb36203557f3553a27863b 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 62d1ef0f2c9dafa26813a204376cbf7c3cf4d53c..9c155d8fedd7b5f2924e42efd68f6658c35cc2ec 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 4a1d3a0e1dc4e6b63e8f529408de91d75dad2510..afdfff91a5629a1f008c6fb13d7c6a65c8f5d717 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 6411a739d7732a6fc467909d29b56d7be1a389d3..3a26d7f78af4e23eb4880cb87e821d7827027812 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 6431f4f1b95ddecaa4ca9758412932f96403d725..ff32f3dd6a18dd45bb6378438c2a1ef2999ccf1f 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 9408091b647b146ae3c0851f15af1fd2eb73fbca..d50a89492dd7fcf3edbb338530f4e2179895fd37 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 8a98a3a812026af5270f5f6fa502d8a80c13f014..73a47bf0851bad47fcae37d1412153187a346fea 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 f891845a8ff2c574291898571514b90712f2e7d3..4dea60206f8c6cc8c43d9124a652d0b6c5d17fb0 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 d6e7e685f7b1f849bf7786e6f220388dac497188..7cad30652be3e7f54a944eabb985983a952a14e2 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 12291099361a1fcd81da1acc3222a6ca75e74793..42117d6bfe3717b81439a2a896067a6afebf5878 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 07f270936f12e74a1f28385799c969bc9c8e2e6a..cd5e06c91f979ff9e94950e898957f6d32ceb2f7 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 ec611ab5ae2fe36a51ee1409dfd5d6f1afd57b3c..21d0e7b7a5e70b132e6dd5d2f2d127d5afaa392d 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 bc5ecd44c7d8979b4682c0d2dc5b010e9fc157fe..8368ef22541f04c7708f84046e5044928c6ae659 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 4e437de826790ba72f8a0c9561c5437d74c9537d..36fb0f90eb745bf09d4387779fc99f716ef20bb2 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 8796d952e6a260513518843afe80fbb9ff51a4ae..135e2f94ae7f6fca37bbfe4894b58ff4e002ee71 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 7426d9bf2de3588d848eb4624e424502b660a674..6984819805fd56f83681d4e41b1540059271402e 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 0000000000000000000000000000000000000000..c6b201999fc70f1c267c0e5acc5ff63b0eadf4ab --- /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 b3abff01ee86261b7fceff8c91974fb7a09bd1c7..363af9757865249aafbea400550fbf5999a32af0 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 f15145b0aee769de86dd347d8efb27358e0f6c39..952993f9c85869e568900b3f597117961dc6b297 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 129af968e3620c90eaaa31a52821a520859556f0..9ab7166bdf741d52a40f33c496a505f930d8716c 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 5f47f0d1126976f34e12b55118f124aabbe107de..51ade144be4fd64900241ddc0b78e02b20486187 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 bb31bf37f77c28d15f2f9e35e2c76e074ad9a959..37981d8ad8b86630b172e86284e952e46f282d8c 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 2e9757ec527a441b1ddf811b643574094dbc9eb7..20f5917edd613fff41de4cd81f8dce132e524fbb 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 3f995214395c3aacc3db77370992735cc8d014c3..3558c6e5a869d9fdd029103ef61bbe99e9c4dbb0 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 29890490754ae3a7958c31c78b97a4bb55464996..ff5859c81c7b921992def422c391feda6ec89d50 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 74247d56754553dc60783e1b62113b5befb23f1f..1659ba09fabc0a848aeb5b2ab25fab625590a5c6 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 302631aeca70cb0c60274c7bb2f1a3a449a14704..25c92680b3d8c23717ca6888eab060fd4bc145b5 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 91c773c2d1f284dc6faf06f4ee6ee2a7d77cb282..5d63c7bab71cdd8705022f3b8a46ca1f77f7b8c7 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 5e10801f5812f364d28690d22da523354d4ef626..b0f32f13cb1594628ea9188f757dbbc4a0acf0d4 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 8ce5a95444e102c4865fbb6d10661f1622379e36..c97b562c757f90b51ae4776193083a562c6055bc 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 e20fdd578f4e143e709aece6f85188c9d2ac738c..2f0b6e5224567a2d345c73af390fdd269da4335e 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 a571254bb44c2bd2932d511e4da2d78f55fb1d0f..041b3357811183b09d780d5eb6060e1a7d8a6249 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 0e9c5e6016315ddbe894c8c637a28175589dbc90..306e169b1b30edadd00fa8edb5009e33cb1b2f0a 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 9371af7187c63479450fc6e0a73c0cae3e5a0a66..4a3dbb9d77fd3218182e15dc5dfeba7605f90fe0 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 eabbcb8862fb176e58c43d46685697edf74f9b21..1aafc513aa49feb8ae43ae60e6f5e7110991eec8 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 eb1d5e33554fa91156249fbf0057bbd1a8cdd4f4..487023563fdb1b737f4448aa18ea42500e1aca12 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