src/Controller/ManagementController.php line 250

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Constant\BandTypeConstant;
  4. use App\Constant\FileActionConstant;
  5. use App\Constant\RegisterTypeConstant;
  6. use App\Constant\SeoCityConstant;
  7. use App\Entity\BandMember;
  8. use App\Repository\UserRepository;
  9. use App\Services\CurlHttpClient;
  10. use App\Services\SeoManager;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use App\Constant\FileTypeConstant;
  15. use App\Constant\ReportStatusConstant;
  16. use App\Entity\Band;
  17. use App\Entity\File;
  18. use App\Entity\FileReport;
  19. use App\Entity\Picture;
  20. use App\Entity\User;
  21. use App\Form\ContactType;
  22. use App\Repository\BandRepository;
  23. use App\Repository\FileRepository;
  24. use Symfony\Component\Mailer\MailerInterface;
  25. use Symfony\Component\Mime\Address;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. class ManagementController extends WhiplayController
  28. {
  29.     const HOME_ROUTE 'whiplay_home';
  30.     private $MAX_RESULTS 1000;
  31.     /**
  32.      * Show contact form in order to send mail to Whiplay team
  33.      *
  34.      * @param Request $request
  35.      * @param TranslatorInterface $translator
  36.      * @param SeoManager $seoManager
  37.      * @param CurlHttpClient $httpClient
  38.      * @param MailerInterface $mailer
  39.      * @return Response
  40.      */
  41.     public function contact(
  42.         Request $request,
  43.         TranslatorInterface $translator,
  44.         SeoManager $seoManager,
  45.         CurlHttpClient $httpClient,
  46.         MailerInterface $mailer
  47.     ): Response {
  48.         $seoManager
  49.             ->setTitleAndDescription('management.contact.seo.title''management.contact.seo.description')
  50.             ->useLogo();
  51.         $emailDefault "";
  52.         $lastNameDefault "";
  53.         /** @var User $user */
  54.         $user $this->getUser();
  55.         if ($user instanceof User) {
  56.             $emailDefault =  $user->getEmail();
  57.             $lastNameDefault =  $user->getlastName();
  58.         }
  59.         $form $this->createForm(ContactType::class, array(
  60.             'email' => $emailDefault,
  61.             'name' => $lastNameDefault
  62.         ));
  63.         $form->handleRequest($request);
  64.         if ($form->isSubmitted() && $form->isValid()) {
  65.             $data = array(
  66.                 'secret' => "0xA9e155ba26Ea705ec9A893B7553fd1Ac1Cd8b96A",
  67.                 'response' => $request->request->get('h-captcha-response')
  68.             );
  69.             $response $httpClient->post("https://hcaptcha.com/siteverify"$datafalse);
  70.             $captchaData json_decode($response);
  71.             if ($captchaData->success) {
  72.                 $contactMessage = (new TemplatedEmail())
  73.                     ->from( new Address('contact@whiplay.fr'$translator->trans('management.contact.mail.from')))
  74.                     ->to('contact.whiplay@gmail.com')
  75.                     ->subject($translator->trans('management.contact.mail.subject'))
  76.                     ->htmlTemplate('Mail/contact.html.twig')
  77.                     ->context([
  78.                         'data' => $form->getData()
  79.                     ]);
  80.                 $mailer->send($contactMessage);
  81.                 $this->addFlash(
  82.                     'notice',
  83.                     $this->get('translator')->trans('management.contact.mail.sent')
  84.                 );
  85.                 $request->setMethod('GET');
  86.                 return $this->ajaxForward($request'whiplay_management_contact');
  87.             }
  88.         }
  89.         return $this->render('Management/contact.html.twig', array(
  90.             'form' => $form->createView(),
  91.         ));
  92.     }
  93.     /**
  94.      * Show file reports (only reports added by current user or all reports if user is admin)
  95.      *
  96.      * @param Request $request
  97.      * @return Response
  98.      */
  99.     public function reports(Request $request): Response
  100.     {
  101.         /** @var User $user */
  102.         $user $this->getUser();
  103.         if (!($user instanceof User)) {
  104.             return $this->ajaxForward($requestself::HOME_ROUTE);
  105.         }
  106.         $waitingReports $this->getDoctrine()
  107.             ->getRepository(FileReport::class)
  108.             ->findBy(array('status' => ReportStatusConstant::WAITING), array('createdAt' => 'DESC'));
  109.         $mostReportedUsers $this->getDoctrine()
  110.             ->getRepository(FileReport::class)
  111.             ->createQueryBuilder('file_report')
  112.             ->select('COUNT(file_report.id) AS reportsNumber')
  113.             ->addSelect('user.firstName, user.lastName, user.username')
  114.             ->innerJoin('file_report.file''file')
  115.             ->innerJoin('file.fileActions''add_action')
  116.             ->innerJoin('add_action.user''user')
  117.             ->andWhere('add_action.action = :add_action_value')
  118.             ->andWhere('file_report.status = :reportAcceptedStatus OR file_report.status = :reportWaitingStatus')
  119.             ->setParameter('add_action_value'FileActionConstant::ADD)
  120.             ->setParameter('reportWaitingStatus'ReportStatusConstant::WAITING)
  121.             ->setParameter('reportAcceptedStatus'ReportStatusConstant::ACCEPTED)
  122.             ->groupBy('user.id')
  123.             ->orderBy('reportsNumber''DESC')
  124.             ->setMaxResults(10)
  125.             ->getQuery()
  126.             ->getResult();
  127.         return $this->render('Management/reports.html.twig', array(
  128.             'waitingReports' => $waitingReports,
  129.             'mostReportedUsers' => $mostReportedUsers,
  130.         ));
  131.     }
  132.     /**
  133.      * Update file report status based on $status (ReportStatusConstant)
  134.      *
  135.      * @param Request $request
  136.      * @param TranslatorInterface $translator
  137.      * @param MailerInterface $mailer
  138.      * @param FileReport $fileReport
  139.      * @param $status
  140.      * @return Response
  141.      */
  142.     public function updateReportStatus(
  143.         Request $request,
  144.         TranslatorInterface $translator,
  145.         MailerInterface $mailer,
  146.         FileReport $fileReport,
  147.         $status
  148.     ): Response {
  149.         /** @var User $user */
  150.         $user $this->getUser();
  151.         if (!($user instanceof User)) {
  152.             return $this->ajaxForward($requestself::HOME_ROUTE);
  153.         }
  154.         /** @var User $user */
  155.         $user $this->getUser();
  156.         if (in_array($statusReportStatusConstant::getValues()) && $user->hasRole('ROLE_ADMIN')) {
  157.             $em $this->getDoctrine()->getManager();
  158.             $fileReport->setStatus($status);
  159.             if ($status === ReportStatusConstant::ACCEPTED) {
  160.                 if ($fileReport->getFile()->getPublishAction()) {
  161.                     $em->remove($fileReport->getFile()->getPublishAction());
  162.                 }
  163.                 $fileReport->getFile()->setDeleted(true);
  164.                 $em->persist($fileReport->getFile());
  165.             }
  166.             $em->persist($fileReport);
  167.             $em->flush();
  168.             $recipients = array($fileReport->getEmail());
  169.             if ($fileReport->getFile()->getCreatedBy()) {
  170.                 $recipients[] = $fileReport->getFile()->getCreatedBy()->getEmail();
  171.             }
  172.             $reportMail = (new TemplatedEmail())
  173.                 ->from( new Address('reports@whiplay.fr'$translator->trans('management.report.updated.from')))
  174.                 ->to(...$recipients)
  175.                 ->subject($translator->trans('management.report.updated.subject'))
  176.                 ->htmlTemplate('Mail/treatedReport.html.twig')
  177.                 ->context([
  178.                     'report' => $fileReport
  179.                 ]);
  180.             $mailer->send($reportMail);
  181.         }
  182.         return $this->ajaxForward($request'whiplay_management_reports');
  183.     }
  184.     /**
  185.      * Show terms of service for Whiplay
  186.      *
  187.      * @param SeoManager $seoManager
  188.      * @return Response
  189.      */
  190.     public function termsOfService(SeoManager $seoManager): Response
  191.     {
  192.         $seoManager
  193.             ->setTitleAndDescription('management.tos.seo.title''management.tos.seo.description')
  194.             ->useLogo();
  195.         return $this->render('Management/generalConditionUse.html.twig');
  196.     }
  197.     /**
  198.      * Show Whiplay team information
  199.      *
  200.      * @param SeoManager $seoManager
  201.      * @return Response
  202.      */
  203.     public function team(SeoManager $seoManager): Response
  204.     {
  205.         $seoManager
  206.             ->setTitleAndDescription('management.team.seo.title''management.team.seo.description')
  207.             ->useLogo();
  208.         $userCreators $this->getDoctrine()
  209.             ->getRepository(User::class)
  210.             ->findBy(array('username' => array('Mistik''xdidx')));
  211.         return $this->render('Management/team.html.twig', array(
  212.             'users' => $userCreators,
  213.         ));
  214.     }
  215.     /**
  216.      * Show Whiplay copyright information
  217.      *
  218.      * @param SeoManager $seoManager
  219.      * @return Response
  220.      */
  221.     public function copyright(SeoManager $seoManager): Response
  222.     {
  223.         $seoManager
  224.             ->setTitleAndDescription('management.copyright.seo.title''management.copyright.seo.description')
  225.             ->useLogo();
  226.         return $this->render('Management/copyright.html.twig');
  227.     }
  228.     /**
  229.      * Show privacy policy information
  230.      *
  231.      * @param SeoManager $seoManager
  232.      * @return Response
  233.      */
  234.     public function privacyPolicy(SeoManager $seoManager): Response
  235.     {
  236.         $seoManager
  237.             ->setTitleAndDescription('management.privacy.seo.title''management.privacy.seo.description')
  238.             ->useLogo();
  239.         return $this->render('Management/privacyPolicy.html.twig');
  240.     }
  241.     /**
  242.      * Show legal notice information
  243.      *
  244.      * @param SeoManager $seoManager
  245.      * @return Response
  246.      */
  247.     public function legalNotice(SeoManager $seoManager): Response
  248.     {
  249.         $seoManager
  250.             ->setTitleAndDescription('management.legal.seo.title''management.legal.seo.description')
  251.             ->useLogo();
  252.         return $this->render('Management/legalNotice.html.twig');
  253.     }
  254.     /**
  255.      * Generate a dynamic sitemap based on static pages and database data
  256.      *
  257.      * @param Request $request
  258.      * @param TranslatorInterface $translator
  259.      * @return Response
  260.      */
  261.     public function sitemap(Request $requestTranslatorInterface $translator): Response
  262.     {
  263.         $hostname $request->getSchemeAndHttpHost();
  264.         $simpleRoutes = [
  265.             self::HOME_ROUTE,
  266.             'whiplay_search',
  267.             'whiplay_bands_offers',
  268.             'whiplay_band_register',
  269.             'app_login',
  270.             'app_register',
  271.             'whiplay_article_list',
  272.             'whiplay_article_search_new_band',
  273.             'whiplay_article_register_band'
  274.         ];
  275.         $urls = [];
  276.         foreach ($simpleRoutes as $route) {
  277.             $urls[] = ['loc' => $this->generateUrl($route)];
  278.         }
  279.         $urls[] = [
  280.             'loc' => $this->generateUrl(
  281.                 'app_register',
  282.                 ['registerType' => RegisterTypeConstant::REGISTER_TYPE_BAND]
  283.             )
  284.         ];
  285.         // Search new band article with all cities
  286.         $cities SeoCityConstant::getValues();
  287.         foreach ($cities as $city) {
  288.             $urls[] = ['loc' => $this->generateUrl('whiplay_article_search_new_band', array('city' => $city))];
  289.         }
  290.         $title 'title';
  291.         $image 'image';
  292.         $bandFileRoute 'whiplay_band_files';
  293.         $defaultPlayerImage 'images/player/player-default.jpg';
  294.         /** @var BandRepository $bandRepository */
  295.         $bandRepository $this->getDoctrine()->getRepository(Band::class);
  296.         /** @var Band[] $bands */
  297.         $bands array_filter($bandRepository->findAll(), function($band) {
  298.             return $band->getType() !== BandTypeConstant::USER_COLLABORATION;
  299.         });
  300.         foreach ($bands as $band) {
  301.             $picture $band->getCommonInformation()->getProfilePicture();
  302.             $imageUrl = ($picture instanceof Picture) ?
  303.                 $picture->getWebPath() :
  304.                 $defaultPlayerImage;
  305.             $images = [
  306.                 'loc' => '/'.$imageUrl,
  307.                 $title => $translator->trans('management.sitemap.band_image', ['band_name' => $band->getName()])
  308.             ];
  309.             $urls[] = [
  310.                 'loc' => $this->generateUrl('whiplay_band_show', [
  311.                     'id' => $band->getId(),
  312.                 ]),
  313.                 $image => $images
  314.             ];
  315.             $urls[] = [
  316.                 'loc' => $this->generateUrl($bandFileRoute, [
  317.                     'id' => $band->getId(),
  318.                     'type' => FileTypeConstant::MUSIC
  319.                 ]),
  320.                 $image => $images
  321.             ];
  322.             $urls[] = [
  323.                 'loc' => $this->generateUrl($bandFileRoute, [
  324.                     'id' => $band->getId(),
  325.                     'type' => FileTypeConstant::VIDEO
  326.                 ]),
  327.                 $image => $images
  328.             ];
  329.             $urls[] = [
  330.                 'loc' => $this->generateUrl($bandFileRoute, [
  331.                     'id' => $band->getId(),
  332.                     'type' => FileTypeConstant::PICTURE
  333.                 ]),
  334.                 $image => $images
  335.             ];
  336.             $urls[] = [
  337.                 'loc' => $this->generateUrl('whiplay_band_events', [
  338.                     'id' => $band->getId()
  339.                 ]),
  340.                 $image => $images
  341.             ];
  342.             $urls[] = [
  343.                 'loc' => $this->generateUrl('whiplay_band_offers', [
  344.                     'id' => $band->getId()
  345.                 ]),
  346.                 $image => $images
  347.             ];
  348.             /** @var BandMember $bandMember */
  349.             foreach ($band->getMembers(false) as $bandMember) {
  350.                 $urls[] = [
  351.                     'loc' => $this->generateUrl('whiplay_bandmember_show', [
  352.                         'id' => $bandMember->getId()
  353.                     ]),
  354.                     $image => $images
  355.                 ];
  356.             }
  357.         }
  358.         /** @var UserRepository $userRepository */
  359.         $userRepository $this->getDoctrine()->getRepository(User::class);
  360.         /** @var User $user */
  361.         foreach ($userRepository->findAll() as $user) {
  362.             $picture $user->getCommonInformation()->getProfilePicture();
  363.             $imageUrl = ($picture instanceof Picture) ?
  364.                 $picture->getWebPath() :
  365.                 $defaultPlayerImage;
  366.             $images = [
  367.                 'loc' => '/'.$imageUrl,
  368.                 $title => $translator->trans('management.sitemap.user_image', ['user_name' => $user->getUsername()])
  369.             ];
  370.             $urls[] = [
  371.                 'loc' => $this->generateUrl('user_profile_show', [
  372.                     'id' => $user->getId(),
  373.                 ]),
  374.                 $image => $images
  375.             ];
  376.             $urls[] = [
  377.                 'loc' => $this->generateUrl('whiplay_user_likes', [
  378.                     'id' => $user->getId(),
  379.                 ]),
  380.                 $image => $images
  381.             ];
  382.             $urls[] = [
  383.                 'loc' => $this->generateUrl('whiplay_user_subscriptions', [
  384.                     'id' => $user->getId(),
  385.                 ]),
  386.                 $image => $images
  387.             ];
  388.         }
  389.         /** @var FileRepository $fileRepository */
  390.         $fileRepository $this->getDoctrine()->getRepository(File::class);
  391.         $musics $fileRepository->findLastPublicFromType(FileTypeConstant::MUSIC$this->MAX_RESULTS);
  392.         $videos $fileRepository->findLastPublicFromType(FileTypeConstant::VIDEO$this->MAX_RESULTS);
  393.         $files array_merge($musics$videos);
  394.         /** @var File $file */
  395.         foreach ($files as $file) {
  396.             $imageUrl = ($file->getPicture() instanceof Picture) ?
  397.                 $file->getPicture()->getWebPath() :
  398.                 $defaultPlayerImage;
  399.             $images = [
  400.                 'loc' => '/'.$imageUrl,
  401.                 $title => $translator->trans('management.sitemap.music_image', ['music_name' => $file->getName()])
  402.             ];
  403.             $urls[] = [
  404.                 'loc' => $this->generateUrl('whiplay_file_show', [
  405.                     'id' => $file->getId(),
  406.                 ]),
  407.                 'lastmod' => $file->getCreatedAt()->format('Y-m-d'),
  408.                 $image => $images
  409.             ];
  410.         }
  411.         $response = new Response(
  412.             $this->renderView('Management/sitemap.html.twig', ['urls' => $urls,
  413.                 'hostname' => $hostname]),
  414.             200
  415.         );
  416.         $response->headers->set('Content-Type''text/xml');
  417.         return $response;
  418.     }
  419. }