/
var
/
www
/
html
/
restaurants
/
src
/
Controller
/
Upload File
HOME
<?php namespace App\Controller; use App\Document\Place as PlaceDocument; use App\Document\Item as ItemDocument; use Knp\Component\Pager\PaginatorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use App\Document\User as UserDocument; use App\Service\MailgunTransport; use Doctrine\ODM\MongoDB\DocumentManager; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class AdminController extends AbstractController { /** * * @param MailgunTransport $mailgun * @param UrlGeneratorInterface $urlGenerator */ function __construct(MailgunTransport $mailgun, DocumentManager $dm, UrlGeneratorInterface $urlGenerator) { $this->mailgun = $mailgun; $this->urlGenerator = $urlGenerator; $this->dm = $dm; } /** * @Route("/businesses", name="businesses") */ public function index(PaginatorInterface $paginator, Request $request) { $query = $this->dm->getRepository(PlaceDocument::class)->findFirstTen(); $pagination = $paginator->paginate( $query, /* query NOT result */ $request->query->getInt('page', 1), /*page number*/ 10 /*limit per page*/ ); return $this->render('admin/businesses.html.twig', [ 'places_paginated' => $pagination, 'title' => 'Places' ]); } /** * @Route("/admin/business/create", name="business_create", methods={"GET"}) */ public function create(Request $request) { return $this->render('admin/business_create.html.twig'); } /** * @Route("/admin/business/create", name="store", methods={"POST"}) */ public function store(Request $request) { $place = new PlaceDocument; $place->setName($_POST['name']); $place->setAddress($_POST['address']); $slug = $this->slugify($_POST['name']); $place->setSlug($slug); $place->setLocation(array( "type" => "Point", "coordinates" => array(floatval($_POST['longitude']), floatval($_POST['latitude'])) )); $place->setTimes([ "mon" => ["", ""], "tue" => ["", ""], "wed" => ["", ""], "thu" => ["", ""], "fri" => ["", ""], "sat" => ["", ""], "sun" => ["", ""], ]); $place->setPhones($_POST['phone']); $place->setType($_POST['type']); $this->dm->persist($place); $this->dm->flush(); return $this->claim($slug, $_POST['email']); } public function slugify(string $name) { $name = preg_replace('/\/|\'/', "-", $name); $stripped = str_replace(" ", " ", preg_replace('(\/|\(|\))', "", $name)); $slugged = implode("-", explode(" ", strtolower($stripped))); $result = $this->dm->createQueryBuilder(PlaceDocument::class) ->field('slug')->equals($slugged) ->getQuery() ->execute()->toArray(); if (count($result)) { $hash = uniqid(); return $slugged . '-' . $hash; } return $slugged; } /** * @Route("/admin/business/claim/{slug}", name="register", methods={"GET"}) */ public function claimGet(Request $request, $slug) { $place = $this->dm->getRepository(PlaceDocument::class)->findOneBy(['slug' => $slug]); return $this->render('admin/business_start.html.twig', ['slug' => $slug, 'place' => $place]); } public function claim(string $slug, string $email) { $user = new UserDocument(); $place = $this->dm->getRepository(PlaceDocument::class)->findOneBy(['slug' => $slug]); if (!$place){ return false; } $this->dm->createQueryBuilder(PlaceDocument::class) ->updateOne() ->field('slug')->equals($slug) ->field('owner')->set($email) ->getQuery() ->execute(); $this->dm->createQueryBuilder(ItemDocument::class) ->updateMany() ->field('place_slug')->equals($slug) ->field('owner')->set($email) ->getQuery() ->execute(); $token = $this->randomString(10); $user->setEmail($email); $user->setVerification($token); $this->dm->persist($user); $this->dm->flush(); $url = $this->urlGenerator->generate('start_business', ['slug' => $place->getSlug(), 'token' => $token], UrlGeneratorInterface::ABSOLUTE_URL); $messageHtml = $this->composeMessage('email.html.twig', $place, $url); $this->mailgun->send($email, 'Welcome to Cravvings', $messageHtml); return $this->redirectToRoute('businesses'); } /** * [composeMessage description] * @param string $view The view to render * @param string $rand Random string * @param string $subject Email subject */ private function composeMessage($view, $user, $link, $params = []) { $message = $this->renderView( "Users/$view", [ 'name' => $user->getName(), 'params' => $params, 'link' => $link ] ); return $message; } /** * Generate a random string for email verification * @param int $length * @return string **/ private function randomString($length = 32) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } }