<?php
namespace App\Controller;
use App\Constant\BandTypeConstant;
use App\Entity\CommonInformation;
use App\Entity\User;
use App\Services\StatisticManager;
use App\Services\SeoManager;
use App\Services\WebhookManager;
use DateTime;
use Symfony\Component\HttpFoundation\Request;
use App\Constant\AjaxLoadingLimitConstant;
use App\Constant\BandMemberRoleConstant;
use App\Constant\PeopleActionConstant;
use App\Constant\ActionStatusConstant;
use App\Constant\FileTypeConstant;
use App\Entity\Band;
use App\Entity\BandMember;
use App\Entity\EventAction;
use App\Entity\File;
use App\Entity\Invitation;
use App\Entity\Folder;
use App\Entity\PeopleAction;
use App\Form\BandType;
use App\Form\CreateEventType;
use App\Form\InvitationType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
const BAND_NAME_TRANS_PARAM = 'band_name';
class BandController extends WhiplayController
{
/**
* Show information about specified band
*
* @param Band $band
* @param Request $request
* @param SeoManager $seoManager
* @return Response
*/
public function show(Band $band, Request $request, SeoManager $seoManager): Response
{
if ($band->getType() === BandTypeConstant::USER_COLLABORATION) {
return $this->ajaxForward($request, 'whiplay_home');
}
$seoManager
->setTitleAndDescription(
'band.show.seo.title',
'band.show.seo.description',
[BAND_NAME_TRANS_PARAM => htmlspecialchars($band->getName())]
)
->useBandLogo($band);
$followBandSubscribers = $band->getSubscribers();
$newInvitation = new Invitation();
$invitationForm = $this->createForm(InvitationType::class, $newInvitation);
return $this->render('Band/show.html.twig', array(
'band' => $band,
'followBandSubscribers' => $followBandSubscribers,
'invitationForm' => $invitationForm->createView(),
));
}
/**
* Show files of specified band depends on specified type (FileTypeConstant)
*
* @param Band $band
* @param Request $request
* @param SeoManager $seoManager
* @param StatisticManager $statisticManager
* @param string $type
* @return Response
*/
public function files(Band $band, Request $request, SeoManager $seoManager, StatisticManager $statisticManager, string $type = ''): Response
{
if ($band->getType() === BandTypeConstant::USER_COLLABORATION) {
return $this->ajaxForward($request, 'whiplay_home');
}
if (!in_array($type, FileTypeConstant::getValues())) {
$type = FileTypeConstant::MUSIC;
}
$seoManager
->setTitleAndDescription(
'band.files.seo.title',
'band.files.seo.description',
[BAND_NAME_TRANS_PARAM => htmlspecialchars($band->getName()), 'type' => $type]
)
->useBandLogo($band);
if ($type == FileTypeConstant::MUSIC) {
$ajaxLoadingLimitNumber = AjaxLoadingLimitConstant::FILE_MUSIC_LIMIT_NUMBER;
} elseif ($type == FileTypeConstant::VIDEO) {
$ajaxLoadingLimitNumber = AjaxLoadingLimitConstant::FILE_VIDEO_LIMIT_NUMBER;
} else {
$ajaxLoadingLimitNumber = AjaxLoadingLimitConstant::FILE_PICTURE_LIMIT_NUMBER;
}
$favoriteFiles = $this
->getDoctrine()
->getRepository(File::class)
->findFavoritesFromBandAndType($band, $type);
$publicMusics = $this
->getDoctrine()
->getRepository(File::class)
->findPublicFromBandAndType($band, $type, $ajaxLoadingLimitNumber);
$totalPublicMusicsCount = count($this
->getDoctrine()
->getRepository(File::class)
->findPublicFromBandAndType($band, $type));
//STATISTIC VIEWS
$statisticManager->addCommonVisit($band->getCommonInformation());
return $this->render('Band/files.html.twig', array(
'band' => $band,
'favoriteFiles' => $favoriteFiles,
'publicFiles' => $publicMusics,
'type' => $type,
'totalPublicMusicsCount' => $totalPublicMusicsCount,
'ajaxLoadingLimitNumber' => $ajaxLoadingLimitNumber,
'baseFolders' => $band->getBaseFolders(),
'selectedType' => $type,
));
}
/**
* Show events list of specified band
*
* @param Band $band
* @param Request $request
* @param SeoManager $seoManager
* @return Response
*/
public function events(Band $band, Request $request, SeoManager $seoManager): Response
{
if ($band->getType() === BandTypeConstant::USER_COLLABORATION) {
return $this->ajaxForward($request, 'whiplay_home');
}
$seoManager
->setTitleAndDescription(
'band.events.seo.title',
'band.events.seo.description',
[BAND_NAME_TRANS_PARAM => $band->getName()]
)
->useBandLogo($band);
/** @var User $user */
$user = $this->getUser();
if (!($user instanceof User)) {
$formCreateEvent = '';
} else {
$formCreateEvents = $this->createForm(CreateEventType::class, new EventAction(), array('userId' => $user->getId(), 'band' => $band));
$formCreateEvent = $formCreateEvents->createView();
}
return $this->render('Band/events.html.twig', array(
'band' => $band,
'formCreateEvent' => $formCreateEvent,
));
}
/**
* Show band member information
*
* @param BandMember $bandMember
* @param Request $request
* @param SeoManager $seoManager
* @return Response
*/
public function memberShow(BandMember $bandMember, Request $request, SeoManager $seoManager): Response
{
if ($bandMember->getBand()->getType() === BandTypeConstant::USER_COLLABORATION) {
return $this->ajaxForward($request, 'whiplay_home');
}
$seoManager
->setTitleAndDescription(
'band.member.seo.title',
'band.member.seo.description',
[
BAND_NAME_TRANS_PARAM => $bandMember->getBand()->getName(),
'user_name' => $bandMember->getUser()->getUsername()
]
)
->useUserLogo($bandMember->getUser());
return $this->render('Band/memberShow.html.twig', array(
'bandMember' => $bandMember
));
}
/**
* Show offers to search musicians link to specified band
*
* @param Band $band
* @param Request $request
* @param SeoManager $seoManager
* @return Response
*/
public function offers(Band $band, Request $request, SeoManager $seoManager): Response
{
if ($band->getType() === BandTypeConstant::USER_COLLABORATION) {
return $this->ajaxForward($request, 'whiplay_home');
}
$seoManager
->setTitleAndDescription(
'band.offers.seo.title',
'band.offers.seo.description',
[BAND_NAME_TRANS_PARAM => htmlspecialchars($band->getName())]
)
->setOgTitleAndDescription(
'band.offers.seo.title',
'band.offers.seo.description',
[BAND_NAME_TRANS_PARAM => htmlspecialchars($band->getName())]
)
->useBandLogo($band);
return $this->render('Band/offers.html.twig', array(
'band' => $band,
));
}
/**
* Show band registration page in order to create a new band
*
* @param Request $request
* @param SeoManager $seoManager
* @param WebhookManager $webhookManager
* @param TranslatorInterface $translator
* @return Response
*/
public function register(
Request $request,
SeoManager $seoManager,
WebhookManager $webhookManager,
TranslatorInterface $translator
): Response {
/** @var User $user */
$user = $this->getUser();
if (!($user instanceof User)) {
return $this->ajaxForward($request, 'app_login');
}
$seoManager
->setTitleAndDescription('band.register.seo.title','band.register.seo.description')
->setNoIndex()
->useLogo();
$band = new Band();
$form = $this->createForm(BandType::class, $band, array('userId' => $user->getId()));
$form->handleRequest($request);
$em = $this->getDoctrine()->getManager();
if ($form->isSubmitted() && $form->isValid()) {
if (!$band->getCommonInformation()){
$band->setCommonInformation(new CommonInformation());
}
$band->getCommonInformation()->setInscriptionDate(new DateTime());
$band->setCreator($user);
$member = new BandMember();
$member->setUser($user);
$member->setRole(BandMemberRoleConstant::LEADER);
$band->addMember($member);
$em->persist($band);
foreach ($band->getMembers() as $bandMember) {
$bandMember->setBand($band);
}
$em->flush();
$this->createDefaultFolders($band, $translator);
$webhookManager->sendNewBandOnDiscord($band);
return $this->render('Band/registerConfirmed.html.twig', array(
'id' => $band->getId(),
'band' => $band,
));
}
return $this->render('Band/register.html.twig', array(
'form' => $form->createView(),
));
}
/**
* Api method to fetch files from band
* lastId get parameter define from which id actions will be fetched
*
* @param Request $request
* @param Band $band
* @param $type
* @return JsonResponse|Response
*/
public function filesApi(Request $request, Band $band, $type)
{
if (!$request->isXmlHttpRequest()) {
return new Response('Forbidden', Response::HTTP_BAD_REQUEST);
}
$lastId = $request->get('lastId') ? $request->get('lastId') : 0;
$ajaxLoadingLimitNumber = AjaxLoadingLimitConstant::getConstantFromType($type);
$publicMusics = $this
->getDoctrine()
->getRepository(File::class)
->findPublicFromBandAndType($band, $type, $ajaxLoadingLimitNumber, $lastId);
$response = array();
if (count($publicMusics) < $ajaxLoadingLimitNumber) {
$response['noMore'] = true;
}
$response['actions'] = array();
/** @var File $file */
foreach ($publicMusics as $file) {
$actionInfos = array();
$actionInfos['id'] = $file->getPublishAction()->getId();
$actionInfos['view'] = $this->render('File/item.html.twig', array(
'file' => $file,
))->getContent();
$response['actions'][] = $actionInfos;
}
return new JsonResponse($response, Response::HTTP_OK);
}
/**
* Follow band based on band_id get parameter
*
* @param Request $request
* @param TranslatorInterface $translator
* @return Response
*/
public function follow(Request $request, TranslatorInterface $translator): Response
{
/** @var User $user */
$user = $this->getUser();
if (!($user instanceof User)) {
return $this->ajaxForward($request, 'app_login');
}
$bandId = $request->request->get('band_id');
/* @var Band $band */
$band = $this->getDoctrine()
->getRepository(Band::class)
->find($bandId);
if (!$band) {
return $this->ajaxForward($request, 'whiplay_home');
}
$parameters = array(
'bandPeople' => $band->getId(),
'action' => PeopleActionConstant::FOLLOW,
'user' => $user->getId()
);
$userFollowAction = $this
->getDoctrine()
->getRepository(PeopleAction::class)
->findOneBy($parameters);
$em = $this->getDoctrine()->getManager();
if ($userFollowAction) {
$em->remove($userFollowAction);
$this->addFlash(
'notice',
$translator->trans('band.subscription.removed')
);
} else {
$userFollowAction = new PeopleAction();
$userFollowAction->setCreatedAt(new DateTime());
$userFollowAction->setUser($user);
$userFollowAction->setBandPeople($band);
$userFollowAction->setAction(PeopleActionConstant::FOLLOW);
$userFollowAction->setStatus(ActionStatusConstant::STATUS_PUBLIC);
$em->persist($userFollowAction);
$this->addFlash(
'notice',
$translator->trans('band.subscription.added')
);
}
$em->flush();
return $this->ajaxForwardToReferer($request, 'whiplay_band_show', array('id' => $band->getId()));
}
/**
* Edit band information convert collaboration
*
* @param Request $request
* @param Band $band
* @return Response
*/
public function convertCollaboration(
Request $request,
Band $band
): Response {
$em = $this->getDoctrine()->getManager();
$band->setType(BandTypeConstant::BAND);
$em->persist($band);
$em->flush();
return $this->ajaxForward($request, 'whiplay_studio_edit', [
'id' => $band->getId()
]);
}
}