. */ 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\EmailDriver; use Poniverse\Ponyfm\Library\Notifications\Drivers\NativeDriver; use Poniverse\Ponyfm\Library\Notifications\Drivers\PonyfmDriver; use Poniverse\Ponyfm\Models\Activity; use Poniverse\Ponyfm\Models\Comment; use Poniverse\Ponyfm\Models\Playlist; use Poniverse\Ponyfm\Models\Subscription; 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(); case EmailDriver::class: return $track->user->followers()->whereHas('emailSubscriptions', function($query) { $query->where('activity_type', Activity::TYPE_PUBLISHED_TRACK); })->get(); case NativeDriver::class: $followerIds = []; $subIds = []; $rawSubIds = Subscription::select('id')->get(); foreach ($track->user->followers as $follower) { array_push($followerIds, $follower->id); } foreach ($rawSubIds as $sub) { array_push($subIds, $sub->id); } $targetIds = array_intersect($followerIds, $subIds); return Subscription::whereIn('user_id', $targetIds)->get(); default: return $this->fail(); } } /** * @inheritdoc */ public function publishedNewPlaylist(Playlist $playlist) { switch ($this->notificationDriver) { case PonyfmDriver::class: return $playlist->user->followers; case NativeDriver::class: $followerIds = []; $subIds = []; $rawSubIds = Subscription::select('id')->get(); foreach ($playlist->user->followers as $follower) { array_push($followerIds, $follower->id); } foreach ($rawSubIds as $sub) { array_push($subIds, $sub->id); } $targetIds = array_intersect($followerIds, $subIds); return Subscription::whereIn('user_id', $targetIds)->get(); default: return $this->fail(); } } /** * @inheritdoc */ public function newFollower(User $userBeingFollowed, User $follower) { switch ($this->notificationDriver) { case PonyfmDriver::class: case EmailDriver::class: return [$userBeingFollowed]; case NativeDriver::class: return Subscription::where('user_id', '=', $userBeingFollowed->id)->get(); 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]; case NativeDriver::class: return Subscription::where('user_id', '=', $comment->resource->user->id)->get(); 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]; case NativeDriver::class: return Subscription::where('user_id', '=', $entityBeingFavourited->user->id)->get(); default: return $this->fail(); } } }