From b55e35837461c32f2721e474054b3dda5c3a31cf Mon Sep 17 00:00:00 2001 From: Anees Khan Date: Sat, 30 Oct 2021 08:12:09 +0300 Subject: [PATCH] Add Multiple Notifiables --- src/ScheduledNotification.php | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/ScheduledNotification.php b/src/ScheduledNotification.php index 35704a8..060d832 100644 --- a/src/ScheduledNotification.php +++ b/src/ScheduledNotification.php @@ -15,6 +15,8 @@ use Thomasjohnkane\Snooze\Exception\NotificationCancelledException; use Thomasjohnkane\Snooze\Exception\SchedulingFailedException; use Thomasjohnkane\Snooze\Models\ScheduledNotification as ScheduledNotificationModel; +use Illuminate\Database\Eloquent\Collection as ModelCollection; + class ScheduledNotification { @@ -67,6 +69,56 @@ public static function create( ])); } + /** + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param Notification $notification + * @param DateTimeInterface $sendAt + * @param array $meta + * @return void + * + */ + public static function createMany( + $notifiables, + Notification $notification, + DateTimeInterface $sendAt, + array $meta = [] + ): void { + + if ($sendAt <= Carbon::now()->subMinute()) { + throw new SchedulingFailedException(sprintf('`send_at` must not be in the past: %s', + $sendAt->format(DATE_ISO8601))); + } + + $notifiables = self::formatNotifiables($notifiables); + + $modelClass = self::getScheduledNotificationModelClass(); + $serializer = app(Serializer::class); + + $scheduledNotifiables = []; + + foreach ($notifiables as $notifiable) { + + $targetId = $notifiable instanceof Model ? $notifiable->getKey() : null; + $targetType = $notifiable instanceof AnonymousNotifiable ? AnonymousNotifiable::class : get_class($notifiable); + + $scheduledNotifiables[] = [ + 'target_id' => $targetId, + 'target_type' => $targetType, + 'notification_type' => get_class($notification), + 'target' => $serializer->serialize($notifiable), + 'notification' => $serializer->serialize($notification), + 'send_at' => $sendAt, + 'meta' => json_encode($meta), + 'created_at' => now(), + 'updated_at' => now(), + ]; + + } + + $modelClass::insert($scheduledNotifiables); + + } + public static function find(int $scheduledNotificationId): ?self { $modelClass = self::getScheduledNotificationModelClass(); @@ -323,4 +375,20 @@ private static function collection(Collection $models): Collection return new self($model); }); } + + /** + * Format the notifiables into a Collection / array if necessary. + * + * @param mixed $notifiables + * @return \Illuminate\Database\Eloquent\Collection|array + */ + protected static function formatNotifiables($notifiables) + { + if (! $notifiables instanceof Collection && ! is_array($notifiables)) { + return $notifiables instanceof Model + ? new ModelCollection([$notifiables]) : [$notifiables]; + } + + return $notifiables; + } }