<?php
namespace App\Controller\Pub;
use App\DTO\Request\UserPayloadMMAZ;
use App\Entity\Logs\EventLog;
use App\Entity\User\User;
use App\Entity\User\UserProfile;
use App\Event\LogEvent;
use App\Factory\EntityFactory;
use App\Repository\App\CountryRepository;
use App\Repository\App\LanguageRepository;
use App\Repository\User\UserProfileRepository;
use App\Repository\User\UserRepository;
use App\Responders\EntityResponder;
use App\Service\AuthenticationService;
use App\Service\EventLogService;
use App\Service\ProfileService;
use App\Service\RequestDataExtractorService;
use App\Service\UserService;
use Nelmio\ApiDocBundle\Annotation\Model;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Swagger\Annotations as SWG;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Annotation\Route;
class CreateUserForMMMAZ
{
/** @var EventDispatcherInterface */
private $eventDispatcher;
/**
* @var RequestDataExtractorService
*/
private $requestDataExtractorService;
/**
* @var EntityFactory
*/
private $entityFactory;
/** @var EventLogService */
private $eventLogService;
/**
* @var ProfileService
*/
private $profileService;
/**
* @var AuthenticationService
*/
private $authenticationService;
/** @var UserService */
private $userService;
/**
* Create constructor.
* @param RequestDataExtractorService $requestDataExtractorService
* @param EntityFactory $entityFactory
* @param EventDispatcherInterface $eventDispatcher
* @param EventLogService $eventLogService
* @param ProfileService $profileService
* @param AuthenticationService $authenticationService
* @param UserService $userService
*/
public function __construct(
RequestDataExtractorService $requestDataExtractorService,
EntityFactory $entityFactory,
EventDispatcherInterface $eventDispatcher,
EventLogService $eventLogService,
ProfileService $profileService,
AuthenticationService $authenticationService,
UserService $userService
)
{
$this->requestDataExtractorService = $requestDataExtractorService;
$this->entityFactory = $entityFactory;
$this->eventDispatcher = $eventDispatcher;
$this->eventLogService = $eventLogService;
$this->profileService = $profileService;
$this->authenticationService = $authenticationService;
$this->userService = $userService;
}
/**
* @Route(path="/user/for-mmaz", methods={"POST"})
*
* @SWG\Post(
* tags={"Public"}
* )
*
* @SWG\Parameter(
* name="body",
* in="body",
* description="JSON body",
* type="json",
* @Model(type=UserPayloadMMAZ::class, groups={"user:payloadMMAZ"})
* )
*
* @SWG\Response(
* response=200,
* description="Success response"
* )
*
* @param Request $request
* @param EntityResponder $entityResponder
* @return JsonResponse
*/
public function __invoke(Request $request, EntityResponder $entityResponder)
{
$data = $this->requestDataExtractorService->extractDataFromApiRequest([
'jwt'
], $request);
$data = $this->authenticationService->decodeJwt($data['jwt']);
/*$data = $this->requestDataExtractorService->extractDataFromApiRequest([
'email',
'enabled',
'status',
//'currency_code',
//'created_at',
'two_factor_authentication_enabled',
//'signed_up_to_mailing_list',
'user_profile_first_name',
'user_profile_last_name',
'user_profile_email_gc',
'user_profile_country_name',
//'user_profile_timezone',
'user_profile_language_code',
], $request);*/
if(!isset($data['email'])){
throw new BadRequestHttpException('Please fill in required field "email"');
}
/** @var User $entityUser */
$entityUser = $this->userService->findUserByEmail($data['email']);
if(is_null($entityUser)){
$this->eventLogService->saveDefaultEventLog(
$data,
EventLog::TYPE_BEFORE_USER_CREATED_MMAZ
);
$entityUser = $this->userService->createUserFromMMAZ($data);
}else{
if((int)$data['status'] === 0 && (int)$data['enabled'] === 0){
$this->eventLogService->saveDefaultEventLog(
$data,
EventLog::TYPE_BEFORE_USER_REVOKED_MMAZ
);
$this->userService->revokeAccess($entityUser, $data);
}else{
$this->eventLogService->saveDefaultEventLog(
$data,
EventLog::TYPE_BEFORE_USER_UPDATED_MMAZ
);
$this->userService->updateUserFromMMAZ($entityUser, $data);
}
}
/** @var User $user */
$user = $this->userService->findUserByEmail($entityUser->getEmail());
return $entityResponder($user, ['user:index']);
}
}