diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cd8eb86 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b263871 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,10 @@ +# Path-based git attributes +# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html + +# Ignore all test and documentation with "export-ignore". +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml.dist export-ignore +/.scrutinizer.yml export-ignore +/tests export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f0a634 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/vendor +build +composer.phar +composer.lock diff --git a/.scrutinizer.yml b/.scrutinizer.yml new file mode 100644 index 0000000..df16b68 --- /dev/null +++ b/.scrutinizer.yml @@ -0,0 +1,19 @@ +filter: + excluded_paths: [tests/*] + +checks: + php: + remove_extra_empty_lines: true + remove_php_closing_tag: true + remove_trailing_whitespace: true + fix_use_statements: + remove_unused: true + preserve_multiple: false + preserve_blanklines: true + order_alphabetically: true + fix_php_opening_tag: true + fix_linefeed: true + fix_line_ending: true + fix_identation_4spaces: true + fix_doc_comments: true + diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 0000000..916d27e --- /dev/null +++ b/.styleci.yml @@ -0,0 +1,3 @@ +preset: laravel + +linting: true diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..62dad73 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,20 @@ +language: php + +php: + - 5.6 + - 7.0 + +env: + matrix: + - COMPOSER_FLAGS="--prefer-lowest" + - COMPOSER_FLAGS="" + +before_script: + - travis_retry composer self-update + - travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-source + +script: + - phpunit --coverage-text --coverage-clover=coverage.clover + +after_script: + - php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100755 index 0000000..3e81a32 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +All Notable changes to `onesignal-notifications` will be documented in this file + +## 1.0.0 - 2016-XX-XX + +- initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100755 index 0000000..4da74e3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +Please read and understand the contribution guide before creating an issue or pull request. + +## Etiquette + +This project is open source, and as such, the maintainers give their free time to build and maintain the source code +held within. They make the code freely available in the hope that it will be of use to other developers. It would be +extremely unfair for them to suffer abuse or anger for their hard work. + +Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the +world that developers are civilized and selfless people. + +It's the duty of the maintainer to ensure that all submissions to the project are of sufficient +quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. + +## Viability + +When requesting or submitting new features, first consider whether it might be useful to others. Open +source projects are used by many developers, who may have entirely different needs to your own. Think about +whether or not your feature is likely to be used by other users of the project. + +## Procedure + +Before filing an issue: + +- Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. +- Check to make sure your feature suggestion isn't already present within the project. +- Check the pull requests tab to ensure that the bug doesn't have a fix in progress. +- Check the pull requests tab to ensure that the feature isn't already in progress. + +Before submitting a pull request: + +- Check the codebase to ensure that your feature doesn't already exist. +- Check the pull requests to ensure that another person hasn't already submitted the feature or fix. + +## Requirements + +If the project maintainer has any additional requirements, you will find them listed here. + +- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer). + +- **Add tests!** - Your patch won't be accepted if it doesn't have tests. + +- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. + +- **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. + +**Happy coding**! diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..73ae2b2 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) Marcel Pociot + +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f2bac97 --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# OneSignal notifications channel for Laravel 5.3 [WIP] + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/laravel-notification-channels/onesignal-notifications.svg?style=flat-square)](https://packagist.org/packages/laravel-notification-channels/onesignal-notifications) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) +[![Build Status](https://img.shields.io/travis/laravel-notification-channels/onesignal-notifications/master.svg?style=flat-square)](https://travis-ci.org/laravel-notification-channels/onesignal-notifications) +[![StyleCI](https://styleci.io/repos/65379321/shield)](https://styleci.io/repos/65379321) +[![SensioLabsInsight](https://img.shields.io/sensiolabs/i/9015691f-130d-4fca-8710-72a010abc684.svg?style=flat-square)](https://insight.sensiolabs.com/projects/9015691f-130d-4fca-8710-72a010abc684) +[![Quality Score](https://img.shields.io/scrutinizer/g/laravel-notification-channels/onesignal-notifications.svg?style=flat-square)](https://scrutinizer-ci.com/g/laravel-notification-channels/onesignal-notifications) +[![Total Downloads](https://img.shields.io/packagist/dt/laravel-notification-channels/onesignal-notifications.svg?style=flat-square)](https://packagist.org/packages/laravel-notification-channels/onesignal-notifications) + +This package makes it easy to send [OneSignal notifications](https://documentation.onesignal.com/docs) with Laravel 5.3. + +## Installation + +You can install the package via composer: + +``` bash +composer require laravel-notification-channels/onesignal-notifications +``` + +You must install the service provider: + +```php +// config/app.php +'providers' => [ + ... + NotificationChannels\OneSignalNotifications\Provider::class, +]; +``` + +## Usage + +Now you can use the channel in your `via()` method inside the notification: + +``` php +use NotificationChannels\OneSignalNotifications\Channel; +use NotificationChannels\OneSignalNotifications\Message; +use Illuminate\Notifications\Notification; + +class AccountApproved extends Notification +{ + public function via($notifiable) + { + return [Channel::class]; + } + + public function toOneSignal($notifiable) + { + return (new Message()) + ->subject("Your {$notifiable->service} account was approved!"); + ->body("Click here to see details.") + ->url('http://onesignal.com') + ->webButton('link-1', 'Click here', 'http://laravel.com'); + } +} +``` + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Testing + +``` bash +$ composer test +``` + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## Security + +If you discover any security related issues, please email m.pociot@gmail.com instead of using the issue tracker. + +## Credits + +- [Mohamed Said](https://github.com/themsaid) +- [Marcel Pociot](https://github.com/mpociot) +- [Freek Van der Herten](https://github.com/freekmurze) +- [All Contributors](../../contributors) + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..112b6df --- /dev/null +++ b/composer.json @@ -0,0 +1,48 @@ +{ + "name": "laravel-notification-channels/onesignal-notifications", + "description": "OneSignal Notifications driver", + "homepage": "https://github.com/laravel-notification-channels/onesignal-notifications", + "license": "MIT", + "authors": [ + { + "name": "Mohamed Said", + "email": "theMohamedSaid@gmail.com", + "homepage": "https://themsaid.com" + }, + { + "name": "Marcel Pociot", + "email": "hello@marcelpociot.com", + "homepage": "http://marcelpociot.com" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be" + } + ], + "require": { + "php": ">=5.6.4", + "berkayk/onesignal-laravel": "^0.9.3", + "illuminate/notifications": "^5.3@dev", + "illuminate/support": "^5.3@dev", + "illuminate/events": "^5.3@dev" + }, + "require-dev": { + "mockery/mockery": "^0.9.5", + "phpunit/phpunit": "4.*" + }, + "autoload": { + "psr-4": { + "NotificationChannels\\OneSignal\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "NotificationChannels\\OneSignal\\Test\\": "tests" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..563fc80 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,29 @@ + + + + + tests + + + + + src/ + + + + + + + + + + diff --git a/src/Channel.php b/src/Channel.php new file mode 100644 index 0000000..de6282f --- /dev/null +++ b/src/Channel.php @@ -0,0 +1,56 @@ +onesignal = $onesignal; + } + + /** + * Send the given notification. + * + * @param mixed $notifiable + * @param \Illuminate\Notifications\Notification $notification + * + * @throws \NotificationChannels\OneSignalNotifications\Exceptions\CouldNotSendNotification + */ + public function send($notifiable, Notification $notification) + { + if (! $userIds = $notifiable->routeNotificationFor('OneSignal')) { + return; + } + + $shouldSendMessage = event(new SendingMessage($notifiable, $notification), [], true) !== false; + + if (! $shouldSendMessage) { + return; + } + + $oneSignalData = collect($notification->toOneSignal($notifiable)->toArray()) + ->put('include_player_ids', collect($userIds)); + + /** @var ResponseInterface $response */ + $response = $this->onesignal->sendNotificationCustom($oneSignalData); + + if ($response->getStatusCode() !== 200) { + throw CouldNotSendNotification::serviceRespondedWithAnError($response); + } + + event(new MessageWasSent($notifiable, $notification)); + } +} diff --git a/src/Events/MessageWasSent.php b/src/Events/MessageWasSent.php new file mode 100644 index 0000000..2662361 --- /dev/null +++ b/src/Events/MessageWasSent.php @@ -0,0 +1,24 @@ +notifiable = $notifiable; + + $this->notification = $notification; + } +} diff --git a/src/Events/SendingMessage.php b/src/Events/SendingMessage.php new file mode 100644 index 0000000..cbbb266 --- /dev/null +++ b/src/Events/SendingMessage.php @@ -0,0 +1,25 @@ +notifiable = $notifiable; + + $this->notification = $notification; + } +} diff --git a/src/Exceptions/CouldNotSendNotification.php b/src/Exceptions/CouldNotSendNotification.php new file mode 100644 index 0000000..8d2fb2d --- /dev/null +++ b/src/Exceptions/CouldNotSendNotification.php @@ -0,0 +1,11 @@ +getBody()->getContents()); + } +} diff --git a/src/Message.php b/src/Message.php new file mode 100644 index 0000000..1929250 --- /dev/null +++ b/src/Message.php @@ -0,0 +1,165 @@ +body = $body; + } + + /** + * Set the message body + * + * @param string $value + * @return $this + */ + public function body($value) + { + $this->body = $value; + + return $this; + } + + /** + * Set the message subject + * + * @param string $value + * @return $this + */ + public function subject($value) + { + $this->subject = $value; + + return $this; + } + + /** + * Set the message url + * + * @param string $value + * @return $this + */ + public function url($value) + { + $this->url = $value; + + return $this; + } + + /** + * Set additional data + * + * @param string $key + * @param string $value + * @return $this + */ + public function setData($key, $value) + { + $this->data[$key] = $value; + + return $this; + } + + /** + * Add a web button to the message + * + * @param string $id + * @param string $text + * @param string $icon + * @param string $url + * + * @return $this + */ + public function webButton($id, $text, $icon, $url) + { + $this->web_buttons[] = [ + 'id' => $id, + 'text' => $text, + 'icon' => $icon, + 'url' => $url + ]; + + return $this; + } + + /** + * Add a native button to the message + * + * @param string $id + * @param string $text + * @param string $icon + * + * @return $this + */ + public function button($id, $text, $icon) + { + $this->buttons[] = [ + 'id' => $id, + 'text' => $text, + 'icon' => $icon + ]; + + return $this; + } + + /** + * @return array + */ + public function toArray() + { + $message = [ + 'contents' => ['en' => $this->body], + 'headings' => ['en' => $this->subject], + 'url' => $this->url, + 'buttons' => $this->buttons, + 'web_buttons' => $this->web_buttons, + ]; + + foreach ($this->data AS $data => $value) { + Arr::set($message, 'data.'.$data, $value); + } + + return $message; + } +} diff --git a/src/Provider.php b/src/Provider.php new file mode 100644 index 0000000..4791631 --- /dev/null +++ b/src/Provider.php @@ -0,0 +1,34 @@ +app->when(Channel::class) + ->needs(OneSignalClient::class) + ->give(function () { + $oneSignalConfig = config('services.onesignal'); + + return new OneSignalClient( + $oneSignalConfig['app_id'], + $oneSignalConfig['rest_api_key'], + $oneSignalConfig['user_auth_key'] + ); + }); + } + + /** + * Register the application services. + */ + public function register() + { + } +} diff --git a/tests/ExampleTest.php b/tests/ExampleTest.php new file mode 100644 index 0000000..1387817 --- /dev/null +++ b/tests/ExampleTest.php @@ -0,0 +1,12 @@ +assertTrue(true); + } +}