setName('wallabag:notification:send') ->setDescription('Emits a notification to all users') ->setHelp('This command helps you send notifications to all of the users instance, or just for one user.') ->addArgument( 'title', InputArgument::REQUIRED, 'Title of your notification. This is required if if the type of notification is an admin one.' ) ->addArgument( 'message', InputArgument::REQUIRED, 'Message of your notification. This is required if the type of notification is an admin one.' ) ->addOption( 'link', 'l', InputOption::VALUE_REQUIRED, 'A link to display with the notification' ) ; parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { $this->output = $output; $username = $input->getArgument('username'); $message = $input->getArgument('message'); $title = $input->getArgument('title'); $link = $input->getOption('link'); if ($username) { try { $user = $this->getUser($username); $this->sendNotification($user, $title, $message, $link); } catch (NoResultException $e) { $output->writeln(sprintf('User "%s" not found.', $username)); return 1; } } else { $users = $this->getDoctrine()->getRepository('WallabagUserBundle:User')->findAll(); $output->writeln(sprintf('Sending notifications to %d user accounts. This can take some time.', count($users))); foreach ($users as $user) { $output->writeln(sprintf('Processing user %s', $user->getUsername())); $this->sendNotification($user, $title, $message, $link); } $output->writeln('Finished sending notifications.'); } return 0; } /** * @param User $user * @param $title * @param $message * @param null $link */ private function sendNotification(User $user, $title, $message, $link = null) { $em = $this->getContainer()->get('doctrine.orm.entity_manager'); $notification = new Notification($user); $notification->setTitle($title) ->setDescription($message) ->setType(Notification::TYPE_ADMIN); if ($link) { $action = new InfoAction($link); $notification->addAction($action); } $em->persist($notification); $em->flush(); $this->output->writeln(sprintf('Sent notification for user %s', $user->getUserName())); } }