src/Pumukit/NotificationBundle/Services/JobNotificationService.php line 77

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Pumukit\NotificationBundle\Services;
  4. use Doctrine\ODM\MongoDB\DocumentManager;
  5. use Pumukit\EncoderBundle\Document\Job;
  6. use Pumukit\EncoderBundle\Event\JobEvent;
  7. use Pumukit\EncoderBundle\Services\JobRender;
  8. use Pumukit\SchemaBundle\Document\MultimediaObject;
  9. use Pumukit\SchemaBundle\Document\User;
  10. use Pumukit\SchemaBundle\Security\Permission;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Symfony\Component\Routing\RouterInterface;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. class JobNotificationService
  15. {
  16.     public const PERSONAL_SCOPE_ROLE_CODE 'owner';
  17.     protected $dm;
  18.     protected $senderService;
  19.     protected $translator;
  20.     protected $router;
  21.     protected $enable;
  22.     protected $environment;
  23.     protected $template;
  24.     protected $subjectSuccess;
  25.     protected $subjectFails;
  26.     protected $subjectSuccessTrans;
  27.     protected $subjectFailsTrans;
  28.     private JobRender $jobRender;
  29.     public function __construct(
  30.         DocumentManager $documentManager,
  31.         SenderService $senderService,
  32.         TranslatorInterface $translator,
  33.         RouterInterface $router,
  34.         JobRender $jobRender,
  35.         $enable,
  36.         $environment,
  37.         $template,
  38.         $subjectSuccess,
  39.         $subjectFails,
  40.         $subjectSuccessTrans,
  41.         $subjectFailsTrans
  42.     ) {
  43.         $this->dm $documentManager;
  44.         $this->senderService $senderService;
  45.         $this->translator $translator;
  46.         $this->router $router;
  47.         $this->enable $enable;
  48.         $this->environment $environment;
  49.         $this->template $template;
  50.         $this->subjectSuccess $subjectSuccess;
  51.         $this->subjectFails $subjectFails;
  52.         $this->subjectSuccessTrans $subjectSuccessTrans;
  53.         $this->subjectFailsTrans $subjectFailsTrans;
  54.         $this->jobRender $jobRender;
  55.     }
  56.     /**
  57.      * On job success.
  58.      *
  59.      * @return bool
  60.      */
  61.     public function onJobSuccess(JobEvent $event)
  62.     {
  63.         return $this->sendJobNotification($eventfalse);
  64.     }
  65.     /**
  66.      * On job error.
  67.      *
  68.      * @return bool
  69.      */
  70.     public function onJobError(JobEvent $event)
  71.     {
  72.         return $this->sendJobNotification($eventtrue);
  73.     }
  74.     /**
  75.      * Send job notification according if the job
  76.      * was succeeded or not.
  77.      *
  78.      * @param bool $error
  79.      *
  80.      * @return bool
  81.      */
  82.     protected function sendJobNotification(JobEvent $event$error false)
  83.     {
  84.         if ($this->enable) {
  85.             $job $event->getJob();
  86.             $track $event->getMedia();
  87.             if (!$error && ($track->isMaster() && !$track->tags()->containsTag('display'))) {
  88.                 return false;
  89.             }
  90.             $multimediaObject $event->getMultimediaObject();
  91.             if (!($emailsTo $this->getEmails($job$multimediaObject))) {
  92.                 return false;
  93.             }
  94.             $subject $this->getSubjectEmail($job$error);
  95.             $subjectInParameters $this->getSubjectEmailInParameters($job$error);
  96.             $parameters $this->getParametersEmail($job$multimediaObject$subjectInParameters);
  97.             if (!$emailsTo) {
  98.                 return false;
  99.             }
  100.             if (is_array($emailsTo)) {
  101.                 $output false;
  102.                 foreach ($emailsTo as $email) {
  103.                     $output $this->senderService->sendNotification($email$subject$this->template$parameters$errortrue);
  104.                 }
  105.             } else {
  106.                 $output $this->senderService->sendNotification($emailsTo$subject$this->template$parameters$errortrue);
  107.             }
  108.             return $output;
  109.         }
  110.         return false;
  111.     }
  112.     /**
  113.      * Get message.
  114.      *
  115.      * @param bool $error
  116.      *
  117.      * @return string
  118.      */
  119.     protected function getMessage(Job $job$error false)
  120.     {
  121.         if ($error) {
  122.             return $this->subjectFails;
  123.         }
  124.         return $this->subjectSuccess;
  125.     }
  126.     /**
  127.      * Get subject email in parameters.
  128.      *
  129.      * @param bool $error
  130.      *
  131.      * @return string
  132.      */
  133.     protected function getSubjectEmailInParameters(Job $job$error false)
  134.     {
  135.         $message $this->getMessage($job$error);
  136.         return ($this->senderService->getPlatformName() ? $this->senderService->getPlatformName().': ' '').$message;
  137.     }
  138.     /**
  139.      * Get subject email.
  140.      *
  141.      * @param bool $error
  142.      *
  143.      * @return string
  144.      */
  145.     protected function getSubjectEmail(Job $job$error false)
  146.     {
  147.         if (!$this->senderService->isMultiLangEnabled()) {
  148.             return $this->getSubjectEmailInParameters($job$error);
  149.         }
  150.         if ($error) {
  151.             $subjectTrans $this->subjectFailsTrans;
  152.         } else {
  153.             $subjectTrans $this->subjectSuccessTrans;
  154.         }
  155.         $message '';
  156.         foreach ($subjectTrans as $translation) {
  157.             if (isset($translation['subject'])) {
  158.                 $slash $message ' / ' '';
  159.                 $message $message.$slash.$translation['subject'];
  160.             }
  161.         }
  162.         return ($this->senderService->getPlatformName() ? $this->senderService->getPlatformName().': ' '').$message;
  163.     }
  164.     /**
  165.      * Get parameters email.
  166.      *
  167.      * @param string $subject
  168.      *
  169.      * @return array
  170.      */
  171.     protected function getParametersEmail(Job $jobMultimediaObject $multimediaObject$subject)
  172.     {
  173.         $multimediaObjectAdminLink $this->getMultimediaObjectAdminLink($multimediaObject$job->getMmId());
  174.         return [
  175.             'subject' => $subject,
  176.             'job_status' => Job::$statusTexts[$job->getStatus()],
  177.             'job' => $job,
  178.             'commandLine' => $this->jobRender->renderBat($job),
  179.             'sender_name' => $this->senderService->getSenderName(),
  180.             'platform_name' => $this->senderService->getPlatformName(),
  181.             'multimedia_object_admin_link' => $multimediaObjectAdminLink,
  182.             'multimedia_object' => $multimediaObject,
  183.         ];
  184.     }
  185.     /**
  186.      * Get emails.
  187.      *
  188.      * @return array|string
  189.      */
  190.     protected function getEmails(Job $jobMultimediaObject $multimediaObject)
  191.     {
  192.         $emailsTo = [];
  193.         if (Job::STATUS_FINISHED === $job->getStatus()) {
  194.             $aPeople $multimediaObject->getPeopleByRoleCod(self::PERSONAL_SCOPE_ROLE_CODEtrue);
  195.             foreach ($aPeople as $people) {
  196.                 $user $this->dm->getRepository(User::class)->findOneBy(['email' => $people->getEmail()]);
  197.                 if ($user && ($user->hasRole(Permission::ROLE_SEND_NOTIFICATION_COMPLETE) || $user->hasRole('ROLE_SUPER_ADMIN'))) {
  198.                     $emailsTo[] = $user->getEmail();
  199.                 }
  200.             }
  201.         } elseif (Job::STATUS_ERROR === $job->getStatus()) {
  202.             $aPeople $multimediaObject->getPeopleByRoleCod(self::PERSONAL_SCOPE_ROLE_CODEtrue);
  203.             foreach ($aPeople as $people) {
  204.                 $user $this->dm->getRepository(User::class)->findOneBy(['email' => $people->getEmail()]);
  205.                 if ($user && ($user->hasRole(Permission::ROLE_SEND_NOTIFICATION_ERRORS) || $user->hasRole('ROLE_SUPER_ADMIN'))) {
  206.                     $emailsTo[] = $user->getEmail();
  207.                 }
  208.             }
  209.         }
  210.         return $emailsTo;
  211.     }
  212.     private function getMultimediaObjectAdminLink(MultimediaObject $multimediaObject$id ''): string
  213.     {
  214.         return $this->router->generate(
  215.             'pumukitnewadmin_mms_shortener',
  216.             ['id' => $multimediaObject->getId()],
  217.             UrlGeneratorInterface::ABSOLUTE_URL
  218.         );
  219.     }
  220. }