speakerQuery = $speakerQuery; $this->projectQuery = $projectQuery; $this->eventQuery = $eventQuery; $this->eventFactory = $eventFactory; $this->manager = $manager; $this->openSSL = $openSSL; } protected function getSpeakers(): array { $speakers = $this->speakerQuery->withCalendar()->find(); foreach ($speakers as $speaker) { $this->openSSL->decryptEntity($speaker); } return $speakers; } protected function getProjects(): array { return $this->projectQuery->find(); } protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); $speakers = $this->getSpeakers(); $projects = $this->getProjects(); foreach ($speakers as $speaker) { $client = new CaldavClient( $speaker->getCaldavHost(), $speaker->getCaldavUsername(), $speaker->getCaldavPassword() ); $this->openSSL->encryptEntity($speaker); $calEvents = $client->getEvents($speaker->getCaldavCalendarUri()); foreach ($projects as $project) { foreach ($calEvents as $calEvent) { $regex = sprintf('/%s/', preg_quote($project->getCaldavEventTag())); if (!preg_match($regex, $calEvent->getDescription())) { continue; } $event = $this->addEvent($project, $calEvent, $speaker); $output->writeln(sprintf( 'Évènement [%s] %s importé', $event->getStartAt()->format('d/m/Y H:i'), $event->getSummary() )); } } } return Command::SUCCESS; } protected function addEvent(Project $project, CalEvent $calEvent, Speaker $speaker): Event { $event = $this->eventQuery->create() ->where('.uid = :uid') ->setParameter('uid', $calEvent->getUid()) ->findOne(); if (!$event) { $event = $this->eventFactory->createFromEvent($calEvent); } else { $this->eventFactory->updateFromEvent($event, $calEvent); } $project->addEvent($event); $speaker->addEvent($event); $this->manager->update($event); $this->manager->update($speaker); return $event; } }