<?php
namespace Elements\Bundle\CDMUserManagerBundle\Controller;
use Carbon\Carbon;
use CustomerManagementFrameworkBundle\CustomerMerger\CustomerMergerInterface;
use CustomerManagementFrameworkBundle\CustomerProvider\CustomerProviderInterface;
use CustomerManagementFrameworkBundle\CustomerSaveValidator\Exception\DuplicateCustomerException;
use CustomerManagementFrameworkBundle\Model\CustomerInterface;
use CustomerManagementFrameworkBundle\Security\Authentication\LoginManagerInterface;
use CustomerManagementFrameworkBundle\SegmentManager\SegmentManagerInterface;
use Exception;
use HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken;
use Pimcore\Model\DataObject\Customer;
use Pimcore\Model\DataObject\CustomerSegment;
use Pimcore\Model\Document\Email;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use CustomerManagementFrameworkBundle\Security\OAuth\OAuthRegistrationHandler;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use CustomerManagementFrameworkBundle\Security\OAuth\Exception\AccountNotLinkedException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Elements\Bundle\CDMUserManagerBundle\Service\CDMUserManagerServiceInterface;
class UserManagerController extends AbstractController
{
/**
* @param Request $request
* @param CsrfTokenManagerInterface $csrfTokenManager
* @param UserInterface|null $user
*
* @param SegmentManagerInterface $segmentManager
* @return Response
* @Route("/{_locale}/auth/data", name="cdm_data")
*/
public function dataAction(
Request $request,
CsrfTokenManagerInterface $csrfTokenManager,
UserInterface $user = null,
SegmentManagerInterface $segmentManager
) {
if (!$this->editmode) {
$this->denyAccessUnlessGranted('ROLE_USER');
}
$segmentsArray = [];
if ($user instanceof Customer) {
if (!$user->getConfirmed()) {
return $this->redirectToRoute('cdm_auth_sendconfirm');
}
$isInitDataSet = $user->getInitDataSet();
if ($request->isMethod('POST') && $request->get('phone') == '') {
$token = new CsrfToken(CDMUserManagerServiceInterface::DATA_CSRF_TOKEN_ID,
$request->get(CDMUserManagerServiceInterface::CSRF_PARAM));
if (!$csrfTokenManager->isTokenValid($token)) {
throw new InvalidCsrfTokenException();
}
$block = $this->getDocumentEditable('block', 'fields');
$count = $block->getCount();
$selectedSegmentIds = [];
$selectedSegmentsArray = [];
for ($i = 0; $i < $count; $i++) {
$parameterVal = $request->get('segment-field-' . $i);
if (is_array($parameterVal)) {
$selectedSegmentIds = array_merge($selectedSegmentIds, $parameterVal);
} else {
if ($parameterVal != '' && ((int)$parameterVal) > 0) {
$selectedSegmentIds[] = $parameterVal;
}
}
}
if (is_array($selectedSegmentIds) && count($selectedSegmentIds)) {
$selectedSegments = new CustomerSegment\Listing();
$selectedSegments->addConditionParam('o_id IN (' . implode(',', $selectedSegmentIds) . ')');
$selectedSegmentsArray = $selectedSegments->load();
}
if (is_array($selectedSegmentsArray)) {
$toDeleteSegments = [];
while ($block->loop()) {
if ($this->getDocumentEditable('select', 'type') != 'snippet') {
foreach ($this->getDocumentEditable('relations', 'segments') as $segment) {
$toDeleteSegments[] = $segment;
}
}
}
$targetGroupSegments = [];
/**
* @var CustomerSegment $segment
*/
foreach ($selectedSegmentsArray as $segment) {
if ($segment->getTargetgroupSegment() instanceof CustomerSegment) {
$targetGroupSegments[] = $segment->getTargetgroupSegment();
}
if ($toDeleteSegments) {
foreach ($toDeleteSegments as $key => $toDeleteSegment) {
if ($segment->getId() == $toDeleteSegment->getId()) {
unset($toDeleteSegments[$key]);
}
}
}
}
$segmentManager->mergeSegments($user, array_merge($selectedSegmentsArray, $targetGroupSegments),
$toDeleteSegments);
}
$endDate = $request->get('addProfile-endDate-alt', 0);
$startDate = $request->get('addProfile-startDate-alt', 0);
if ($endDate > 0) {
$user->setEndDate(Carbon::createFromTimestamp($endDate / 1000));
}
if ($startDate > 0) {
$user->setStartDate(Carbon::createFromTimestamp($startDate / 1000));
}
try {
$user->setInitDataSet(true);
$user->save();
if (!$isInitDataSet) {
return $this->redirectToRoute('cdm_profile');
} else {
$returnArray['success'] = true;
}
} catch (Exception $e) {
$returnArray['errors'] = [$e->getMessage()];
}
}
}
if ($user instanceof CustomerInterface) {
$manualSegments = $segmentManager->getManualSegmentsFromCustomer($user);
foreach ($manualSegments as $segment) {
$segmentsArray[] = $segment->getId();
}
}
$returnArray = [
'segmentManager' => $segmentManager,
'isInitDataset' => $isInitDataSet ?: false,
'segmentsArray' => $segmentsArray,
'csrfTokenManager' => $csrfTokenManager,
'customer' => $user
];
return $this->render('@ElementsCDMUserManager/UserManager/data.html.twig', $returnArray);
}
/**
* @param Request $request
* @param CDMUserManagerServiceInterface $cdmUserManagerService
*
* @return Response
* @throws Exception
* @Route("/{_locale}/auth/editprofile", name="cdm_profile")
*
*/
public function profileAction(
Request $request,
CDMUserManagerServiceInterface $cdmUserManagerService
) {
if (!$this->editmode) {
if ($redirect = $cdmUserManagerService->profilePreCheck($request)) {
return $redirect;
}
}
if ($returnArray = $cdmUserManagerService->updateProfileData($request)) {
$returnArray['customer'] = $this->getUser();
return $this->render('@ElementsCDMUserManager/UserManager/profile.html.twig', $returnArray);
}
return $this->render('@ElementsCDMUserManager/UserManager/profile.html.twig', [
'customer' => $this->getUser()
]);
}
/**
* @Route("/{_locale}/auth/send-recovery", name="cdm_auth_sendrecovery")
*
* @param Request $request
* @param CDMUserManagerServiceInterface $CDMUserManagerService
*
* @return Response
* @throws Exception
*/
public function sendRecovery(Request $request, CDMUserManagerServiceInterface $CDMUserManagerService) {
$view = [];
if ($request->isMethod('POST') && $request->get('phone') == '') {
$errors = [];
$params['email'] = $request->get('email');
if (filter_var($params['email'], FILTER_VALIDATE_EMAIL) !== false) {
if ($CDMUserManagerService->customerExists($params['email'])) {
$emailDoc = $this->document->getProperty('email');
$success = $CDMUserManagerService->sendRecoveryMail($request, $params['email'], $emailDoc);
$view['success'] = $success;
$view['email'] = $params['email'];
} else {
$errors[] = 'Customer does not exist';
}
} else {
$errors[] = 'email not valid';
}
$view['errors'] = $errors;
}
return $this->render('@ElementsCDMUserManager/UserManager/sendRecovery.html.twig', $view);
}
/**
* @Route("/{_locale}/auth/send-confirm", name="cdm_auth_sendconfirm")
*
* @param Request $request
* @param CDMUserManagerServiceInterface $CDMUserManagerService
*
* @return Response
* @throws Exception
*/
public function sendConfirm(
Request $request,
CDMUserManagerServiceInterface $CDMUserManagerService
) {
$returnArray = [];
if ($this->document->getProperty('confirmEmail') instanceof Email) {
$returnArray = $CDMUserManagerService->sendConfirm($request, $this->document->getProperty('confirmEmail'), $this->editmode);
}
return $this->render('@ElementsCDMUserManager/UserManager/sendConfirm.html.twig', $returnArray);
}
}