src/Pumukit/NewAdminBundle/Controller/MultimediaObjectController.php line 1378

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Pumukit\NewAdminBundle\Controller;
  4. use Doctrine\ODM\MongoDB\DocumentManager;
  5. use MongoDB\BSON\ObjectId;
  6. use MongoDB\BSON\Regex;
  7. use Pumukit\CoreBundle\Services\i18nService;
  8. use Pumukit\CoreBundle\Services\PaginationService;
  9. use Pumukit\EncoderBundle\Services\ProfileService;
  10. use Pumukit\EncoderBundle\Services\Repository\JobRepository;
  11. use Pumukit\NewAdminBundle\Event\BackofficeEvents;
  12. use Pumukit\NewAdminBundle\Event\PublicationSubmitEvent;
  13. use Pumukit\NewAdminBundle\Form\Type\MultimediaObjectMetaType;
  14. use Pumukit\NewAdminBundle\Form\Type\MultimediaObjectPubType;
  15. use Pumukit\NewAdminBundle\Form\Type\MultimediaObjectTemplateMetaType;
  16. use Pumukit\NewAdminBundle\Services\MultimediaObjectSearchService;
  17. use Pumukit\NewAdminBundle\Services\MultimediaObjectSyncService;
  18. use Pumukit\SchemaBundle\Document\EmbeddedBroadcast;
  19. use Pumukit\SchemaBundle\Document\EmbeddedSocial;
  20. use Pumukit\SchemaBundle\Document\Group;
  21. use Pumukit\SchemaBundle\Document\MediaType\Storage;
  22. use Pumukit\SchemaBundle\Document\MultimediaObject;
  23. use Pumukit\SchemaBundle\Document\Person;
  24. use Pumukit\SchemaBundle\Document\Role;
  25. use Pumukit\SchemaBundle\Document\Series;
  26. use Pumukit\SchemaBundle\Document\Tag;
  27. use Pumukit\SchemaBundle\Document\TagInterface;
  28. use Pumukit\SchemaBundle\Document\ValueObject\Url;
  29. use Pumukit\SchemaBundle\Event\MultimediaObjectEvent;
  30. use Pumukit\SchemaBundle\Event\SchemaEvents;
  31. use Pumukit\SchemaBundle\Security\Permission;
  32. use Pumukit\SchemaBundle\Services\EmbeddedBroadcastService;
  33. use Pumukit\SchemaBundle\Services\FactoryService;
  34. use Pumukit\SchemaBundle\Services\GroupService;
  35. use Pumukit\SchemaBundle\Services\MediaCreator;
  36. use Pumukit\SchemaBundle\Services\MediaUpdater;
  37. use Pumukit\SchemaBundle\Services\MultimediaObjectEventDispatcherService;
  38. use Pumukit\SchemaBundle\Services\MultimediaObjectService;
  39. use Pumukit\SchemaBundle\Services\PersonService;
  40. use Pumukit\SchemaBundle\Services\Repository\SeriesRepository;
  41. use Pumukit\SchemaBundle\Services\SortedMultimediaObjectsService;
  42. use Pumukit\SchemaBundle\Services\SpecialTranslationService;
  43. use Pumukit\SchemaBundle\Services\TagService;
  44. use Pumukit\SchemaBundle\Services\UserService;
  45. use Pumukit\WebTVBundle\PumukitWebTVBundle;
  46. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  47. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  48. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  49. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  50. use Symfony\Component\Form\Extension\Core\Type\TextType;
  51. use Symfony\Component\Form\Extension\Core\Type\UrlType;
  52. use Symfony\Component\HttpFoundation\JsonResponse;
  53. use Symfony\Component\HttpFoundation\Request;
  54. use Symfony\Component\HttpFoundation\RequestStack;
  55. use Symfony\Component\HttpFoundation\Response;
  56. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  57. use Symfony\Component\Routing\RouterInterface;
  58. use Symfony\Contracts\Translation\TranslatorInterface;
  59. /**
  60.  * @Security("is_granted('ROLE_ACCESS_MULTIMEDIA_SERIES')")
  61.  */
  62. class MultimediaObjectController extends SortableAdminController
  63. {
  64.     public static $resourceName 'mms';
  65.     public static $repoName MultimediaObject::class;
  66.     /** @var RequestStack */
  67.     private $requestStack;
  68.     /** @var MultimediaObjectSyncService */
  69.     private $multimediaObjectSyncService;
  70.     /** @var MultimediaObjectSearchService */
  71.     private $multimediaObjectSearchService;
  72.     /** @var PersonService */
  73.     private $personService;
  74.     /** @var SortedMultimediaObjectsService */
  75.     private $sortedMultimediaObjectService;
  76.     /** @var ProfileService */
  77.     private $profileService;
  78.     /** @var MultimediaObjectService */
  79.     private $multimediaObjectService;
  80.     /** @var TagService */
  81.     private $tagService;
  82.     /** @var EmbeddedBroadcastService */
  83.     private $embeddedBroadcastService;
  84.     /** @var SpecialTranslationService */
  85.     private $specialTranslatorService;
  86.     /** @var MultimediaObjectEventDispatcherService */
  87.     private $pumukitSchemaMultimediaObjectDispatcher;
  88.     /** @var EventDispatcherInterface */
  89.     private $eventDispatcher;
  90.     /** @var RouterInterface */
  91.     private $router;
  92.     private $showLatestWithPudeNew;
  93.     private $pumukitNewAdminShowNakedPubTab;
  94.     private $warningOnUnpublished;
  95.     private $kernelBundles;
  96.     private $pumukitNewAdminMultimediaObjectLabel;
  97.     private JobRepository $jobRepository;
  98.     private MediaCreator $mediaCreator;
  99.     private SeriesRepository $seriesRepository;
  100.     private i18nService $i18nService;
  101.     private MediaUpdater $mediaUpdater;
  102.     public function __construct(
  103.         DocumentManager $documentManager,
  104.         PaginationService $paginationService,
  105.         FactoryService $factoryService,
  106.         GroupService $groupService,
  107.         UserService $userService,
  108.         TranslatorInterface $translator,
  109.         RequestStack $requestStack,
  110.         MultimediaObjectSyncService $multimediaObjectSyncService,
  111.         MultimediaObjectSearchService $multimediaObjectSearchService,
  112.         PersonService $personService,
  113.         SortedMultimediaObjectsService $sortedMultimediaObjectService,
  114.         JobRepository $jobRepository,
  115.         ProfileService $profileService,
  116.         SessionInterface $session,
  117.         MultimediaObjectService $multimediaObjectService,
  118.         TagService $tagService,
  119.         EmbeddedBroadcastService $embeddedBroadcastService,
  120.         SpecialTranslationService $specialTranslatorService,
  121.         MultimediaObjectEventDispatcherService $pumukitSchemaMultimediaObjectDispatcher,
  122.         EventDispatcherInterface $eventDispatcher,
  123.         RouterInterface $router,
  124.         MediaCreator $mediaCreator,
  125.         SeriesRepository $seriesRepository,
  126.         i18nService $i18nService,
  127.         $showLatestWithPudeNew,
  128.         $pumukitNewAdminShowNakedPubTab,
  129.         $warningOnUnpublished,
  130.         $kernelBundles,
  131.         $pumukitNewAdminMultimediaObjectLabel,
  132.         MediaUpdater $mediaUpdater
  133.     ) {
  134.         parent::__construct($documentManager$paginationService$factoryService$groupService$userService$session$translator);
  135.         $this->requestStack $requestStack;
  136.         $this->multimediaObjectSyncService $multimediaObjectSyncService;
  137.         $this->multimediaObjectSearchService $multimediaObjectSearchService;
  138.         $this->personService $personService;
  139.         $this->sortedMultimediaObjectService $sortedMultimediaObjectService;
  140.         $this->profileService $profileService;
  141.         $this->multimediaObjectService $multimediaObjectService;
  142.         $this->tagService $tagService;
  143.         $this->embeddedBroadcastService $embeddedBroadcastService;
  144.         $this->specialTranslatorService $specialTranslatorService;
  145.         $this->pumukitSchemaMultimediaObjectDispatcher $pumukitSchemaMultimediaObjectDispatcher;
  146.         $this->eventDispatcher $eventDispatcher;
  147.         $this->router $router;
  148.         $this->showLatestWithPudeNew $showLatestWithPudeNew;
  149.         $this->pumukitNewAdminShowNakedPubTab $pumukitNewAdminShowNakedPubTab;
  150.         $this->warningOnUnpublished $warningOnUnpublished;
  151.         $this->kernelBundles $kernelBundles;
  152.         $this->pumukitNewAdminMultimediaObjectLabel $pumukitNewAdminMultimediaObjectLabel;
  153.         $this->jobRepository $jobRepository;
  154.         $this->mediaCreator $mediaCreator;
  155.         $this->seriesRepository $seriesRepository;
  156.         $this->i18nService $i18nService;
  157.         $this->mediaUpdater $mediaUpdater;
  158.     }
  159.     /**
  160.      * @Template("@PumukitNewAdmin/MultimediaObject/index.html.twig")
  161.      */
  162.     public function indexAction(Request $request)
  163.     {
  164.         $session $this->session;
  165.         $sessionId $session->get('admin/series/id'null);
  166.         $series $this->factoryService->findSeriesById($request->query->get('id'), $sessionId);
  167.         if (!$series) {
  168.             throw $this->createNotFoundException();
  169.         }
  170.         if ($request->get('page')) {
  171.             $page = (int) $request->get('page'1);
  172.             if ($page 1) {
  173.                 $page 1;
  174.             }
  175.             $session->set('admin/mms/page'$page);
  176.         }
  177.         if ($request->get('paginate'null)) {
  178.             $session->set('admin/mms/paginate'$request->get('paginate'10));
  179.         }
  180.         $session->set('admin/series/id'$series->getId());
  181.         $mms $this->getListMultimediaObjects($series);
  182.         $update_session true;
  183.         foreach ($mms as $mm) {
  184.             if ($mm->getId() == $session->get('admin/mms/id')) {
  185.                 $update_session false;
  186.             }
  187.         }
  188.         if ($update_session) {
  189.             $session->remove('admin/mms/id');
  190.         }
  191.         return [
  192.             'series' => $series,
  193.             'mms' => $mms,
  194.             'disable_pudenew' => !$this->showLatestWithPudeNew,
  195.         ];
  196.     }
  197.     public function shortenerAction($id)
  198.     {
  199.         $multimediaObject $this->documentManager->getRepository(MultimediaObject::class)->findOneBy(['id' => $id]);
  200.         if (!$multimediaObject) {
  201.             $template '@PumukitNewAdmin/MultimediaObject/404notfound.html.twig';
  202.             $options = ['id' => $id];
  203.             return new Response($this->renderView($template$options), 404);
  204.         }
  205.         $this->updateSession($multimediaObject);
  206.         return $this->redirectToRoute('pumukitnewadmin_mms_index', ['id' => $multimediaObject->getSeries()->getId()]);
  207.     }
  208.     public function createAction(Request $request)
  209.     {
  210.         $session $this->session;
  211.         $sessionId $session->get('admin/series/id'null);
  212.         $series $this->factoryService->findSeriesById($request->get('id'), $sessionId);
  213.         $session->set('admin/series/id'$series->getId());
  214.         $mmobj $this->factoryService->createMultimediaObject($seriestrue$this->getUser());
  215.         $this->sortedMultimediaObjectService->reorder($series);
  216.         if ($request->attributes->has('microsite_custom_tag')) {
  217.             $sTagCode $request->attributes->get('microsite_custom_tag');
  218.             $aTag $this->documentManager->getRepository(Tag::class)->findOneBy(['cod' => $sTagCode]);
  219.             if ($aTag) {
  220.                 $mmobj->addTag($aTag);
  221.                 $this->documentManager->flush();
  222.             }
  223.         }
  224.         // After reordering the session page is updated
  225.         $this->documentManager->refresh($mmobj);
  226.         $this->updateSession($mmobj);
  227.         return new JsonResponse(
  228.             [
  229.                 'seriesId' => $series->getId(),
  230.                 'mmId' => $mmobj->getId(),
  231.             ]
  232.         );
  233.     }
  234.     /**
  235.      * @Template("@PumukitNewAdmin/MultimediaObject/show.html.twig")
  236.      */
  237.     public function showAction(Request $request)
  238.     {
  239.         $data $this->findOr404($request);
  240.         $activeEditor $this->checkHasEditor();
  241.         return [
  242.             'mm' => $data,
  243.             'active_editor' => $activeEditor,
  244.         ];
  245.     }
  246.     /**
  247.      * @Template("@PumukitNewAdmin/MultimediaObject/edit.html.twig")
  248.      */
  249.     public function editAction(Request $request)
  250.     {
  251.         $personalScopeRoleCode $this->personService->getPersonalScopeRoleCode();
  252.         try {
  253.             $personalScopeRole $this->personService->getPersonalScopeRole();
  254.         } catch (\Exception $e) {
  255.             return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
  256.         }
  257.         $roles $this->personService->getRoles();
  258.         if (null === $roles) {
  259.             throw new \Exception('Not found any role.');
  260.         }
  261.         $parentTags $this->factoryService->getParentTags();
  262.         $resource $this->findOr404($request);
  263.         $locale $request->getLocale();
  264.         if ($resource->isPrototype()) {
  265.             $formMeta $this->createForm(MultimediaObjectTemplateMetaType::class, $resource, ['translator' => $this->translator'locale' => $locale]);
  266.         } else {
  267.             $formMeta $this->createForm(MultimediaObjectMetaType::class, $resource, ['translator' => $this->translator'locale' => $locale]);
  268.         }
  269.         $options = [
  270.             'not_granted_change_status' => !$this->isGranted(Permission::CHANGE_MMOBJECT_STATUS),
  271.             'translator' => $this->translator,
  272.             'locale' => $locale,
  273.         ];
  274.         $formPub $this->createForm(MultimediaObjectPubType::class, $resource$options);
  275.         // If the 'pudenew' tag is not being used, set the display to 'false'.
  276.         if (!$this->showLatestWithPudeNew) {
  277.             $this->documentManager
  278.                 ->getRepository(Tag::class)
  279.                 ->findOneBy(['cod' => 'PUDENEW'])
  280.                 ->setDisplay(false)
  281.             ;
  282.         }
  283.         $pubChannelsTags $this->factoryService->getTagsByCod('PUBCHANNELS'true);
  284.         $pubDecisionsTags $this->factoryService->getTagsByCod('PUBDECISIONS'true);
  285.         $jobs $this->jobRepository->getNotFinishedJobsByMultimediaObjectId($resource->getId());
  286.         $notMasterProfiles $this->profileService->getProfiles(nulltruefalse);
  287.         $template $resource->isPrototype() ? '_template' '';
  288.         $activeEditor $this->checkHasEditor();
  289.         $changePubChannel $this->isGranted(Permission::CHANGE_MMOBJECT_PUBCHANNEL);
  290.         $allBundles $this->kernelBundles;
  291.         $opencastExists array_key_exists('PumukitOpencastBundle'$allBundles);
  292.         $allGroups $this->getAllGroups();
  293.         $showSimplePubTab $this->pumukitNewAdminShowNakedPubTab;
  294.         return [
  295.             'mm' => $resource,
  296.             'form_meta' => $formMeta->createView(),
  297.             'form_pub' => $formPub->createView(),
  298.             // 'series' => $series,
  299.             'roles' => $roles,
  300.             'personal_scope_role' => $personalScopeRole,
  301.             'personal_scope_role_code' => $personalScopeRoleCode,
  302.             'pub_channels' => $pubChannelsTags,
  303.             'pub_decisions' => $pubDecisionsTags,
  304.             'parent_tags' => $parentTags,
  305.             'jobs' => $jobs,
  306.             'not_master_profiles' => $notMasterProfiles,
  307.             'template' => $template,
  308.             'active_editor' => $activeEditor,
  309.             'opencast_exists' => $opencastExists,
  310.             'not_change_pub_channel' => !$changePubChannel,
  311.             'groups' => $allGroups,
  312.             'show_simple_pub_tab' => $showSimplePubTab,
  313.         ];
  314.     }
  315.     /**
  316.      * @Template("@PumukitNewAdmin/MultimediaObject/links.html.twig")
  317.      */
  318.     public function linksAction(MultimediaObject $resource)
  319.     {
  320.         return [
  321.             'mm' => $resource,
  322.             'is_published' => $this->multimediaObjectService->isPublished($resourcePumukitWebTVBundle::WEB_TV_TAG),
  323.             'is_hidden' => $this->multimediaObjectService->isHidden($resourcePumukitWebTVBundle::WEB_TV_TAG),
  324.             'is_playable' => $this->multimediaObjectService->hasPlayableResource($resource),
  325.             'warning_on_unpublished' => $this->warningOnUnpublished,
  326.         ];
  327.     }
  328.     /**
  329.      * @Template("@PumukitNewAdmin/MultimediaObject/updatesocial.html.twig")
  330.      */
  331.     public function updatesocialAction(Request $request)
  332.     {
  333.         $multimediaObject $this->documentManager->getRepository(MultimediaObject::class)->findOneBy(['_id' => new ObjectId($request->request->get('id'))]);
  334.         $method $request->getMethod();
  335.         if (in_array($method, ['POST''PUT''PATCH'])) {
  336.             $social $multimediaObject->getEmbeddedSocial();
  337.             if (!$social) {
  338.                 $social = new EmbeddedSocial();
  339.             }
  340.             $social->setTwitter($request->request->get('twitter'));
  341.             $social->setEmail($request->request->get('email'));
  342.             $this->documentManager->persist($social);
  343.             $multimediaObject->setEmbeddedSocial($social);
  344.             $this->documentManager->flush();
  345.         }
  346.         return ['mm' => $multimediaObject];
  347.     }
  348.     public function updatemetaAction(Request $request)
  349.     {
  350.         try {
  351.             $this->personService->getPersonalScopeRole();
  352.         } catch (\Exception $e) {
  353.             return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
  354.         }
  355.         $roles $this->personService->getRoles();
  356.         if (null === $roles) {
  357.             throw new \Exception('Not found any role.');
  358.         }
  359.         $resource $this->findOr404($request);
  360.         $this->session->set('admin/mms/id'$resource->getId());
  361.         $locale $request->getLocale();
  362.         if ($resource->isPrototype()) {
  363.             $formMeta $this->createForm(MultimediaObjectTemplateMetaType::class, $resource, ['translator' => $this->translator'locale' => $locale]);
  364.         } else {
  365.             $formMeta $this->createForm(MultimediaObjectMetaType::class, $resource, ['translator' => $this->translator'locale' => $locale]);
  366.         }
  367.         $this->isGranted(Permission::CHANGE_MMOBJECT_PUBCHANNEL);
  368.         $method $request->getMethod();
  369.         if (in_array($method, ['POST''PUT''PATCH'])) {
  370.             $formMeta->handleRequest($request);
  371.             if ($formMeta->isSubmitted() && $formMeta->isValid() && ($resource->getPublicDate() >= $resource->getRecordDate())) {
  372.                 $this->update($resource);
  373.                 $this->dispatchUpdate($resource);
  374.                 $this->sortedMultimediaObjectService->reorder($resource->getSeries());
  375.                 $referer $request->headers->get('referer');
  376.                 return $this->renderList($resource$referer);
  377.             }
  378.         }
  379.         return $this->redirectToRoute('pumukitnewadmin_mms_edit', ['id' => $resource->getId()]);
  380.     }
  381.     public function updatepubAction(Request $request): Response
  382.     {
  383.         $resource $this->findOr404($request);
  384.         $sessionId $this->session->get('admin/series/id'null);
  385.         $series $this->factoryService->findSeriesById(null$resource->getSeries()->getId());
  386.         if (null === $series) {
  387.             throw new \Exception('Series with id '.$request->get('id').' or with session id '.$sessionId.' not found.');
  388.         }
  389.         $this->session->set('admin/series/id'$series->getId());
  390.         $parentTags $this->factoryService->getParentTags();
  391.         $this->session->set('admin/mms/id'$resource->getId());
  392.         $locale $request->getLocale();
  393.         $previousStatus $resource->getStatus();
  394.         if ($resource->isPrototype()) {
  395.             $formMeta $this->createForm(MultimediaObjectTemplateMetaType::class, $resource, ['translator' => $this->translator'locale' => $locale]);
  396.         } else {
  397.             $formMeta $this->createForm(MultimediaObjectMetaType::class, $resource, ['translator' => $this->translator'locale' => $locale]);
  398.         }
  399.         $options = [
  400.             'not_granted_change_status' => !$this->isGranted(Permission::CHANGE_MMOBJECT_STATUS),
  401.             'translator' => $this->translator,
  402.             'locale' => $locale,
  403.         ];
  404.         $formPub $this->createForm(MultimediaObjectPubType::class, $resource$options);
  405.         $pubChannelsTags $this->factoryService->getTagsByCod('PUBCHANNELS'true);
  406.         $pubDecisionsTags $this->factoryService->getTagsByCod('PUBDECISIONS'true);
  407.         $changePubChannel $this->isGranted(Permission::CHANGE_MMOBJECT_PUBCHANNEL);
  408.         $isPrototype $resource->isPrototype();
  409.         $method $request->getMethod();
  410.         $formPub->handleRequest($request);
  411.         if ($formPub->isSubmitted() && $formPub->isValid()) {
  412.             // NOTE: If this field is disabled in the form, it sets it to 'null' on the mmobj.
  413.             // Ideally, fix the form instead of working around it like this
  414.             if (null === $resource->getStatus()) {
  415.                 $resource->setStatus($previousStatus);
  416.             }
  417.             if ($changePubChannel) {
  418.                 $resource $this->updateTags($request->get('pub_channels'null), 'PUCH'$resource);
  419.             }
  420.             if ($isPrototype) {
  421.                 $resource->setStatus(MultimediaObject::STATUS_PROTOTYPE);
  422.             }
  423.             $event = new PublicationSubmitEvent($resource$request);
  424.             $this->eventDispatcher->dispatch($eventBackofficeEvents::PUBLICATION_SUBMIT);
  425.             $resource $this->updateTags($request->get('pub_decisions'null), 'PUDE'$resource);
  426.             $this->update($resource);
  427.             $this->dispatchUpdate($resource);
  428.             $this->sortedMultimediaObjectService->reorder($series);
  429.             $mms $this->getListMultimediaObjects($series);
  430.             return $this->render(
  431.                 '@PumukitNewAdmin/MultimediaObject/list.html.twig',
  432.                 [
  433.                     'series' => $series,
  434.                     'mms' => $mms,
  435.                 ]
  436.             );
  437.         }
  438.         $personalScopeRoleCode $this->personService->getPersonalScopeRoleCode();
  439.         try {
  440.             $personalScopeRole $this->personService->getPersonalScopeRole();
  441.         } catch (\Exception $e) {
  442.             return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
  443.         }
  444.         $roles $this->personService->getRoles();
  445.         if (null === $roles) {
  446.             throw new \Exception('Not found any role.');
  447.         }
  448.         $allGroups $this->getAllGroups();
  449.         return $this->render(
  450.             '@PumukitNewAdmin/MultimediaObject/edit.html.twig',
  451.             [
  452.                 'mm' => $resource,
  453.                 'form_meta' => $formMeta->createView(),
  454.                 'form_pub' => $formPub->createView(),
  455.                 'series' => $series,
  456.                 'roles' => $roles,
  457.                 'personal_scope_role' => $personalScopeRole,
  458.                 'personal_scope_role_code' => $personalScopeRoleCode,
  459.                 'pub_channels' => $pubChannelsTags,
  460.                 'pub_decisions' => $pubDecisionsTags,
  461.                 'parent_tags' => $parentTags,
  462.                 'not_change_pub_channel' => !$changePubChannel,
  463.                 'groups' => $allGroups,
  464.             ]
  465.         );
  466.     }
  467.     /**
  468.      * @Template("@PumukitNewAdmin/MultimediaObject/listtagsajax.html.twig")
  469.      */
  470.     public function getChildrenTagAction(Tag $tagRequest $request)
  471.     {
  472.         return [
  473.             'nodes' => $tag->getChildren(),
  474.             'parent' => $tag->getId(),
  475.             'mmId' => $request->get('mm_id'),
  476.             'block_tag' => $request->get('tag_id'),
  477.         ];
  478.     }
  479.     public function addTagAction(Request $request)
  480.     {
  481.         $resource $this->findOr404($request);
  482.         try {
  483.             $addedTags $this->tagService->addTagToMultimediaObject($resource$request->get('tagId'));
  484.         } catch (\Exception $e) {
  485.             throw new \Exception($e->getMessage());
  486.         }
  487.         $json = ['added' => [], 'recommended' => []];
  488.         foreach ($addedTags as $n) {
  489.             $json['added'][] = [
  490.                 'id' => $n->getId(),
  491.                 'cod' => $n->getCod(),
  492.                 'name' => $n->getTitle(),
  493.                 'group' => $n->getPath(),
  494.             ];
  495.         }
  496.         $json['prototype'] = $resource->isPrototype();
  497.         return new JsonResponse($json);
  498.     }
  499.     public function deleteTagAction(Request $request)
  500.     {
  501.         $resource $this->findOr404($request);
  502.         try {
  503.             $deletedTags $this->tagService->removeTagFromMultimediaObject($resource$request->get('tagId'));
  504.         } catch (\Exception $e) {
  505.             throw new \Exception($e->getMessage());
  506.         }
  507.         $json = ['deleted' => [], 'recommended' => []];
  508.         foreach ($deletedTags as $n) {
  509.             $json['deleted'][] = [
  510.                 'id' => $n->getId(),
  511.                 'cod' => $n->getCod(),
  512.                 'name' => $n->getTitle(),
  513.                 'group' => $n->getPath(),
  514.             ];
  515.         }
  516.         $json['prototype'] = $resource->isPrototype();
  517.         return new JsonResponse($json);
  518.     }
  519.     public function searchTagAction(Request $request)
  520.     {
  521.         $repo $this->documentManager->getRepository(Tag::class);
  522.         $search_text $request->get('search_text');
  523.         $search_text $request->query->get('search_text');
  524.         $lang $request->getLocale();
  525.         $mmId $request->get('mmId');
  526.         $parent $repo->findOneBy(['_id' => $request->get('parent')]);
  527.         $parent_path str_replace('|''\\|'$parent->getPath());
  528.         $qb $this->documentManager->createQueryBuilder(Tag::class);
  529.         $children $qb
  530.             ->addOr($qb->expr()->field('title.'.$lang)->equals(new Regex('.*'.$search_text.'.*''i')))
  531.             ->addOr($qb->expr()->field('cod')->equals(new Regex('.*'.$search_text.'.*''i')))
  532.             ->addAnd($qb->expr()->field('path')->equals(new Regex($parent_path)))
  533.             ->getQuery()
  534.             ->execute()
  535.         ;
  536.         if (is_object($children)) {
  537.             $result $children->toArray();
  538.         } else {
  539.             $result $children;
  540.         }
  541.         if (!$result) {
  542.             return $this->render(
  543.                 '@PumukitNewAdmin/MultimediaObject/listtagsajaxnone.html.twig',
  544.                 ['mmId' => $mmId'parentId' => $parent->getId()]
  545.             );
  546.         }
  547.         foreach ($children as $tag) {
  548.             $result $this->getAllParents($tag$result$parent->getId());
  549.         }
  550.         usort(
  551.             $result,
  552.             static function (TagInterface $xTagInterface $y) {
  553.                 return strcasecmp($x->getCod(), $y->getCod());
  554.             }
  555.         );
  556.         return $this->render(
  557.             '@PumukitNewAdmin/MultimediaObject/listtagsajax.html.twig',
  558.             ['nodes' => $result'mmId' => $mmId'block_tag' => $parent->getId(), 'parent' => $parent'search_text' => $search_text]
  559.         );
  560.     }
  561.     public function bottomAction(Request $request)
  562.     {
  563.         $resource $this->findOr404($request);
  564.         // rank zero is the template
  565.         $new_rank 1;
  566.         $resource->setRank($new_rank);
  567.         $this->update($resource);
  568.         $this->addFlash('success''up');
  569.         $this->sortedMultimediaObjectService->reorder($resource->getSeries());
  570.         return $this->redirectToIndex();
  571.     }
  572.     public function deleteAction(Request $request)
  573.     {
  574.         $resource $this->findOr404($request);
  575.         $resourceId $resource->getId();
  576.         $seriesId $resource->getSeries()->getId();
  577.         if (!$this->isUserAllowedToDelete($resource)) {
  578.             return new Response('You don\'t have enough permissions to delete this mmobj. Contact your administrator.'Response::HTTP_FORBIDDEN);
  579.         }
  580.         try {
  581.             $this->factoryService->deleteMultimediaObject($resource);
  582.         } catch (\Exception $e) {
  583.             return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
  584.         }
  585.         if ($resourceId === $this->session->get('admin/mms/id')) {
  586.             $this->session->remove('admin/mms/id');
  587.         }
  588.         return $this->redirectToRoute('pumukitnewadmin_mms_list', ['seriesId' => $seriesId]);
  589.     }
  590.     public function batchDeleteAction(Request $request)
  591.     {
  592.         $ids $request->get('ids');
  593.         if ('string' === gettype($ids)) {
  594.             $ids json_decode($idstrue512JSON_THROW_ON_ERROR);
  595.         }
  596.         foreach ($ids as $id) {
  597.             $resource $this->find($id);
  598.             if (!$resource || !$this->isUserAllowedToDelete($resource)) {
  599.                 continue;
  600.             }
  601.             try {
  602.                 $this->factoryService->deleteMultimediaObject($resource);
  603.             } catch (\Exception $e) {
  604.                 return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
  605.             }
  606.             if ($id === $this->session->get('admin/mms/id')) {
  607.                 $this->session->remove('admin/mms/id');
  608.             }
  609.         }
  610.         return $this->redirectToRoute('pumukitnewadmin_mms_list');
  611.     }
  612.     public function generateMagicUrlAction(Request $request)
  613.     {
  614.         $resource $this->findOr404($request);
  615.         $response $this->multimediaObjectService->resetMagicUrl($resource);
  616.         return new Response($response);
  617.     }
  618.     public function cloneAction(Request $request)
  619.     {
  620.         $resource $this->findOr404($request);
  621.         $seriesId $resource->getSeries()->getId();
  622.         $this->factoryService->cloneMultimediaObject($resource);
  623.         return $this->redirectToRoute('pumukitnewadmin_mms_list', ['seriesId' => $seriesId]);
  624.     }
  625.     public function invertAnnounceAction(Request $request)
  626.     {
  627.         $ids $request->get('ids');
  628.         if ('string' === gettype($ids)) {
  629.             $ids json_decode($idstrue512JSON_THROW_ON_ERROR);
  630.         }
  631.         $tagNew $this->documentManager->getRepository(Tag::class)->findOneBy(['cod' => 'PUDENEW']);
  632.         foreach ($ids as $id) {
  633.             $resource $this->find($id);
  634.             if (!$resource) {
  635.                 continue;
  636.             }
  637.             if ($resource->containsTagWithCod('PUDENEW')) {
  638.                 $this->tagService->removeTagFromMultimediaObject($resource$tagNew->getId());
  639.             } else {
  640.                 $this->tagService->addTagToMultimediaObject($resource$tagNew->getId());
  641.             }
  642.         }
  643.         return $this->redirectToRoute('pumukitnewadmin_mms_list');
  644.     }
  645.     public function listAction(Request $request)
  646.     {
  647.         $seriesId $request->get('seriesId'null);
  648.         $sessionId $this->session->get('admin/series/id'null);
  649.         $series $this->factoryService->findSeriesById($seriesId$sessionId);
  650.         if (!$series) {
  651.             throw $this->createNotFoundException('Page not found!');
  652.         }
  653.         $mms $this->getListMultimediaObjects($series$request->get('newMmId'null));
  654.         $update_session true;
  655.         foreach ($mms as $mm) {
  656.             if ($mm->getId() == $this->session->get('admin/mms/id')) {
  657.                 $update_session false;
  658.             }
  659.         }
  660.         if ($update_session) {
  661.             $this->session->remove('admin/mms/id');
  662.         }
  663.         return $this->render(
  664.             '@PumukitNewAdmin/MultimediaObject/list.html.twig',
  665.             [
  666.                 'series' => $series,
  667.                 'mms' => $mms,
  668.             ]
  669.         );
  670.     }
  671.     public function cutAction(Request $request)
  672.     {
  673.         $ids $request->get('ids');
  674.         if ('string' === gettype($ids)) {
  675.             $ids json_decode($idstrue512JSON_THROW_ON_ERROR);
  676.         }
  677.         $this->session->set('admin/mms/cut'$ids);
  678.         return new JsonResponse($ids);
  679.     }
  680.     public function pasteAction(Request $request)
  681.     {
  682.         if (!$this->session->has('admin/mms/cut')) {
  683.             throw new \Exception('Not found any multimedia object to paste.');
  684.         }
  685.         $ids $this->session->get('admin/mms/cut');
  686.         $seriesId $request->get('seriesId'null);
  687.         $sessionId $this->session->get('admin/series/id'null);
  688.         $series $this->factoryService->findSeriesById($seriesId$sessionId);
  689.         foreach ($ids as $id) {
  690.             $multimediaObject $this->documentManager->getRepository(MultimediaObject::class)->find($id);
  691.             if (!$multimediaObject) {
  692.                 continue;
  693.             }
  694.             if ($id === $this->session->get('admin/mms/id')) {
  695.                 $this->session->remove('admin/mms/id');
  696.             }
  697.             $multimediaObject->setSeries($series);
  698.             if (Series::SORT_MANUAL === $series->getSorting()) {
  699.                 $multimediaObject->setRank(-1);
  700.             }
  701.             $this->documentManager->persist($multimediaObject);
  702.             $this->pumukitSchemaMultimediaObjectDispatcher->dispatchUpdate($multimediaObject);
  703.         }
  704.         $this->documentManager->persist($series);
  705.         $this->documentManager->flush();
  706.         $this->session->remove('admin/mms/cut');
  707.         $this->sortedMultimediaObjectService->reorder($series);
  708.         return $this->redirectToRoute('pumukitnewadmin_mms_list');
  709.     }
  710.     public function reorderAction(Request $request)
  711.     {
  712.         $sessionId $this->session->get('admin/series/id'null);
  713.         $series $this->factoryService->findSeriesById($request->get('id'), $sessionId);
  714.         $series->setSorting($request->get('sorting'Series::SORT_MANUAL));
  715.         $this->documentManager->persist($series);
  716.         $this->documentManager->flush();
  717.         $this->sortedMultimediaObjectService->reorder($series);
  718.         return $this->redirectToRoute('pumukitnewadmin_mms_list');
  719.     }
  720.     public function syncTagsAction(Request $request)
  721.     {
  722.         $all $request->query->get('all');
  723.         $multimediaObjectRepo $this->documentManager
  724.             ->getRepository(MultimediaObject::class)
  725.         ;
  726.         $multimediaObject $multimediaObjectRepo
  727.             ->find($request->query->get('id'))
  728.         ;
  729.         if (!$multimediaObject) {
  730.             return new JsonResponse('Not Found'404);
  731.         }
  732.         $mms $multimediaObjectRepo
  733.             ->createQueryBuilder()
  734.             ->field('_id')->notEqual($multimediaObject->getId())
  735.             ->field('type')->notEqual(MultimediaObject::TYPE_LIVE)
  736.             ->field('series')->references($multimediaObject->getSeries())
  737.             ->getQuery()
  738.             ->execute()
  739.         ;
  740.         if ($all) {
  741.             $targetTags $multimediaObject->getTags()->toArray();
  742.             $this->tagService->resetCategoriesForCollections($mms$targetTags);
  743.         } else {
  744.             $parentTags $this->factoryService->getParentTags();
  745.             $parentTagsToSync = [];
  746.             foreach ($parentTags as $parentTag) {
  747.                 if ($parentTag->getDisplay() && !$parentTag->getProperty('hide_in_tag_group')) {
  748.                     $parentTagsToSync[] = $parentTag;
  749.                 }
  750.             }
  751.             $this->tagService->syncTagsForCollections(
  752.                 $mms,
  753.                 $multimediaObject->getTags()->toArray(),
  754.                 $parentTagsToSync
  755.             );
  756.         }
  757.         return new JsonResponse('');
  758.     }
  759.     public function reloadTagsAction(Request $request)
  760.     {
  761.         $repo $this->documentManager->getRepository(Tag::class);
  762.         $mmId $request->get('mmId');
  763.         $parent $repo->findOneBy(['_id' => $request->get('parentId')]);
  764.         return $this->render(
  765.             '@PumukitNewAdmin/MultimediaObject/listtagsajax.html.twig',
  766.             ['nodes' => $parent->getChildren(), 'mmId' => $mmId'block_tag' => $parent->getId(), 'parent' => 'root']
  767.         );
  768.     }
  769.     /**
  770.      * @Security("is_granted('ROLE_MODIFY_OWNER')")
  771.      */
  772.     public function updateGroupsAction(Request $request)
  773.     {
  774.         $multimediaObject $this->findOr404($request);
  775.         $series $multimediaObject->getSeries();
  776.         $seriesId $series->getId();
  777.         if ('POST' === $request->getMethod()) {
  778.             $addGroups $request->get('addGroups', []);
  779.             if ('string' === gettype($addGroups)) {
  780.                 $addGroups json_decode($addGroupstrue512JSON_THROW_ON_ERROR);
  781.             }
  782.             $deleteGroups $request->get('deleteGroups', []);
  783.             if ('string' === gettype($deleteGroups)) {
  784.                 $deleteGroups json_decode($deleteGroupstrue512JSON_THROW_ON_ERROR);
  785.             }
  786.             try {
  787.                 $this->modifyMultimediaObjectGroups($multimediaObject$addGroups$deleteGroups);
  788.             } catch (\Exception $e) {
  789.                 return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
  790.             }
  791.             try {
  792.                 $isUserStillRelated $this->isUserStillRelated($multimediaObject);
  793.                 if (!$isUserStillRelated) {
  794.                     $response = [
  795.                         'redirect' => 1,
  796.                         'url' => $this->generateUrl('pumukitnewadmin_series_index', ['id' => $seriesId]),
  797.                     ];
  798.                     return new JsonResponse($responseJsonResponse::HTTP_OK);
  799.                 }
  800.             } catch (\Exception $e) {
  801.                 $response = [
  802.                     'redirect' => 1,
  803.                     'url' => $this->generateUrl('pumukitnewadmin_series_index', ['id' => $seriesId]),
  804.                 ];
  805.                 return new JsonResponse($responseJsonResponse::HTTP_OK);
  806.             }
  807.         }
  808.         return new JsonResponse(['success''redirect' => 0]);
  809.     }
  810.     public function getGroupsAction(Request $request)
  811.     {
  812.         $multimediaObject $this->findOr404($request);
  813.         $groups $this->getResourceGroups($multimediaObject->getGroups());
  814.         return new JsonResponse($groups);
  815.     }
  816.     public function getBroadcastInfoAction(Request $request)
  817.     {
  818.         $multimediaObject $this->findOr404($request);
  819.         $embeddedBroadcast $multimediaObject->getEmbeddedBroadcast();
  820.         if ($embeddedBroadcast) {
  821.             $type $embeddedBroadcast->getType();
  822.             $password $embeddedBroadcast->getPassword();
  823.             $groups $this->getResourceGroups($embeddedBroadcast->getGroups());
  824.         } else {
  825.             $type EmbeddedBroadcast::TYPE_PUBLIC;
  826.             $password '';
  827.             $groups = ['addGroups' => [], 'deleteGroups' => []];
  828.         }
  829.         $info = [
  830.             'type' => $type,
  831.             'password' => $password,
  832.             'groups' => $groups,
  833.         ];
  834.         return new JsonResponse($info);
  835.     }
  836.     /**
  837.      * @ParamConverter("multimediaObject", options={"id" = "id"})
  838.      *
  839.      * @Template("@PumukitNewAdmin/MultimediaObject/updatebroadcast.html.twig")
  840.      */
  841.     public function updateBroadcastAction(MultimediaObject $multimediaObjectRequest $request)
  842.     {
  843.         if ($multimediaObject->isLive()) {
  844.             $broadcasts $this->embeddedBroadcastService->getAllTypes(true);
  845.         } else {
  846.             $broadcasts $this->embeddedBroadcastService->getAllTypes();
  847.         }
  848.         $allGroups $this->getAllGroups();
  849.         $template $multimediaObject->isPrototype() ? '_template' '';
  850.         if ($request->isMethod('PUT') || $request->isMethod('POST')) {
  851.             try {
  852.                 $type $request->get('type'null);
  853.                 $password $request->get('password'null);
  854.                 $addGroups $request->get('addGroups', []);
  855.                 if ('string' === gettype($addGroups)) {
  856.                     $addGroups json_decode($addGroupstrue512JSON_THROW_ON_ERROR);
  857.                 }
  858.                 $deleteGroups $request->get('deleteGroups', []);
  859.                 if ('string' === gettype($deleteGroups)) {
  860.                     $deleteGroups json_decode($deleteGroupstrue512JSON_THROW_ON_ERROR);
  861.                 }
  862.                 $this->modifyBroadcastGroups($multimediaObject$type$password$addGroups$deleteGroups);
  863.             } catch (\Exception $e) {
  864.                 return new JsonResponse(['error' => $e->getMessage()], JsonResponse::HTTP_BAD_REQUEST);
  865.             }
  866.             $embeddedBroadcast $multimediaObject->getEmbeddedBroadcast();
  867.             $jsonResponse = [
  868.                 'description' => (string) $embeddedBroadcast,
  869.                 'descriptioni18n' => $this->specialTranslatorService->getI18nEmbeddedBroadcast($embeddedBroadcast),
  870.                 'template' => $template,
  871.             ];
  872.             return new JsonResponse($jsonResponse);
  873.         }
  874.         return [
  875.             'mm' => $multimediaObject,
  876.             'broadcasts' => $broadcasts,
  877.             'groups' => $allGroups,
  878.             'template' => $template,
  879.         ];
  880.     }
  881.     public function userLastRelationAction(Request $request)
  882.     {
  883.         $loggedInUser $this->getUser();
  884.         $response null;
  885.         if (!$this->userService->hasPersonalScope($loggedInUser)) {
  886.             return new JsonResponse(falseResponse::HTTP_OK);
  887.         }
  888.         if ($request->isMethod('POST')) {
  889.             try {
  890.                 $mmId $request->get('mmId'null);
  891.                 $personId $request->get('personId'null);
  892.                 $owners $request->get('owners', []);
  893.                 $addGroups $request->get('addGroups', []);
  894.                 if ('string' === gettype($addGroups)) {
  895.                     $addGroups json_decode($addGroupstrue512JSON_THROW_ON_ERROR);
  896.                 }
  897.                 $response $this->userService->isUserLastRelation($loggedInUser$mmId$personId$owners$addGroups);
  898.             } catch (\Exception $e) {
  899.                 return new JsonResponse($e->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
  900.             }
  901.         }
  902.         return new JsonResponse($responseResponse::HTTP_OK);
  903.     }
  904.     /**
  905.      * @Template("@PumukitNewAdmin/MultimediaObject/listProperties.html.twig")
  906.      */
  907.     public function listPropertiesAction(MultimediaObject $multimediaObject)
  908.     {
  909.         return ['multimediaObject' => $multimediaObject];
  910.     }
  911.     /**
  912.      * @Security("is_granted('ROLE_ADD_EXTERNAL_PLAYER')")
  913.      *
  914.      * @Template("@PumukitNewAdmin/MultimediaObject/listExternalPlayer.html.twig")
  915.      */
  916.     public function listExternalPlayerAction(Request $request)
  917.     {
  918.         $seriesId $request->get('series');
  919.         $form $this->createFormBuilder()
  920.             ->setAction($this->generateUrl('pumukitnewadmin_mms_listexternalproperties', ['series' => $seriesId]))
  921.             ->add('title'TextType::class, ['required' => true'attr' => ['class' => 'form-control']])
  922.             ->add('url'UrlType::class, ['required' => true'attr' => ['class' => 'form-control']])
  923.             ->getForm()
  924.         ;
  925.         $form->handleRequest($request);
  926.         if ($form->isSubmitted() && $form->isValid() && $request->isMethod('POST')) {
  927.             $data $form->getData();
  928.             $series $this->seriesRepository->search($seriesId);
  929.             $multimediaObject $this->factoryService->createMultimediaObject($series);
  930.             $multimediaObject->setI18nTitle($this->i18nService->generateI18nText($data['title']));
  931.             $data['url'] = urldecode($data['url']);
  932.             $this->mediaCreator->createMediaFromExternalURL($multimediaObject$data['url']);
  933.             $this->documentManager->flush();
  934.             return $this->redirectToRoute('pumukitnewadmin_track_list', ['id' => $multimediaObject->getId()]);
  935.         }
  936.         return ['series' => $seriesId'form' => $form->createView()];
  937.     }
  938.     /**
  939.      * @Security("is_granted('ROLE_ADD_EXTERNAL_PLAYER')")
  940.      *
  941.      * @Template("@PumukitNewAdmin/MultimediaObject/updateExternalPlayer.html.twig")
  942.      */
  943.     public function updateExternalAction(Request $requestMultimediaObject $multimediaObject)
  944.     {
  945.         $form $this->createFormBuilder()
  946.             ->setAction($this->generateUrl('pumukitnewadmin_external_player_update', ['id' => $multimediaObject->getId()]))
  947.             ->add('title'TextType::class, ['required' => true'attr' => ['class' => 'form-control']])
  948.             ->add('url'UrlType::class, ['required' => true'attr' => ['class' => 'form-control']])
  949.             ->getForm()
  950.         ;
  951.         $form->handleRequest($request);
  952.         if ($form->isSubmitted() && $form->isValid() && $request->isMethod('POST')) {
  953.             $data $form->getData();
  954.             $multimediaObject->setTitle($data['title']);
  955.             $storage Storage::external(Url::create($data['url']));
  956.             $this->mediaUpdater->updateStorage($multimediaObject$multimediaObject->external()->first(), $storage);
  957.         }
  958.         return ['mm' => $multimediaObject'form' => $form->createView()];
  959.     }
  960.     /**
  961.      * @Template("@PumukitNewAdmin/MultimediaObject/modalPreview.html.twig")
  962.      */
  963.     public function modalPreviewAction(MultimediaObject $multimediaObject)
  964.     {
  965.         return [
  966.             'multimediaObject' => $multimediaObject,
  967.             'is_playable' => $this->multimediaObjectService->hasPlayableResource($multimediaObject),
  968.         ];
  969.     }
  970.     /**
  971.      * @Template("@PumukitNewAdmin/MultimediaObject/status.html.twig")
  972.      */
  973.     public function statusAction(MultimediaObject $mmRequest $request)
  974.     {
  975.         return ['mm' => $mm];
  976.     }
  977.     public function getCriteria($criteria)
  978.     {
  979.         $request $this->requestStack->getCurrentRequest();
  980.         $requestCriteria $request->get('criteria', []);
  981.         if (array_key_exists('reset'$requestCriteria)) {
  982.             $this->session->remove('admin/'.$this->getResourceName().'/criteria');
  983.         } elseif ($requestCriteria) {
  984.             $this->session->set('admin/'.$this->getResourceName().'/criteria'$requestCriteria);
  985.         }
  986.         $requestCriteria $this->session->get('admin/'.$this->getResourceName().'/criteria', []);
  987.         return $this->multimediaObjectSearchService->processMMOCriteria($requestCriteria$request->getLocale());
  988.     }
  989.     public function getResources(Request $request$criteria)
  990.     {
  991.         $sorting $this->getSorting($request$this->getResourceName());
  992.         $session $this->session;
  993.         $session_namespace 'admin/'.$this->getResourceName();
  994.         $resources $this->createPager($criteria$sorting);
  995.         if ($request->get('page'null)) {
  996.             $page = (int) $request->get('page'1);
  997.             if ($page 1) {
  998.                 $page 1;
  999.             }
  1000.             $session->set($session_namespace.'/page'$page);
  1001.         }
  1002.         if ($request->get('paginate'null)) {
  1003.             $session->set($session_namespace.'/paginate'$request->get('paginate'10));
  1004.         }
  1005.         $resources
  1006.             ->setMaxPerPage($session->get($session_namespace.'/paginate'10))
  1007.             ->setNormalizeOutOfRangePages(true)
  1008.             ->setCurrentPage($session->get($session_namespace.'/page'1))
  1009.         ;
  1010.         return $resources;
  1011.     }
  1012.     public function getSorting(Request $request null$session_namespace null): array
  1013.     {
  1014.         $session $this->session;
  1015.         if ($sorting $request->get('sorting')) {
  1016.             $session->set('admin/'.$session_namespace.'/type'current($sorting));
  1017.             $session->set('admin/'.$session_namespace.'/sort'key($sorting));
  1018.         }
  1019.         $value $session->get('admin/'.$session_namespace.'/type''desc');
  1020.         $key $session->get('admin/'.$session_namespace.'/sort''public_date');
  1021.         if ('title' == $key) {
  1022.             $key .= '.'.$request->getLocale();
  1023.         }
  1024.         return [$key => $value];
  1025.     }
  1026.     public function getResourceName(): string
  1027.     {
  1028.         $request $this->requestStack->getMasterRequest();
  1029.         $sRoute $request->get('_route');
  1030.         return (false === strpos($sRoute'all')) ? 'mms' 'mmslist';
  1031.     }
  1032.     public function updatePropertyAction(Request $request): JsonResponse
  1033.     {
  1034.         $multimediaObject $this->documentManager->getRepository(MultimediaObject::class)->findOneBy(['_id' => new ObjectId($request->get('id'))]);
  1035.         $method $request->getMethod();
  1036.         if (in_array($method, ['POST'])) {
  1037.             $multimediaObject->setProperty('paellalayout'$request->get('paellalayout'));
  1038.             $this->documentManager->flush();
  1039.         }
  1040.         return new JsonResponse(['paellalayout' => $multimediaObject->getProperty('paellalayout')]);
  1041.     }
  1042.     /**
  1043.      * @ParamConverter("multimediaObject", options={"id" = "id"})
  1044.      *
  1045.      * @Template("@PumukitNewAdmin/MultimediaObject/modalsyncmetadata.html.twig")
  1046.      */
  1047.     public function modalSyncMedatadaAction(Request $requestMultimediaObject $multimediaObject)
  1048.     {
  1049.         $locale $request->getLocale();
  1050.         $syncService $this->multimediaObjectSyncService;
  1051.         $tags $this->documentManager->getRepository(Tag::class)->findBy(
  1052.             [
  1053.                 'metatag' => true,
  1054.                 'display' => true,
  1055.             ],
  1056.             ['cod' => 1]
  1057.         );
  1058.         if (!$tags) {
  1059.             throw new \Exception($this->translator->trans('No tags defined with metatag'));
  1060.         }
  1061.         $roles $this->documentManager->getRepository(Role::class)->findBy([], ["name.{$locale}=> 1]);
  1062.         if (=== count($roles)) {
  1063.             throw new \Exception($this->translator->trans('No roles defined'));
  1064.         }
  1065.         return [
  1066.             'fields' => $syncService->getSyncFields(),
  1067.             'multimediaObject' => $multimediaObject,
  1068.             'tags' => $tags,
  1069.             'roles' => $roles,
  1070.         ];
  1071.     }
  1072.     public function updateMultimediaObjectSyncAction(Request $requestMultimediaObject $multimediaObject): JsonResponse
  1073.     {
  1074.         $message $this->translator->trans('Sync metadata was fail.');
  1075.         $syncService $this->multimediaObjectSyncService;
  1076.         $multimediaObjects $syncService->getMultimediaObjectsToSync($multimediaObject);
  1077.         $syncFieldsSelected $request->request->all();
  1078.         if (empty($syncFieldsSelected)) {
  1079.             $message $this->translator->trans('No fields selected to sync');
  1080.         }
  1081.         if ($multimediaObjects) {
  1082.             $syncService->syncMetadata($multimediaObjects$multimediaObject$syncFieldsSelected);
  1083.             $message $this->translator->trans('Sync metadata was done successfully');
  1084.         }
  1085.         return new JsonResponse($messageJsonResponse::HTTP_OK);
  1086.     }
  1087.     protected function updateTags($checkedTags$codStart$resource)
  1088.     {
  1089.         if (null !== $checkedTags) {
  1090.             foreach ($resource->getTags() as $tag) {
  1091.                 if ((== strpos($tag->getCod(), (string) $codStart)) && (false !== strpos($tag->getCod(), (string) $codStart))
  1092.                     && (!in_array($tag->getCod(), $checkedTags))
  1093.                     && (!$this->isGranted(Permission::getRoleTagDisableForPubChannel($tag->getCod())))) {
  1094.                     $resource->removeTag($tag);
  1095.                 }
  1096.             }
  1097.             foreach ($checkedTags as $cod => $checked) {
  1098.                 if (!$this->isGranted(Permission::getRoleTagDisableForPubChannel($cod))) {
  1099.                     $tag $this->factoryService->getTagsByCod($codfalse);
  1100.                     $resource->addTag($tag);
  1101.                 }
  1102.             }
  1103.         } else {
  1104.             foreach ($resource->getTags() as $tag) {
  1105.                 if ((== strpos($tag->getCod(), (string) $codStart))
  1106.                     && (false !== strpos($tag->getCod(), (string) $codStart))
  1107.                     && (!$this->isGranted(Permission::getRoleTagDisableForPubChannel($tag->getCod())))) {
  1108.                     $resource->removeTag($tag);
  1109.                 }
  1110.             }
  1111.         }
  1112.         return $resource;
  1113.     }
  1114.     protected function getListMultimediaObjects(Series $series$newMultimediaObjectId null)
  1115.     {
  1116.         $session $this->session;
  1117.         $page $session->get('admin/mms/page'1);
  1118.         $maxPerPage $session->get('admin/mms/paginate'10);
  1119.         $sorting = ['rank' => 'asc'];
  1120.         $mmsQueryBuilder $this->documentManager->getRepository(MultimediaObject::class)->getQueryBuilderOrderedBy($series$sorting);
  1121.         return $this->paginationService->createDoctrineODMMongoDBAdapter($mmsQueryBuilder, (int) $page, (int) $maxPerPage);
  1122.     }
  1123.     protected function dispatchUpdate(MultimediaObject $multimediaObject)
  1124.     {
  1125.         $event = new MultimediaObjectEvent($multimediaObject);
  1126.         $this->eventDispatcher->dispatch($eventSchemaEvents::MULTIMEDIAOBJECT_UPDATE);
  1127.     }
  1128.     // Workaround function to check if the VideoEditorBundle is installed.
  1129.     protected function checkHasEditor()
  1130.     {
  1131.         $routes $this->router->getRouteCollection()->all();
  1132.         return array_key_exists('pumukit_videoeditor_index'$routes);
  1133.     }
  1134.     protected function isUserAllowedToDelete(MultimediaObject $resource)
  1135.     {
  1136.         if (!$this->isGranted(Permission::MODIFY_OWNER)) {
  1137.             $loggedInUser $this->getUser();
  1138.             $person $this->personService->getPersonFromLoggedInUser($loggedInUser);
  1139.             $role $this->personService->getPersonalScopeRole();
  1140.             if (!$person
  1141.                 || !$resource->containsPersonWithRole($person$role)
  1142.                 || count($resource->getPeopleByRole($roletrue)) > 1) {
  1143.                 return false;
  1144.             }
  1145.         }
  1146.         return true;
  1147.     }
  1148.     private function getAllParents(Tag $element, array $tagsstring $top_parent): array
  1149.     {
  1150.         if ($element->getId() === $top_parent) {
  1151.             return $tags;
  1152.         }
  1153.         $parent $element->getParent();
  1154.         foreach ($tags as $tag) {
  1155.             if ($parent === $tag) {
  1156.                 return $tags;
  1157.             }
  1158.         }
  1159.         if (!== (int) $parent->getLevel()) {
  1160.             $tags[] = $parent;
  1161.         }
  1162.         return $this->getAllParents($parent$tags$top_parent);
  1163.     }
  1164.     private function modifyMultimediaObjectGroups(MultimediaObject $multimediaObject$addGroups = [], $deleteGroups = [])
  1165.     {
  1166.         $groupRepo $this->documentManager->getRepository(Group::class);
  1167.         foreach ($addGroups as $addGroup) {
  1168.             $groupIdArray explode('_'$addGroup);
  1169.             $groupId end($groupIdArray);
  1170.             $group $groupRepo->find($groupId);
  1171.             if ($group) {
  1172.                 $this->multimediaObjectService->addGroup($group$multimediaObjectfalse);
  1173.             }
  1174.         }
  1175.         foreach ($deleteGroups as $deleteGroup) {
  1176.             $groupIdArray explode('_'$deleteGroup);
  1177.             $groupId end($groupIdArray);
  1178.             $group $groupRepo->find($groupId);
  1179.             if ($group) {
  1180.                 $this->multimediaObjectService->deleteGroup($group$multimediaObjectfalse);
  1181.             }
  1182.         }
  1183.         $this->documentManager->flush();
  1184.     }
  1185.     private function modifyBroadcastGroups(MultimediaObject $multimediaObject$type EmbeddedBroadcast::TYPE_PUBLIC$password ''$addGroups = [], $deleteGroups = [])
  1186.     {
  1187.         $groupRepo $this->documentManager->getRepository(Group::class);
  1188.         $this->embeddedBroadcastService->updateTypeAndName($type$multimediaObjectfalse);
  1189.         if (EmbeddedBroadcast::TYPE_PASSWORD === $type) {
  1190.             $this->embeddedBroadcastService->updatePassword($password$multimediaObjectfalse);
  1191.         } elseif (EmbeddedBroadcast::TYPE_GROUPS === $type) {
  1192.             foreach ($addGroups as $addGroup) {
  1193.                 $groupIdArray explode('_'$addGroup);
  1194.                 $groupId end($groupIdArray);
  1195.                 $group $groupRepo->find($groupId);
  1196.                 if ($group) {
  1197.                     $this->embeddedBroadcastService->addGroup($group$multimediaObjectfalse);
  1198.                 }
  1199.             }
  1200.             foreach ($deleteGroups as $deleteGroup) {
  1201.                 $groupIdArray explode('_'$deleteGroup);
  1202.                 $groupId end($groupIdArray);
  1203.                 $group $groupRepo->find($groupId);
  1204.                 if ($group) {
  1205.                     $this->embeddedBroadcastService->deleteGroup($group$multimediaObjectfalse);
  1206.                 }
  1207.             }
  1208.         }
  1209.         if (EmbeddedBroadcast::TYPE_GROUPS !== $type) {
  1210.             $embeddedBroadcast $multimediaObject->getEmbeddedBroadcast();
  1211.             if ($embeddedBroadcast->getGroups()) {
  1212.                 foreach ($embeddedBroadcast->getGroups() as $group) {
  1213.                     $embeddedBroadcast->removeGroup($group);
  1214.                 }
  1215.             }
  1216.         }
  1217.         $this->documentManager->flush();
  1218.     }
  1219.     private function getResourceGroups($groups = [])
  1220.     {
  1221.         $addGroups = [];
  1222.         $deleteGroups = [];
  1223.         $addGroupsIds = [];
  1224.         $allGroupsIds = [];
  1225.         foreach ($groups as $group) {
  1226.             $addGroups[$group->getId()] = [
  1227.                 'key' => $group->getKey(),
  1228.                 'name' => $group->getName(),
  1229.                 'origin' => $group->getOrigin(),
  1230.             ];
  1231.             $addGroupsIds[] = new ObjectId($group->getId());
  1232.         }
  1233.         $allGroups $this->getAllGroups();
  1234.         foreach ($allGroups as $group) {
  1235.             $allGroupsIds[] = new ObjectId($group->getId());
  1236.         }
  1237.         $groupsToDelete $this->groupService->findByIdNotInOf($addGroupsIds$allGroupsIds);
  1238.         foreach ($groupsToDelete as $group) {
  1239.             $deleteGroups[$group->getId()] = [
  1240.                 'key' => $group->getKey(),
  1241.                 'name' => $group->getName(),
  1242.                 'origin' => $group->getOrigin(),
  1243.             ];
  1244.         }
  1245.         return ['addGroups' => $addGroups'deleteGroups' => $deleteGroups];
  1246.     }
  1247.     private function isUserStillRelated(MultimediaObject $multimediaObject)
  1248.     {
  1249.         $loggedInUser $this->getUser();
  1250.         $superAdmin $loggedInUser->hasRole('ROLE_SUPER_ADMIN');
  1251.         if ($superAdmin) {
  1252.             return true;
  1253.         }
  1254.         $globalScope $this->userService->hasGlobalScope($loggedInUser);
  1255.         if ($globalScope) {
  1256.             return true;
  1257.         }
  1258.         $userInOwners false;
  1259.         $personRepo $this->documentManager->getRepository(Person::class);
  1260.         foreach ((array) $multimediaObject->getProperty('owners') as $owner) {
  1261.             $person $personRepo->find($owner);
  1262.             if ($person) {
  1263.                 if ($loggedInUser === $person->getUser()) {
  1264.                     $userInOwners true;
  1265.                     break;
  1266.                 }
  1267.             }
  1268.         }
  1269.         if ($userInOwners) {
  1270.             return true;
  1271.         }
  1272.         $userInGroups false;
  1273.         $userGroups $loggedInUser->getGroups()->toArray();
  1274.         foreach ($multimediaObject->getGroups() as $mmGroup) {
  1275.             if (in_array($mmGroup$userGroups)) {
  1276.                 $userInGroups true;
  1277.                 break;
  1278.             }
  1279.         }
  1280.         if ($userInGroups) {
  1281.             return true;
  1282.         }
  1283.         return false;
  1284.     }
  1285.     private function renderList(MultimediaObject $resource$referer)
  1286.     {
  1287.         $mms $this->getListMultimediaObjects($resource->getSeries());
  1288.         return $this->render(
  1289.             '@PumukitNewAdmin/MultimediaObject/list.html.twig',
  1290.             [
  1291.                 'mms' => $mms,
  1292.                 'series' => $resource->getSeries(),
  1293.             ]
  1294.         );
  1295.     }
  1296.     private function updateSession(MultimediaObject $mm)
  1297.     {
  1298.         $session $this->session;
  1299.         $paginate $session->get('admin/mms/paginate'10);
  1300.         $page = (int) ceil($mm->getRank() / $paginate);
  1301.         if ($page 1) {
  1302.             $page 1;
  1303.         }
  1304.         $session->set('admin/mms/page'$page);
  1305.         $session->set('admin/mms/id'$mm->getId());
  1306.     }
  1307. }