<?php
namespace App\Controller;
use App\Constant\BandMemberRoleConstant;
use App\Constant\FileTypeConstant;
use App\Constant\UtilsConstant;
use App\Entity\Band;
use App\Entity\Folder;
use App\Entity\User;
use App\Services\WebhookManager;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use App\Constant\ActionStatusConstant;
use App\Constant\FileActionConstant;
use App\Constant\FileStatusConstant;
use App\Entity\File;
use App\Entity\FileAction;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
class WhiplayController extends AbstractController
{
const ADMIN_ERROR_TRANS = 'band.error.admin';
protected WebhookManager $webhookManager;
public function __construct(WebhookManager $webhookManager)
{
$this->webhookManager = $webhookManager;
}
/**
* @param Request $request
* @param string $route
* @param array $data
* @return Response
*/
public function ajaxForward(Request $request, string $route, array $data = array()): Response
{
$len = strlen("media/cache");
$isMediaRoute = (substr($route, 0, $len) === "media/cache");
$isApiRoute = strpos($route, 'api')
|| strpos($route, 'music_data')
|| strpos($route, 'music_informations');
if (!$isMediaRoute && !$isApiRoute && $route !== "_wdt") {
$request->getSession()->set(UtilsConstant::REAL_REDIRECT_URL, $this->generateUrl($route, $data));
}
return parent::forward($this->routeToControllerName($route), $data);
}
/**
* @param Request $request
* @param string $routeIfNoReferer
* @param array $dataIfNoReferer
* @return Response
*/
public function ajaxForwardToReferer(Request $request, string $routeIfNoReferer = 'whiplay_home', array $dataIfNoReferer = array()): Response
{
$previousRoute = $request->getSession()->get('previousRoute');
$previousData = $request->getSession()->get('previousData');
if ($previousRoute && is_array($previousData)) {
return $this->ajaxForward($request, $previousRoute, $previousData);
}
return $this->ajaxForward($request, $routeIfNoReferer, $dataIfNoReferer);
}
/**
* @param $routeName
* @return string
*/
private function routeToControllerName($routeName): string {
$routes = $this->get('router')->getRouteCollection();
return $routes->get($routeName)->getDefaults()['_controller'];
}
/**
* @param File $file
* @param string $action
* @param bool $withUser
* @return bool
*/
protected function toggleFileAction(File $file, string $action, bool $withUser = true): bool
{
/** @var User $user */
$user = $this->getUser();
if (!($user instanceof User)) {
return false;
}
$parameters = array(
'file' => $file->getId(),
'action' => $action
);
if ($withUser) {
$parameters['user'] = $user->getId();
}
$fileAction = $this
->getDoctrine()
->getRepository(FileAction::class)
->findOneBy($parameters);
$create = true;
$em = $this->getDoctrine()->getManager();
if ($fileAction && ($action !== FileActionConstant::PUBLISH || $file->getStatus() === FileStatusConstant::STATUS_PRIVATE)) {
$em->remove($fileAction);
$create = false;
} else if ($action !== FileActionConstant::PUBLISH || $file->getStatus() === FileStatusConstant::STATUS_PUBLIC) {
$fileAction = new FileAction();
$fileAction->setCreatedAt(new DateTime());
$fileAction->setUser($user);
$fileAction->setAction($action);
$fileAction->setFile($file);
if (in_array($action, array(FileActionConstant::PUBLISH, FileActionConstant::FAVORITE))) {
$fileAction->setStatus(ActionStatusConstant::STATUS_PUBLIC);
}
$file->addFileAction($fileAction);
$em->persist($fileAction);
if ($action === FileActionConstant::PUBLISH) {
$this->webhookManager->sendNewMusicOnDiscord($file);
}
}
$em->flush();
return $create;
}
/**
* Know if logged user if member of specified band
*
* @param Band $band
* @param TranslatorInterface $translator
* @return bool
*/
protected function currentUserIsAdminOfBand(Band $band, TranslatorInterface $translator): bool
{
/** @var User $user */
$user = $this->getUser();
if ($user instanceof User && $user->isInBand($band, BandMemberRoleConstant::LEADER)) {
return true;
}
$this->addFlash(
UtilsConstant::NOTICE,
$translator->trans(self::ADMIN_ERROR_TRANS)
);
return false;
}
/**
* Private method to create default folders after band creation
*
* @param Band $band
* @param TranslatorInterface $translator
*/
protected function createDefaultFolders(Band $band, TranslatorInterface $translator)
{
/** @var User $user */
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
foreach (FileTypeConstant::getValues() as $label => $type) {
$rootFolder = new Folder();
$rootFolder->setName($label);
$rootFolder->setParent();
$rootFolder->setOwner($band);
$rootFolder->setCreator($user);
$rootFolder->setCreatedAt(new DateTime());
$em->persist($rootFolder);
if ($type == FileTypeConstant::MUSIC) {
$defaultFoldersNames = [
$translator->trans('band.default_folders.production'),
$translator->trans('band.default_folders.works_in_progress'),
$translator->trans('band.default_folders.ideas')
];
foreach ($defaultFoldersNames as $folderName) {
$currentFolder = new Folder();
$currentFolder->setName($folderName);
$currentFolder->setParent($rootFolder);
$currentFolder->setOwner($band);
$currentFolder->setCreator($user);
$currentFolder->setCreatedAt(new DateTime());
$em->persist($currentFolder);
}
}
}
$em->persist($band);
$em->flush();
}
}