<?php
declare(strict_types=1);
namespace App\Mobile\Doctor;
use App\Entity\User\ShopUser;
use Sylius\Component\Resource\Repository\RepositoryInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validation;
use Symfony\Contracts\Translation\TranslatorInterface;
use function mb_strtolower;
use function trim;
final readonly class CheckEmailAction
{
public function __construct(
private RepositoryInterface $shopUserRepository,
private TranslatorInterface $translator,
) {
}
public function __invoke(Request $request): JsonResponse
{
$data = $request->toArray();
$email = trim((string) ($data['email'] ?? ''));
$violations = Validation::createValidator()->validate($email, [
new Assert\NotBlank(message: $this->translator->trans('validator.error.field_required', [], 'validators')),
new Assert\Email(message: $this->translator->trans('validator.error.email_not_valid', [], 'validators')),
]);
if ($violations->count() > 0) {
return new JsonResponse([
'status' => 'error',
'code' => 'invalid_email',
'message' => $violations->get(0)->getMessage(),
], Response::HTTP_UNPROCESSABLE_ENTITY);
}
/** @var ShopUser|null $shopUser */
$shopUser = $this->shopUserRepository->findOneBy(['usernameCanonical' => mb_strtolower($email)]);
if ($shopUser === null) {
return new JsonResponse([
'status' => 'error',
'code' => 'account_not_found',
'message' => $this->translator->trans('validator.error.account_not_found', [], 'validators'),
], Response::HTTP_NOT_FOUND);
}
$customer = $shopUser->getCustomer();
$doctor = $customer?->getDoctor();
if ($doctor === null || ! $doctor->isAppAccessSeriderm360()) {
return new JsonResponse([
'status' => 'error',
'code' => 'access_denied',
'message' => $this->translator->trans('validator.error.access_denied', [], 'validators'),
], Response::HTTP_FORBIDDEN);
}
return new JsonResponse([
'status' => 'success',
'data' => [
'account_status' => $shopUser->getAccountStatus(),
'app_access' => [
'seriderm_360' => $doctor->isAppAccessSeriderm360(),
],
],
]);
}
}