Add TalkCollection, move logic for getting events

Add a `TalkCollection` which extends Laravel/Tighten's, and add a method
there for getting the events from the talks. This makes this logic more
reusable and also makes the code in the `TalkCounter` service simpler.
This commit is contained in:
Oliver Davies 2021-02-10 07:54:43 +00:00
parent 1f0926ac16
commit 0c1321fed5
3 changed files with 30 additions and 15 deletions

View file

@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace Drupal\opdavies_talks\Collection;
use Drupal\opdavies_talks\Entity\Node\Talk;
use Drupal\paragraphs\ParagraphInterface;
use Tightenco\Collect\Support\Collection;
final class TalkCollection extends Collection {
/**
* Return the events for the talks in the Collection.
*
* @return Collection|ParagraphInterface[]
*/
public function getEvents(): Collection {
return $this->flatMap(fn(Talk $talk): Collection => $talk->getEvents());
}
}

View file

@ -7,8 +7,7 @@ namespace Drupal\opdavies_talks\Repository;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\node\NodeInterface;
use Drupal\opdavies_talks\Entity\Node\Talk;
use Tightenco\Collect\Support\Collection;
use Drupal\opdavies_talks\Collection\TalkCollection;
final class TalkRepository {
@ -18,19 +17,13 @@ final class TalkRepository {
$this->nodeStorage = $entityTypeManager->getStorage('node');
}
/**
* @return Collection|Talk[]
*/
public function findAll(): Collection {
public function findAll(): TalkCollection {
$talks = $this->nodeStorage->loadByProperties($this->defaultProperties());
return new Collection($talks);
return new TalkCollection($talks);
}
/**
* @return Collection|Talk[]
*/
public function findAllPublished(): Collection {
public function findAllPublished(): TalkCollection {
$talks = $this->nodeStorage->loadByProperties(array_merge(
$this->defaultProperties(),
[
@ -38,7 +31,7 @@ final class TalkRepository {
],
));
return new Collection($talks);
return new TalkCollection($talks);
}
private function defaultProperties(): array {

View file

@ -5,7 +5,6 @@ declare(strict_types=1);
namespace Drupal\opdavies_talks\Service;
use Carbon\Carbon;
use Drupal\opdavies_talks\Entity\Node\Talk;
use Drupal\opdavies_talks\Repository\TalkRepository;
use Drupal\paragraphs\ParagraphInterface;
@ -22,8 +21,9 @@ final class TalkCounter {
return $this->talkRepository
->findAllPublished()
->flatMap(fn(Talk $talk) => $talk->getEvents())
->filter(fn(ParagraphInterface $event) => $event->get('field_date')->getString() <= $today)
->getEvents()
->filter(fn(ParagraphInterface $event) => $event->get('field_date')
->getString() <= $today)
->count();
}