. */ namespace Poniverse\Ponyfm\Library\Notifications; use Illuminate\Foundation\Bus\DispatchesJobs; use Poniverse\Ponyfm\Contracts\Favouritable; use Poniverse\Ponyfm\Contracts\NotificationHandler; use Poniverse\Ponyfm\Jobs\SendNotifications; use Poniverse\Ponyfm\Library\Notifications\Drivers\PonyfmDriver; use Poniverse\Ponyfm\Models\Comment; use Poniverse\Ponyfm\Models\Playlist; use Poniverse\Ponyfm\Models\Track; use Poniverse\Ponyfm\Models\User; /** * Class RecipientFinder * @package Poniverse\Ponyfm\Library\Notifications * * This class returns a list of users who are to receive a particular notification. * It is instantiated on a per-driver basis. */ class RecipientFinder implements NotificationHandler { /** * @var string class name of a notification driver */ private $notificationDriver; public function __construct(string $notificationDriver) { $this->notificationDriver = $notificationDriver; } private function fail() { throw new \InvalidArgumentException("Unknown notification driver given: {$this->notificationDriver}"); } /** * @inheritdoc */ public function publishedNewTrack(Track $track) { switch ($this->notificationDriver) { case PonyfmDriver::class: return $track->user->followers; default: return $this->fail(); } } /** * @inheritdoc */ public function publishedNewPlaylist(Playlist $playlist) { switch ($this->notificationDriver) { case PonyfmDriver::class: return $playlist->user->followers; default: return $this->fail(); } } /** * @inheritdoc */ public function newFollower(User $userBeingFollowed, User $follower) { switch ($this->notificationDriver) { case PonyfmDriver::class: return [$userBeingFollowed]; default: return $this->fail(); } } /** * @inheritdoc */ public function newComment(Comment $comment) { switch ($this->notificationDriver) { case PonyfmDriver::class: return $comment->user->id === $comment->resource->user->id ? [] : [$comment->resource->user]; default: return $this->fail(); } } /** * @inheritdoc */ public function newFavourite(Favouritable $entityBeingFavourited, User $favouriter) { switch ($this->notificationDriver) { case PonyfmDriver::class: return $favouriter->id === $entityBeingFavourited->user->id ? [] : [$entityBeingFavourited->user]; default: return $this->fail(); } } }