diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..cd8eb86e --- /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/.gitignore b/.gitignore new file mode 100644 index 00000000..4cc874d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/vendor +build +composer.phar +composer.lock +.DS_Store +.phpunit.result.cache \ No newline at end of file diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 00000000..0285f179 --- /dev/null +++ b/.styleci.yml @@ -0,0 +1 @@ +preset: laravel diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100755 index 00000000..fd83ef6c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +All notable changes to `:package_name` will be documented in this file + +## 1.0.0 - 201X-XX-XX + +- initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100755 index 00000000..4da74e3f --- /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 00000000..8bc4a36c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) :author_name <:author_email> + +> 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 index fa8362b7..67d0c246 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,146 @@ -# New Notification Channels +# BongaSMS notification channel for Laravel -### Suggesting a new channel -Have a suggestion or working on a new channel? Please create a new issue for that service. +[![Latest Version on Packagist](https://img.shields.io/packagist/v/laravel-notification-channels/bonga.svg?style=flat-square)](https://packagist.org/packages/laravel-notification-channels/bonga) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) +[![StyleCI](https://styleci.io/repos/247548130/shield)](https://styleci.io/repos/209406724) +[![Quality Score](https://img.shields.io/scrutinizer/g/laravel-notification-channels/bonga.svg?style=flat-square)](https://scrutinizer-ci.com/g/laravel-notification-channels/bonga) +[![Total Downloads](https://img.shields.io/packagist/dt/laravel-notification-channels/bonga.svg?style=flat-square)](https://packagist.org/packages/laravel-notification-channels/bonga) -### I'm working on a new channel -Please create an issue for it if it does not already exist, then PR you code for review. +This package makes it easy to send notifications using [Bonga](http://bongasms.com) with Laravel. -## Workflow for new channels +## Contents -1) Head over to the [skeleton repo](https://github.com/laravel-notification-channels/skeleton) download a ZIP copy. This is important, to ensure you start from a fresh commit history. -2) Use find/replace to replace all of the placeholders with the correct values (package name, author name, email, etc). -3) Implement to logic for the channel & add tests. -4) Fork this repo, add it as a remote and push your new channel to a branch. -5) Submit a new PR against this repo for review. +- [About](#about) +- [Installation](#installation) +- [Setting up the Bonga service](#setting-up-the-bonga-service) +- [Usage](#usage) +- [Testing](#testing) +- [Security](#security) +- [Contributing](#contributing) +- [Credits](#credits) +- [License](#license) -Take a look at our [FAQ](http://laravel-notification-channels.com/) to see our small list of rules, to provide top-notch notification channels. +## About + +This package is part of the [Laravel Notification Channels](http://laravel-notification-channels.com/) project. It provides additional Laravel Notification channels to the ones given by [Laravel](https://laravel.com/docs/master/notifications) itself. + +The Bonga channel makes it possible to send out Laravel notifications as a `SMS ` using Bonga API. + +## Installation + +You can install this package via composer: + +``` bash +composer require laravel-notification-channels/bonga +``` + +The service provider gets loaded automatically. + +### Setting up the Bonga Service + +You will need to [Register](http://bongasms.com) and then go to your [Developer Hub](https://app.bongasms.co.ke/clients/developer). On the right, [ Generate New Key/Secret Pair](https://app.bongasms.co.ke/clients/developer). Place your API credentias inside your `.env` file. + +```bash +BONGA_CLIENT="" +BONGA_KEY="" +BONGA_SECRET="" +BONGA_SERVICE="" +``` + +To load them, add this to your `config/services.php` . This will load the Bonga data from the `.env` file.file: + +```php +'bonga' => [ + 'client' => env('BONGA_CLIENT'), + 'key' => env('BONGA_KEY'), + 'secret' => env('BONGA_SECRET'), + 'service' => env('BONGA_SERVICE'), +] +``` + +Add the `routeNotifcationForBonga` method on your notifiable Model. If this is not added, +the `phone` field will be automatically used. + +```php +phone; + } +} +``` + + +## Usage + + +To use this package, you need to create a notification class, like `SendOtp` from the example below, in your Laravel application. Make sure to check out [Laravel's documentation](https://laravel.com/docs/master/notifications) for this process. + + +```php +content('Your SMS message content'); + + } +} +``` + + +## Testing + +``` bash +$ composer test +``` + +## Security + +If you discover any security-related issues, please email hi@osen.co.ke instead of using the issue tracker. + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## Credits + +- [Osen Concepts](https://github.com/osenco) +- [All Contributors](../../contributors) + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..2f7c0eb0 --- /dev/null +++ b/composer.json @@ -0,0 +1,49 @@ +{ + "authors": [ + { + "email": "hi@osen.co.ke", + "homepage": "https://osen.co.ke", + "name": "Osen concepts", + "role": "Developer" + } + ], + "autoload": { + "psr-4": { + "NotificationChannels\\Bonga\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "NotificationChannels\\Bonga\\Test\\": "tests" + } + }, + "config": { + "sort-packages": true + }, + "description": "BongaSMS Laravel Notifications Package", + "extra": { + "laravel": { + "providers": [ + "NotificationChannels\\Bonga\\BongaServiceProvider" + ] + } + }, + "homepage": "https://github.com/laravel-notification-channels/bonga", + "license": "MIT", + "name": "laravel-notification-channels/bonga", + "require": { + "illuminate/notifications": "~6.0 || ~7.0 || ~8.0", + "illuminate/support": "~6.0 || ~7.0 || ~8.0", + "osenco/bongasms": "^0.1.19", + "php": ">=7.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "~5.0", + "phpunit/phpunit": "^9.0" + }, + "scripts": { + "test": "phpunit", + "test:coverage": "phpunit --coverage-text --coverage-clover=coverage.clover" + } +} \ No newline at end of file diff --git a/src/BongaChannel.php b/src/BongaChannel.php new file mode 100644 index 00000000..e467a22f --- /dev/null +++ b/src/BongaChannel.php @@ -0,0 +1,41 @@ +bonga = $bonga; + } + + /** + * Send the given notification. + * + * @param mixed $notifiable + * @param \Illuminate\Notifications\Notification $notification + * + * @throws \NotificationChannels\Bonga\Exceptions\CouldNotSendNotification + */ + public function send($notifiable, Notification $notification) + { + $message = $notification->toBonga($notifiable); + + if (! $phoneNumber = $notifiable->routeNotificationFor('bonga')) { + $phoneNumber = $notifiable->phone_number; + } + + try { + $this->bonga->send($phoneNumber, $message->getContent()); + } catch (Exception $e) { + throw CouldNotSendNotification::serviceRespondedWithAnError($e->getMessage()); + } + } +} diff --git a/src/BongaMessage.php b/src/BongaMessage.php new file mode 100644 index 00000000..8dc03cfa --- /dev/null +++ b/src/BongaMessage.php @@ -0,0 +1,32 @@ +content = trim($content); + + return $this; + } + + /** + * Get message content. + * + * @return string + */ + public function getContent() + { + return $this->content; + } +} diff --git a/src/BongaServiceProvider.php b/src/BongaServiceProvider.php new file mode 100644 index 00000000..0005d820 --- /dev/null +++ b/src/BongaServiceProvider.php @@ -0,0 +1,41 @@ +app->when(BongaChannel::class) + ->needs(Sms::class) + ->give(function () { + $client = config('services.bonga.client'); + $key = config('services.bonga.key'); + $secret = config('services.bonga.secret'); + $service = config('services.bonga.service'); + + if (is_null($client) || is_null($key)) { + throw InvalidConfiguration::configurationNotSet(); + } + + $bonga = new Sms( + $client, + $secret, + $key, + $service + ); + + return $bonga; + }); + } +} diff --git a/src/Exceptions/CouldNotSendNotification.php b/src/Exceptions/CouldNotSendNotification.php new file mode 100644 index 00000000..2a0ed259 --- /dev/null +++ b/src/Exceptions/CouldNotSendNotification.php @@ -0,0 +1,11 @@ +bonga = Mockery::mock(BongaSDK::class); + $this->channel = new BongaChannel($this->bonga); + } + + /** @test */ + public function it_can_be_instantiated() + { + $this->assertInstanceOf(Sms::class, $this->bonga); + $this->assertInstanceOf(BongaChannel::class, $this->channel); + } + + /** @test */ + public function it_can_send_sms_notification() + { + $this->bonga->shouldReceive('send') + ->once() + ->andReturn(200); + + $this->channel->send(new TestNotifiable, new TestNotification); + } +} + +class TestNotifiable +{ + use \Illuminate\Notifications\Notifiable; + + /** + * @return string + */ + public function routeNotificationForBonga() + { + return '+254705459494'; + } +} + +class TestNotification extends Notification +{ + /** + * @param $notifiable + * @return BongaMessage + * @throws CouldNotSendNotification + */ + public function toBonga($notifiable) + { + return new BongaMessage(); + } +} \ No newline at end of file diff --git a/tests/BongaMessageTest.php b/tests/BongaMessageTest.php new file mode 100644 index 00000000..c32d47a6 --- /dev/null +++ b/tests/BongaMessageTest.php @@ -0,0 +1,24 @@ +message = new BongaMessage(); + } + + /** @test */ + public function it_can_get_the_content() + { + $this->message->content('myMessage'); + $this->assertEquals('myMessage', $this->message->getContent()); + } +} \ No newline at end of file diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 00000000..9d7f3b51 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,19 @@ +addToAssertionCount($container->mockery_getExpectationCount()); + } + + Mockery::close(); + } +} \ No newline at end of file