laravel-notification-channels / onesignal

OneSignal notifications channel for Laravel
MIT License
283 stars 119 forks source link

App\User::routeNotificationForOneSignal must return a relationship instance #74

Closed varqasim closed 5 years ago

varqasim commented 6 years ago

I have a table that stores the player_id of all my users. The relationship for my User model has a function that returns all the instances on the database for said user.

public function pushNotificationDevices() {
        return $this->hasMany('App\PushNotificationDevice');
    }

In the documentation it said to return either a single string of player_id or an array. Which you can see at the bottom of how I am returning the player_id. For some reason I get the following error whenever I try to return the array of player_ids App\User::routeNotificationForOneSignal must return a relationship instance. When returning an instance of PushNotificationDevice I get an internal error whenever the OneSignal notification is fired, which I suspect because I am returning a whole instance of PushNotificationDevice and not just an array of strings. Any ideas?

public function routeNotificationForOneSignal()
    {
        return $this->pushNotificationDevices()->pluck('player_id')->toArray();
    }
LKaemmerling commented 6 years ago

could you please dd the result from routeNotificationForOneSignal() ? (Just call it and dd the result). Then you should know what is returned from the method.

varqasim commented 6 years ago

Do you mean to dd the $this->pushNotificationDevices()->pluck('player_id')->toArray() call or the function when it's called in the Notification? I attached the dd result of $this->pushNotificationDevices()->pluck('player_id')->toArray();

screen shot 2018-07-18 at 10 29 09 pm

AshPowell commented 6 years ago

@qasimalbaqali That looks fine to me? Maybe the issue is somewhere else? What does your code look like to send the notification? and then what is your code like in the notification file? ie. the Via and toOneSignal methods

varqasim commented 6 years ago

This is the code that I have in my Notification

public function toOneSignal($notifiable)
    {
        try {
            $reservation = $this->reservation;
            $pool = $this->reservation->timeSlot->pool;

            if ($notifiable->locale === 'en') {
                $subject = "A reservation has been made!";
                $body = sprintf(
                    "A reservation on your property %s has been made on %s.",
                    $pool->en_name,
                    $reservation->booking_date);
            } else {
                $subject = "تم حجز استراحتك!";
                $body = sprintf(
                    "تم حجز استراحتك %s في تاريخ %s",
                    $pool->ar_name,
                    $reservation->booking_date);
            }

            return OneSignalMessage::create()
                ->subject($subject)
                ->body($body);
        } catch (RequestException $exception) {
            \Log::error('OneSignal:Reservation'.$reservation->id.':Message'.$exception->getMessage());
        } catch (\Exception $exception) {
            \Log::error('OneSignal:Reservation'.$reservation->id.':Message'.$exception->getMessage());
        }
    }

I have two other channels, email and nexmo which work fine. It errors out when it reaches the OneSignal channel only. I tried to wrap the call in a try catch block, but it never hits the catch instead it throws an exception which isn't caught.

ocal.ERROR: Server error: `POST https://onesignal.com/api/v1/notifications` resulted in a `500 Internal Server Error` response:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>500 &bull; OneSignal</title>
<style>
    html, bod (truncated...)
 {"userId":1,"email":"qasim@qasim.com","exception":"[object] (GuzzleHttp\\Exception\\ServerException(code: 500): Server error: `POST https://onesignal.com/api/v1/notifications` resulted in a `500 Internal Server Error` response:
<!DOCTYPE html>
<html lang=\"en\">
<head>
<meta charset=\"UTF-8\">
<title>500 &bull; OneSignal</title>
<style>
    html, bod (truncated...)
 at /home/website/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:113)
[stacktrace]
#0 /home/website/vendor/guzzlehttp/guzzle/src/Middleware.php(66): GuzzleHttp\\Exception\\RequestException::create(Object(GuzzleHttp\\Psr7\\Request), Object(GuzzleHttp\\Psr7\\Response))
#1 /home/website/vendor/guzzlehttp/promises/src/Promise.php(203): GuzzleHttp\\Middleware::GuzzleHttp\\{closure}(Object(GuzzleHttp\\Psr7\\Response))
#2 /home/website/vendor/guzzlehttp/promises/src/Promise.php(156): GuzzleHttp\\Promise\\Promise::callHandler(1, Object(GuzzleHttp\\Psr7\\Response), Array)
#3 /home/website/vendor/guzzlehttp/promises/src/TaskQueue.php(47): GuzzleHttp\\Promise\\Promise::GuzzleHttp\\Promise\\{closure}()
#4 /home/website/vendor/guzzlehttp/promises/src/Promise.php(246): GuzzleHttp\\Promise\\TaskQueue->run(true)
#5 /home/website/vendor/guzzlehttp/promises/src/Promise.php(223): GuzzleHttp\\Promise\\Promise->invokeWaitFn()
#6 /home/website/vendor/guzzlehttp/promises/src/Promise.php(267): GuzzleHttp\\Promise\\Promise->waitIfPending()
#7 /home/website/vendor/guzzlehttp/promises/src/Promise.php(225): GuzzleHttp\\Promise\\Promise->invokeWaitList()
#8 /home/website/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\\Promise\\Promise->waitIfPending()
#9 /home/website/vendor/guzzlehttp/guzzle/src/Client.php(131): GuzzleHttp\\Promise\\Promise->wait()
#10 /home/website/vendor/guzzlehttp/guzzle/src/Client.php(89): GuzzleHttp\\Client->request('post', 'https://onesign...', Array)
#11 /home/website/vendor/berkayk/onesignal-laravel/src/OneSignalClient.php(292): GuzzleHttp\\Client->__call('post', Array)
#12 /home/website/vendor/berkayk/onesignal-laravel/src/OneSignalClient.php(240): Berkayk\\OneSignal\\OneSignalClient->post('/notifications')
#13 /home/website/vendor/laravel-notification-channels/onesignal/src/OneSignalChannel.php(37): Berkayk\\OneSignal\\OneSignalClient->sendNotificationCustom(Array)
#14 /home/website/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(113): NotificationChannels\\OneSignal\\OneSignalChannel->send(Object(App\\User), Object(App\\Notifications\\Owner\\ReservationConfirmedOwner))
#15 /home/website/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(89): Illuminate\\Notifications\\NotificationSender->sendToNotifiable(Object(App\\User), 'b8f45599-31b1-4...', Object(App\\Notifications\\Owner\\ReservationConfirmedOwner), 'NotificationCha...')
#16 /home/website/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(64): Illuminate\\Notifications\\NotificationSender->sendNow(Object(Illuminate\\Database\\Eloquent\\Collection), Object(App\\Notifications\\Owner\\ReservationConfirmedOwner))
#17 /home/website/vendor/laravel/framework/src/Illuminate/Notifications/ChannelManager.php(35): Illuminate\\Notifications\\NotificationSender->send(Object(Illuminate\\Database\\Eloquent\\Collection), Object(App\\Notifications\\Owner\\ReservationConfirmedOwner))
#18 /home/website/vendor/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php(18): Illuminate\\Notifications\\ChannelManager->send(Object(App\\User), Object(App\\Notifications\\Owner\\ReservationConfirmedOwner))
#19 /home/website/app/Http/Controllers/Api/Admin/ReservationController.php(78): App\\User->notify(Object(App\\Notifications\\Owner\\ReservationConfirmedOwner))
#20 [internal function]: App\\Http\\Controllers\\Api\\Admin\\ReservationController->confirmReservation('25')
#21 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#22 /home/website/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('confirmReservat...', Array)
#23 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Api\\Admin\\ReservationController), 'confirmReservat...')
#24 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\\Routing\\Route->runController()
#25 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\\Routing\\Route->run()
#26 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))
#27 /home/website/vendor/santigarcor/laratrust/src/Middleware/LaratrustRole.php(33): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))
#28 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Laratrust\\Middleware\\LaratrustRole->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure), 'administrator')
#29 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#30 /home/website/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))
#31 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure), 'api')
#32 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#33 /home/website/vendor/dingo/api/src/Http/Middleware/RateLimit.php(70): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))
#34 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Dingo\\Api\\Http\\Middleware\\RateLimit->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#35 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#36 /home/website/vendor/dingo/api/src/Http/Middleware/PrepareController.php(45): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))
#37 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Dingo\\Api\\Http\\Middleware\\PrepareController->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#38 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#39 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))
#40 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php(660): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#41 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Dingo\\Api\\Http\\Request))
#42 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php(601): Illuminate\\Routing\\Router->runRoute(Object(Dingo\\Api\\Http\\Request), Object(Illuminate\\Routing\\Route))
#43 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php(590): Illuminate\\Routing\\Router->dispatchToRoute(Object(Dingo\\Api\\Http\\Request))
#44 /home/website/vendor/dingo/api/src/Routing/Adapter/Laravel.php(81): Illuminate\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))
#45 /home/website/vendor/dingo/api/src/Routing/Router.php(512): Dingo\\Api\\Routing\\Adapter\\Laravel->dispatch(Object(Dingo\\Api\\Http\\Request), 'v1')
#46 /home/website/vendor/dingo/api/src/Http/Middleware/Request.php(126): Dingo\\Api\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))
#47 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(114): Dingo\\Api\\Http\\Middleware\\Request->Dingo\\Api\\Http\\Middleware\\{closure}(Object(Dingo\\Api\\Http\\Request))
#48 /home/website/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(65): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#49 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#50 /home/website/vendor/barryvdh/laravel-cors/src/HandleCors.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#51 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Barryvdh\\Cors\\HandleCors->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#52 /home/website/vendor/fideloper/proxy/src/TrustProxies.php(56): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#53 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fideloper\\Proxy\\TrustProxies->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#54 /home/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#55 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#56 /home/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#57 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#58 /home/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#59 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#60 /home/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#61 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#62 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))
#63 /home/website/vendor/dingo/api/src/Http/Middleware/Request.php(127): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#64 /home/website/vendor/dingo/api/src/Http/Middleware/Request.php(103): Dingo\\Api\\Http\\Middleware\\Request->sendRequestThroughRouter(Object(Dingo\\Api\\Http\\Request))
#65 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Dingo\\Api\\Http\\Middleware\\Request->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))
#66 /home/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#67 /home/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#68 /home/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#69 /home/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#70 /home/website/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#71 {main}
"} 

This is the stacktrace of the exception when I replace returning array with strings of player ids with returning instances, which as the first post I suspect because I am sending a whole object and not a string or an array of strings.

varqasim commented 6 years ago

@AshPowell @LKDevelopment Any idea?

LKaemmerling commented 6 years ago

Yeah, since it is a 500 from OneSignal I would ask them. Nice to know would be the response from OneSignal within the 500. On my end, the code works perfectly.

LKaemmerling commented 5 years ago

Closed because of inactivity. Feel free to reopen the issue when your problem is not fixed.