X-Git-Url: https://git.rapsys.eu/airbundle/blobdiff_plain/388e31d27d2e600c0dbc1a83ab32c110184426ee..f8be49baba0c388737996a8d4489a61c5c07c8b5:/Command/CalendarCommand.php

diff --git a/Command/CalendarCommand.php b/Command/CalendarCommand.php
index a61923f..003910a 100644
--- a/Command/CalendarCommand.php
+++ b/Command/CalendarCommand.php
@@ -1,4 +1,13 @@
-<?php
+<?php declare(strict_types=1);
+
+/*
+ * This file is part of the Rapsys AirBundle package.
+ *
+ * (c) Raphaël Gertz <symfony@rapsys.eu>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
 namespace Rapsys\AirBundle\Command;
 
@@ -10,11 +19,14 @@ use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Routing\RouterInterface;
-use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
 use Twig\Extra\Markdown\DefaultMarkdown;
 
+use Rapsys\AirBundle\Command;
 use Rapsys\AirBundle\Entity\Session;
 
+use Rapsys\PackBundle\Util\SluggerUtil;
+
 class CalendarCommand extends Command {
 	//Set failure constant
 	const FAILURE = 1;
@@ -22,45 +34,67 @@ class CalendarCommand extends Command {
 	///Set success constant
 	const SUCCESS = 0;
 
-	///Config array
-	protected $config;
-
 	/**
 	 * Doctrine instance
 	 *
 	 * @var ManagerRegistry
 	 */
-	protected $doctrine;
+	protected ManagerRegistry $doctrine;
+
+	///Router
+	protected RouterInterface $router;
+
+	///Slugger
+	protected SluggerUtil $slugger;
+
+	///Translator instance
+	protected TranslatorInterface $translator;
 
 	///Locale
 	protected $locale;
 
-	///Translator instance
-	protected $translator;
+	///Lifetime string
+	protected $lifetime;
+
+	///Namespace string
+	protected $namespace;
+
+	///Path string
+	protected $path;
 
 	/**
-	 * Inject doctrine, container and translator interface
+	 * Creates new calendar command
 	 *
-	 * @param ContainerInterface $container The container instance
 	 * @param ManagerRegistry $doctrine The doctrine instance
 	 * @param RouterInterface $router The router instance
+	 * @param SluggerUtil $slugger The slugger instance
 	 * @param TranslatorInterface $translator The translator instance
+	 * @param string $namespace The cache namespace
+	 * @param int $lifetime The cache lifetime
+	 * @param string $path The cache path
+	 * @param string $locale The default locale
 	 */
-    public function __construct(ContainerInterface $container, ManagerRegistry $doctrine, RouterInterface $router, TranslatorInterface $translator) {
+	public function __construct(ManagerRegistry $doctrine, RouterInterface $router, SluggerUtil $slugger, TranslatorInterface $translator, string $namespace, int $lifetime, string $path, string $locale) {
 		//Call parent constructor
 		parent::__construct();
 
-		//Retrieve config
-		$this->config = $container->getParameter($this->getAlias());
+		//Store doctrine
+		$this->doctrine = $doctrine;
 
-		//Retrieve locale
-		$this->locale = $container->getParameter('kernel.default_locale');
+		//Set lifetime
+		$this->lifetime = $lifetime;
 
-		//Store doctrine
-        $this->doctrine = $doctrine;
+		//Set namespace
+		$this->namespace = $namespace;
+
+		//Set path
+		$this->path = $path;
 
 		//Store router
-        $this->router = $router;
+		$this->router = $router;
+
+		//Retrieve slugger
+		$this->slugger = $slugger;
 
 		//Get router context
 		$context = $this->router->getContext();
@@ -88,7 +122,7 @@ class CalendarCommand extends Command {
 	}
 
 	///Process the attribution
-	protected function execute(InputInterface $input, OutputInterface $output) {
+	protected function execute(InputInterface $input, OutputInterface $output): int {
 		//Compute period
 		$period = new \DatePeriod(
 			//Start from last week
@@ -108,7 +142,7 @@ class CalendarCommand extends Command {
 		//Retrieve cache object
 		//XXX: by default stored in /tmp/symfony-cache/@/W/3/6SEhFfeIW4UMDlAII+Dg
 		//XXX: stored in %kernel.project_dir%/var/cache/airlibre/0/P/IA20X0K4dkMd9-+Ohp9Q
-		$cache = new FilesystemAdapter($this->config['cache']['namespace'], $this->config['cache']['lifetime'], $this->config['path']['cache']);
+		$cache = new FilesystemAdapter($this->namespace, $this->lifetime, $this->path);
 
 		//Retrieve calendars
 		$cacheCalendars = $cache->getItem('calendars');
@@ -178,6 +212,8 @@ class CalendarCommand extends Command {
 						$cache->save($cacheCalendars);
 
 						//Drop token and report
+						//XXX: submit app to avoid expiration
+						//XXX: see https://console.cloud.google.com/apis/credentials/consent?project=calendar-317315
 						echo 'Token '.$tokenId.' for calendar '.$token['calendar'].' has expired and is not refreshable'."\n";
 
 						//Return failure
@@ -288,12 +324,16 @@ class CalendarCommand extends Command {
 
 					//Init source
 					$source = [
-						'title' => $this->translator->trans('Session %id% by %pseudonym%', ['%id%' => $sessionId, '%pseudonym%' => $session['au_pseudonym']]).' '.$this->translator->trans('at '.$session['l_title']),
-						'url' => $this->router->generate('rapsys_air_session_view', ['id' => $sessionId], UrlGeneratorInterface::ABSOLUTE_URL)
+						'title' => $this->translator->trans('%dance% %id% by %pseudonym%', ['%id%' => $sessionId, '%dance%' => $this->translator->trans($session['ad_name'].' '.lcfirst($session['ad_type'])), '%pseudonym%' => $session['au_pseudonym']]).' '.$this->translator->trans('at '.$session['l_title']),
+						'url' => $this->router->generate('rapsys_air_session_view', ['id' => $sessionId, 'location' => $this->slugger->slug($this->translator->trans($session['l_title'])), 'dance' => $this->slugger->slug($this->translator->trans($session['ad_name'].' '.lcfirst($session['ad_type']))), 'user' => $this->slugger->slug($session['au_pseudonym'])], UrlGeneratorInterface::ABSOLUTE_URL)
 					];
 
-					//Init description
-					$description = 'Description :'."\n".strip_tags(preg_replace('!<a href="([^"]+)"(?: title="[^"]+")?'.'>([^<]+)</a>!', '\1', $markdown->convert(strip_tags($session['p_description']))));
+					//Init location
+					$description = 'Emplacement :'."\n".$this->translator->trans($session['l_description']);
+					$shared['location'] = $markdown->convert(strip_tags($session['l_description']));
+
+					//Add description
+					$description .= "\n\n".'Description :'."\n".strip_tags(preg_replace('!<a href="([^"]+)"(?: title="[^"]+")?'.'>([^<]+)</a>!', '\1', $markdown->convert(strip_tags($session['p_description']))));
 					$shared['description'] = $markdown->convert(strip_tags($session['p_description']));
 
 					//Add class when available
@@ -352,7 +392,8 @@ class CalendarCommand extends Command {
 								//TODO: replace 'airlibre' with $this->config['calendar']['prefix'] when possible with prefix validating [a-v0-9]{5,}
 								//XXX: see https://developers.google.com/calendar/api/v3/reference/events/insert#id
 								'id' => $token['prefix'].$sessionId,
-								'summary' => $session['au_pseudonym'].' '.$this->translator->trans('at '.$session['l_short']),
+								#'summary' => $session['au_pseudonym'].' '.$this->translator->trans('at '.$session['l_title']),
+								'summary' => $source['title'],
 								#'description' => $markdown->convert(strip_tags($session['p_description'])),
 								'description' => $description,
 								'status' => empty($session['a_canceled'])?'confirmed':'cancelled',
@@ -393,7 +434,8 @@ class CalendarCommand extends Command {
 						//With updated event
 						if ($session['updated'] >= (new \DateTime($event->getUpdated()))) {
 							//Set summary
-							$event->setSummary($session['au_pseudonym'].' '.$this->translator->trans('at '.$session['l_short']));
+							#$event->setSummary($session['au_pseudonym'].' '.$this->translator->trans('at '.$session['l_title']));
+							$event->setSummary($source['title']);
 
 							//Set description
 							$event->setDescription($description);