<?php
namespace App\Controller;
use App\Entity\Newsletter;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\NoResultException;
use App\Entity\CustomerHistoryEntry;
use App\Repository\PersonRepository;
use App\Repository\NewsletterRepository;
use Doctrine\Persistence\ManagerRegistry;
use App\Repository\ClientConfigRepository;
use Menke\UserBundle\Service\MailerService;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\ManualNewsletterRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Menke\UserBundle\Controller\AbstractClientableController;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
/**
* @Route("/newsletter")
*/
class NewsletterController extends AbstractClientableController
{
const LISTING_LIMIT = 20;
private $moment;
public function __construct()
{
$this->moment = new \DateTime();
}
/**
* @Route("/unsubscribe/{hash}", name="newsletter_unsubscribe", methods="GET")
*/
public function unsubscribe(Request $request, $hash, PersonRepository $personRepo, ClientConfigRepository $clientConfigRepo)
{
$status = 'not_found';
try {
$person = $personRepo->getOneByHash($hash);
$status = 'found';
} catch (NoResultException $e) {
$status = 'not_found';
}
if ($status == 'found') {
$em = $this->getDoctrine()->getManager();
if ($person->getReceiveNewsletter()) {
$person->setReceiveNewsletter(false);
$entry = CustomerHistoryEntry::createForNewsletterDeregister($person, 'link_unsubscribe');
$em->persist($entry);
$em->flush();
$config = $clientConfigRepo->getSingleByClient($person->getClient());
if ($config->getNewsletterDeregisterRedirect()) {
return $this->redirect($config->getNewsletterDeregisterRedirect());
}
} else {
$status = 'already_unsubscribed';
}
}
}
/**
* @Route("/", name="newsletter_index", methods="GET")
*/
public function index(
NewsletterRepository $newsletterRepository
): Response {
$newsletter = $newsletterRepository->getAllPaged();
return $this->render('newsletter/index.html.twig', [
'newsletter' => $newsletter->getIterator(),
'total' => $newsletter->count(),
'pages' => ceil($newsletter->count() / self::LISTING_LIMIT),
'page' => 1,
]);
}
/**
* @Route("/{page}/{orderby}/{order}", name="newsletter_index_listing", methods="GET", requirements={"page"="\d+", "order"="asc|desc"})
*/
public function indexListing(
NewsletterRepository $newsletterRepo,
$page,
$orderby,
$order
): Response {
$newsletter = $newsletterRepo->getAllPaged(self::LISTING_LIMIT, $page);
return $this->render('newsletter/_index_listing.html.twig', [
'newsletter' => $newsletter->getIterator(),
'total' => $newsletter->count(),
'pages' => ceil($newsletter->count() / self::LISTING_LIMIT),
'page' => $page,
]);
}
/**
* @Route("/create", name="new_newsletter_without_client", methods="POST")
*/
public function registerNewsletterWithoutClient(
Request $request,
TokenGeneratorInterface $generator,
NewsletterRepository $newsletterRepository,
MailerService $mailer,
Connection $connection
) {
$email = $request->request->get('email');
if (is_null($email)) {
return $this->json([
'success' => false,
'error' => "E-Mail Adresse muss ausgefüllt sein.",
], Response::HTTP_BAD_REQUEST);
}
$this->moment = new \DateTime();
$alreadyAsked = $newsletterRepository->getAlreadyAsked($this->moment, $email);
$alreadyOrdered = $newsletterRepository->getAlreadyOrdered($email);
$sql = "
SELECT email
FROM client";
$stmt = $connection->prepare($sql);
$stmt->execute();
$emailFrom = $stmt->fetchAll()[0]['email'];
if (!empty($alreadyAsked) || !empty($alreadyOrdered)) {
return $this->json([
'success' => false,
'error' => "Sie haben sich bereits zum Newsletter angemeldet",
], Response::HTTP_BAD_REQUEST);
}
$em = $this->getDoctrine()->getManager();
$newsletter = new Newsletter();
$newsletter->setEmail($email);
$newsletter->setActivateToken(
$generator->generateToken()
);
$newsletter->setActivated(false);
$newsletter->setKeyExpired(
$this->moment->add(new \DateInterval('P1D'))
);
$em->persist($newsletter);
$em->flush();
$url = null;
$url = $this->generateUrl(
'activate_newsletter_without_client',
['token' => $newsletter->getActivateToken()],
UrlGeneratorInterface::ABSOLUTE_URL
);
$mailer->sendNewsletterActivateMessage(
$emailFrom,
$url,
$newsletter->getEmail(),
);
return $this->json([
'success' => true,
'text' => "Sie erhalten in Kürze eine E-Mail.",
], Response::HTTP_OK);
}
/**
* @Route("/activate", name="activate_newsletter_without_client", methods="GET")
*/
public function activateNewsletterWithoutClient(
Request $request,
NewsletterRepository $newsletterRepository
) {
$token = $request->get('token');
if (is_null($token)) {
return $this->json([
'success' => false,
'error' => "Der Token muss gesetzt sein.",
], Response::HTTP_BAD_REQUEST);
}
$customer = $newsletterRepository->activateIfNotExpired($token, $this->moment);
if ($customer) {
$em = $this->getDoctrine()->getManager();
$customer->setActivated(true);
$customer->setEmailConfirmedAt(new \DateTime());
$em->persist($customer);
$em->flush();
return $this->render('/user/email_confirm.html.twig', [
'confirmed' => "Sie haben Ihre E-Mail Adresse erfolgreich bestätigt.",
'newsletter' => '1',
]);
//
// return $this->json([
// 'success' => true,
// 'error' => "Sie haben Ihre E-Mail Adresse erfolgreich bestätigt.",
// ], Response::HTTP_BAD_REQUEST);
} else {
return $this->render('/user/email_confirm.html.twig', [
'error' => "Der Token ist ungültig oder abgelaufen.",
'newsletter' => '1',
]);
// return $this->json([
// 'success' => false,
// 'error' => "Der Token ist ungültig oder abgelaufen.",
// ], Response::HTTP_BAD_REQUEST);
}
}
/**
* @Route("/delete", name="delete_newsletter_without_client", methods="GET")
*/
public function deleteNewsletter(
Request $request,
NewsletterRepository $newsletterRepository
) {
$email = $request->get('email');
$case = $request->get('case');
$newsletterRepository->deleteCustomerEntries($email);
if($case != 'backend'){
return $this->render('/user/email_confirm.html.twig', [
'confirmed' => "Ihr Eintrag wurde erfolgreich gelöscht.",
'newsletter' => '1',
]);}
else {
$newsletter = $newsletterRepository->getAllPaged();
return $this->render('newsletter/index.html.twig', [
'newsletter' => $newsletter->getIterator(),
'total' => $newsletter->count(),
'pages' => ceil($newsletter->count() / self::LISTING_LIMIT),
'page' => 1,
]);
// return $this->json([
// 'success' => true,
// 'error' => "Ihr Eintrag wurde erfolgreich gelöscht.",
// ], Response::HTTP_BAD_REQUEST);
}}
/**
* @Route("/subscribe", name="subscribe_newsletter_set_by_admin", methods="GET")
*
* If an admin set the Newsletter for each user, then he get an email.
* Click on "OK" Button lands here and activate the Newsletter.
*/
public function verifiyNewsletterSubscription(
Request $request,
ManualNewsletterRepository $manualNewsletterRepo,
ClientConfigRepository $clientConfigRepo,
) {
$token = $request->get('token');
if (is_null($token)) {
return $this->json([
'success' => false,
'error' => "Der Token muss gesetzt sein.",
], Response::HTTP_BAD_REQUEST);
}
$manualNewsletter = $manualNewsletterRepo->findEntry($token, $this->moment);
$em = $this->getDoctrine()->getManager();
if ($manualNewsletter) {
$person = $manualNewsletter->getPerson();
$manualNewsletter->setActivated(true);
$manualNewsletter->setEmailConfirmedAt($this->moment);
$em->persist($manualNewsletter);
$person->setReceiveNewsletter(true);
$em->persist($person);
}
$em->flush();
$config = $clientConfigRepo->getSingleByClient($person->getClient());
/* if ($config->getNewsletterDeregisterRedirect()) {
return $this->redirect($config->getNewsletterDeregisterRedirect());
}
*/
return $this->json([
'success' => true,
'message' => "newsletter erfolgreich verifiziert",
], Response::HTTP_BAD_REQUEST);
}
}