<?php
namespace App\Controller;
use App\Constant\BandTypeConstant;
use App\Constant\FileActionConstant;
use App\Constant\RegisterTypeConstant;
use App\Constant\SeoCityConstant;
use App\Entity\BandMember;
use App\Repository\UserRepository;
use App\Services\CurlHttpClient;
use App\Services\SeoManager;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Constant\FileTypeConstant;
use App\Constant\ReportStatusConstant;
use App\Entity\Band;
use App\Entity\File;
use App\Entity\FileReport;
use App\Entity\Picture;
use App\Entity\User;
use App\Form\ContactType;
use App\Repository\BandRepository;
use App\Repository\FileRepository;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Contracts\Translation\TranslatorInterface;
class ManagementController extends WhiplayController
{
const HOME_ROUTE = 'whiplay_home';
private $MAX_RESULTS = 1000;
/**
* Show contact form in order to send mail to Whiplay team
*
* @param Request $request
* @param TranslatorInterface $translator
* @param SeoManager $seoManager
* @param CurlHttpClient $httpClient
* @param MailerInterface $mailer
* @return Response
*/
public function contact(
Request $request,
TranslatorInterface $translator,
SeoManager $seoManager,
CurlHttpClient $httpClient,
MailerInterface $mailer
): Response {
$seoManager
->setTitleAndDescription('management.contact.seo.title', 'management.contact.seo.description')
->useLogo();
$emailDefault = "";
$lastNameDefault = "";
/** @var User $user */
$user = $this->getUser();
if ($user instanceof User) {
$emailDefault = $user->getEmail();
$lastNameDefault = $user->getlastName();
}
$form = $this->createForm(ContactType::class, array(
'email' => $emailDefault,
'name' => $lastNameDefault
));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = array(
'secret' => "0xA9e155ba26Ea705ec9A893B7553fd1Ac1Cd8b96A",
'response' => $request->request->get('h-captcha-response')
);
$response = $httpClient->post("https://hcaptcha.com/siteverify", $data, false);
$captchaData = json_decode($response);
if ($captchaData->success) {
$contactMessage = (new TemplatedEmail())
->from( new Address('contact@whiplay.fr', $translator->trans('management.contact.mail.from')))
->to('contact.whiplay@gmail.com')
->subject($translator->trans('management.contact.mail.subject'))
->htmlTemplate('Mail/contact.html.twig')
->context([
'data' => $form->getData()
]);
$mailer->send($contactMessage);
$this->addFlash(
'notice',
$this->get('translator')->trans('management.contact.mail.sent')
);
$request->setMethod('GET');
return $this->ajaxForward($request, 'whiplay_management_contact');
}
}
return $this->render('Management/contact.html.twig', array(
'form' => $form->createView(),
));
}
/**
* Show file reports (only reports added by current user or all reports if user is admin)
*
* @param Request $request
* @return Response
*/
public function reports(Request $request): Response
{
/** @var User $user */
$user = $this->getUser();
if (!($user instanceof User)) {
return $this->ajaxForward($request, self::HOME_ROUTE);
}
$waitingReports = $this->getDoctrine()
->getRepository(FileReport::class)
->findBy(array('status' => ReportStatusConstant::WAITING), array('createdAt' => 'DESC'));
$mostReportedUsers = $this->getDoctrine()
->getRepository(FileReport::class)
->createQueryBuilder('file_report')
->select('COUNT(file_report.id) AS reportsNumber')
->addSelect('user.firstName, user.lastName, user.username')
->innerJoin('file_report.file', 'file')
->innerJoin('file.fileActions', 'add_action')
->innerJoin('add_action.user', 'user')
->andWhere('add_action.action = :add_action_value')
->andWhere('file_report.status = :reportAcceptedStatus OR file_report.status = :reportWaitingStatus')
->setParameter('add_action_value', FileActionConstant::ADD)
->setParameter('reportWaitingStatus', ReportStatusConstant::WAITING)
->setParameter('reportAcceptedStatus', ReportStatusConstant::ACCEPTED)
->groupBy('user.id')
->orderBy('reportsNumber', 'DESC')
->setMaxResults(10)
->getQuery()
->getResult();
return $this->render('Management/reports.html.twig', array(
'waitingReports' => $waitingReports,
'mostReportedUsers' => $mostReportedUsers,
));
}
/**
* Update file report status based on $status (ReportStatusConstant)
*
* @param Request $request
* @param TranslatorInterface $translator
* @param MailerInterface $mailer
* @param FileReport $fileReport
* @param $status
* @return Response
*/
public function updateReportStatus(
Request $request,
TranslatorInterface $translator,
MailerInterface $mailer,
FileReport $fileReport,
$status
): Response {
/** @var User $user */
$user = $this->getUser();
if (!($user instanceof User)) {
return $this->ajaxForward($request, self::HOME_ROUTE);
}
/** @var User $user */
$user = $this->getUser();
if (in_array($status, ReportStatusConstant::getValues()) && $user->hasRole('ROLE_ADMIN')) {
$em = $this->getDoctrine()->getManager();
$fileReport->setStatus($status);
if ($status === ReportStatusConstant::ACCEPTED) {
if ($fileReport->getFile()->getPublishAction()) {
$em->remove($fileReport->getFile()->getPublishAction());
}
$fileReport->getFile()->setDeleted(true);
$em->persist($fileReport->getFile());
}
$em->persist($fileReport);
$em->flush();
$recipients = array($fileReport->getEmail());
if ($fileReport->getFile()->getCreatedBy()) {
$recipients[] = $fileReport->getFile()->getCreatedBy()->getEmail();
}
$reportMail = (new TemplatedEmail())
->from( new Address('reports@whiplay.fr', $translator->trans('management.report.updated.from')))
->to(...$recipients)
->subject($translator->trans('management.report.updated.subject'))
->htmlTemplate('Mail/treatedReport.html.twig')
->context([
'report' => $fileReport
]);
$mailer->send($reportMail);
}
return $this->ajaxForward($request, 'whiplay_management_reports');
}
/**
* Show terms of service for Whiplay
*
* @param SeoManager $seoManager
* @return Response
*/
public function termsOfService(SeoManager $seoManager): Response
{
$seoManager
->setTitleAndDescription('management.tos.seo.title', 'management.tos.seo.description')
->useLogo();
return $this->render('Management/generalConditionUse.html.twig');
}
/**
* Show Whiplay team information
*
* @param SeoManager $seoManager
* @return Response
*/
public function team(SeoManager $seoManager): Response
{
$seoManager
->setTitleAndDescription('management.team.seo.title', 'management.team.seo.description')
->useLogo();
$userCreators = $this->getDoctrine()
->getRepository(User::class)
->findBy(array('username' => array('Mistik', 'xdidx')));
return $this->render('Management/team.html.twig', array(
'users' => $userCreators,
));
}
/**
* Show Whiplay copyright information
*
* @param SeoManager $seoManager
* @return Response
*/
public function copyright(SeoManager $seoManager): Response
{
$seoManager
->setTitleAndDescription('management.copyright.seo.title', 'management.copyright.seo.description')
->useLogo();
return $this->render('Management/copyright.html.twig');
}
/**
* Show privacy policy information
*
* @param SeoManager $seoManager
* @return Response
*/
public function privacyPolicy(SeoManager $seoManager): Response
{
$seoManager
->setTitleAndDescription('management.privacy.seo.title', 'management.privacy.seo.description')
->useLogo();
return $this->render('Management/privacyPolicy.html.twig');
}
/**
* Show legal notice information
*
* @param SeoManager $seoManager
* @return Response
*/
public function legalNotice(SeoManager $seoManager): Response
{
$seoManager
->setTitleAndDescription('management.legal.seo.title', 'management.legal.seo.description')
->useLogo();
return $this->render('Management/legalNotice.html.twig');
}
/**
* Generate a dynamic sitemap based on static pages and database data
*
* @param Request $request
* @param TranslatorInterface $translator
* @return Response
*/
public function sitemap(Request $request, TranslatorInterface $translator): Response
{
$hostname = $request->getSchemeAndHttpHost();
$simpleRoutes = [
self::HOME_ROUTE,
'whiplay_search',
'whiplay_bands_offers',
'whiplay_band_register',
'app_login',
'app_register',
'whiplay_article_list',
'whiplay_article_search_new_band',
'whiplay_article_register_band'
];
$urls = [];
foreach ($simpleRoutes as $route) {
$urls[] = ['loc' => $this->generateUrl($route)];
}
$urls[] = [
'loc' => $this->generateUrl(
'app_register',
['registerType' => RegisterTypeConstant::REGISTER_TYPE_BAND]
)
];
// Search new band article with all cities
$cities = SeoCityConstant::getValues();
foreach ($cities as $city) {
$urls[] = ['loc' => $this->generateUrl('whiplay_article_search_new_band', array('city' => $city))];
}
$title = 'title';
$image = 'image';
$bandFileRoute = 'whiplay_band_files';
$defaultPlayerImage = 'images/player/player-default.jpg';
/** @var BandRepository $bandRepository */
$bandRepository = $this->getDoctrine()->getRepository(Band::class);
/** @var Band[] $bands */
$bands = array_filter($bandRepository->findAll(), function($band) {
return $band->getType() !== BandTypeConstant::USER_COLLABORATION;
});
foreach ($bands as $band) {
$picture = $band->getCommonInformation()->getProfilePicture();
$imageUrl = ($picture instanceof Picture) ?
$picture->getWebPath() :
$defaultPlayerImage;
$images = [
'loc' => '/'.$imageUrl,
$title => $translator->trans('management.sitemap.band_image', ['band_name' => $band->getName()])
];
$urls[] = [
'loc' => $this->generateUrl('whiplay_band_show', [
'id' => $band->getId(),
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl($bandFileRoute, [
'id' => $band->getId(),
'type' => FileTypeConstant::MUSIC
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl($bandFileRoute, [
'id' => $band->getId(),
'type' => FileTypeConstant::VIDEO
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl($bandFileRoute, [
'id' => $band->getId(),
'type' => FileTypeConstant::PICTURE
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl('whiplay_band_events', [
'id' => $band->getId()
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl('whiplay_band_offers', [
'id' => $band->getId()
]),
$image => $images
];
/** @var BandMember $bandMember */
foreach ($band->getMembers(false) as $bandMember) {
$urls[] = [
'loc' => $this->generateUrl('whiplay_bandmember_show', [
'id' => $bandMember->getId()
]),
$image => $images
];
}
}
/** @var UserRepository $userRepository */
$userRepository = $this->getDoctrine()->getRepository(User::class);
/** @var User $user */
foreach ($userRepository->findAll() as $user) {
$picture = $user->getCommonInformation()->getProfilePicture();
$imageUrl = ($picture instanceof Picture) ?
$picture->getWebPath() :
$defaultPlayerImage;
$images = [
'loc' => '/'.$imageUrl,
$title => $translator->trans('management.sitemap.user_image', ['user_name' => $user->getUsername()])
];
$urls[] = [
'loc' => $this->generateUrl('user_profile_show', [
'id' => $user->getId(),
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl('whiplay_user_likes', [
'id' => $user->getId(),
]),
$image => $images
];
$urls[] = [
'loc' => $this->generateUrl('whiplay_user_subscriptions', [
'id' => $user->getId(),
]),
$image => $images
];
}
/** @var FileRepository $fileRepository */
$fileRepository = $this->getDoctrine()->getRepository(File::class);
$musics = $fileRepository->findLastPublicFromType(FileTypeConstant::MUSIC, $this->MAX_RESULTS);
$videos = $fileRepository->findLastPublicFromType(FileTypeConstant::VIDEO, $this->MAX_RESULTS);
$files = array_merge($musics, $videos);
/** @var File $file */
foreach ($files as $file) {
$imageUrl = ($file->getPicture() instanceof Picture) ?
$file->getPicture()->getWebPath() :
$defaultPlayerImage;
$images = [
'loc' => '/'.$imageUrl,
$title => $translator->trans('management.sitemap.music_image', ['music_name' => $file->getName()])
];
$urls[] = [
'loc' => $this->generateUrl('whiplay_file_show', [
'id' => $file->getId(),
]),
'lastmod' => $file->getCreatedAt()->format('Y-m-d'),
$image => $images
];
}
$response = new Response(
$this->renderView('Management/sitemap.html.twig', ['urls' => $urls,
'hostname' => $hostname]),
200
);
$response->headers->set('Content-Type', 'text/xml');
return $response;
}
}