From fc66146692ffe013cf49bda003e12fd02dfe01c0 Mon Sep 17 00:00:00 2001 From: Axel Piaget Date: Tue, 1 Aug 2023 23:07:48 +0200 Subject: [PATCH 1/3] Initial commit --- .editorconfig | 15 ++ .github/workflows/tests.yml | 32 +++++ .gitignore | 8 ++ .styleci.yml | 1 + CHANGELOG.md | 7 + CONTRIBUTING.md | 55 ++++++++ LICENSE.md | 21 +++ README.md | 133 ++++++++++++++++-- composer.json | 49 +++++++ phpunit.xml.dist | 21 +++ src/Exceptions/CouldNotSendNotification.php | 37 +++++ src/KChat.php | 93 +++++++++++++ src/KChatChannel.php | 49 +++++++ src/KChatMessage.php | 99 ++++++++++++++ src/KChatServiceProvider.php | 25 ++++ tests/KChatChannelTest.php | 143 ++++++++++++++++++++ tests/KChatMessageTest.php | 67 +++++++++ 17 files changed, 843 insertions(+), 12 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .styleci.yml create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 composer.json create mode 100644 phpunit.xml.dist create mode 100644 src/Exceptions/CouldNotSendNotification.php create mode 100644 src/KChat.php create mode 100644 src/KChatChannel.php create mode 100644 src/KChatMessage.php create mode 100644 src/KChatServiceProvider.php create mode 100644 tests/KChatChannelTest.php create mode 100644 tests/KChatMessageTest.php 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/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..0051216f --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,32 @@ +name: PHPUnit tests + +on: + - push + - pull_request + +jobs: + tests: + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + php: [7.2, 7.3, 7.4, 8.0, 8.1, 8.2] + + name: Tests on PHP ${{ matrix.php }} - ${{ matrix.stability }} + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + tools: composer:v2 + coverage: none + + - name: Install dependencies + run: composer update --prefer-source --no-interaction --no-progress + + - name: Execute tests + run: vendor/bin/phpunit --verbose diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0bca8c51 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/vendor +build +composer.phar +composer.lock +.DS_Store +.phpunit.result.cache +.vscode +.idea 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 100644 index 00000000..5237a76a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +All notable changes to `kchat` 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 100644 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..a2712770 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) karac web Sàrl + +> 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..29936b38 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,126 @@ -# New Notification Channels +Please see [this repo](https://github.com/laravel-notification-channels/channels) for instructions on how to submit a channel proposal. -### Suggesting a new channel -Have a suggestion or working on a new channel? Please create a new issue for that service. +# Infomaniak's kChat Notifications Channel for Laravel -### 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 [kChat](https://www.infomaniak.com/en/kchat) with Laravel 5.5+, 6.x, 7.x, 8.x, 9.x, 10.x -## Workflow for new channels +This package leverages Infomaniak's public API to send notification to [kChat](https://www.infomaniak.com/en/kchat) channels with Laravel 5.5+, 6.x, 7.x, 8.x, 9.x and 10.x -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. +```php +return KChatMessage::create() + ->to("123456789") + ->content('The backup of your application succeeded') + ->commentTo('987654321'); +``` -Take a look at our [FAQ](http://laravel-notification-channels.com/) to see our small list of rules, to provide top-notch notification channels. +## Contents + +- [Installation](#installation) + - [Setting up the kChat service](#setting-up-the-kchat-service) +- [Usage](#usage) + - [Available Message methods](#available-message-methods) +- [Changelog](#changelog) +- [Testing](#testing) +- [Security](#security) +- [Contributing](#contributing) +- [Credits](#credits) +- [License](#license) + + +## Installation + +You can install the package via composer: + +``` bash +composer require laravel-notification-channels/kchat +``` + +Next, if you're using Laravel _without_ auto-discovery, add the service provider to `config/app.php`: + +```bash +'providers' => [ + // ... + NotificationChannels\KChat\KChatServiceProvider::class, +], +``` + +### Setting up the kChat service + +* [Create a token with the scope `kchat`](https://manager.infomaniak.com/v3/ng/accounts/token/add) +* Retrieve the Url of your kChat instance, it should look like `https://your-team.kchat.infomaniak.com`. +* Paste the token and your kChat base Url in your `config/services.php` file: + ``` + // config/services.php + 'infomaniak_kchat' => [ + 'token' => 'YOUR_API_TOKEN', + 'base_url' => 'https://your-team.kchat.infomaniak.com' + ], + ``` + +## Usage + +Now you can use the channel in your `via()` method inside the notification: + +```php +use Illuminate\Notifications\Notification; +use NotificationChannels\KChat\KChatChannel; +use NotificationChannels\KChat\KChatMessage; + +class BackupSucceeded extends Notification +{ + public function via($notifiable) + { + return [KChatChannel::class]; + } + + public function toKChat($notifiable) + { + return KChatMessage::create() + ->to("123456789") + ->content('The backup of your application succeeded') + ->commentTo('987654321'); // A post ID you wish to respond to + } +} +``` + + +Instead of using the `to($channel_id)` method for specifying the channel ID you can also add the `routeNotificationForKChat` method inside your Notifiable model. This method needs to return the channel ID. + +```php +public function routeNotificationForKChat(Notification $notification) +{ + return '123456789'; +} +``` + +### Available Message methods + +- `to(string $channel_id)`: The channel to send the message to. +- `content(string $content)`: Content of the message (Markdown supported). +- `commentTo(string $post_id)`: A post ID you wish to respond to. + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Testing + +``` bash +$ composer test +``` + +## Security + +If you discover any security related issues, please email info@karac.ch instead of using the issue tracker. + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## Credits + +- [karac web Sàrl](https://karac.ch) + +## 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..c7fcdf3d --- /dev/null +++ b/composer.json @@ -0,0 +1,49 @@ +{ + "name": "laravel-notification-channels/kchat", + "description": "A Laravel Notification Channel for Infomaniak's kChat", + "homepage": "https://github.com/laravel-notification-channels/kchat", + "license": "MIT", + "authors": [ + { + "name": "karac web Sàrl", + "email": "info@karac.ch", + "homepage": "https://karac.ch", + "role": "Agency" + } + ], + "require": { + "ext-json": "*", + "php": ">=7.2", + "guzzlehttp/guzzle": "^6.3 || ^7.0", + "illuminate/notifications": "~6.0 || ~7.0 || ~8.0 || ~9.0 || ~10.0", + "illuminate/support": "~6.0 || ~7.0 || ~8.0 || ~9.0 || ~10.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^9.0" + }, + "autoload": { + "psr-4": { + "NotificationChannels\\KChat\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "NotificationChannels\\KChat\\Test\\": "tests" + } + }, + "scripts": { + "test": "phpunit", + "test:coverage": "phpunit --coverage-text --coverage-clover=coverage.clover" + }, + "config": { + "sort-packages": true + }, + "extra": { + "laravel": { + "providers": [ + "NotificationChannels\\KChat\\KChatServiceProvider" + ] + } + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 00000000..099385b7 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,21 @@ + + + + + src/ + + + + + + + + + + tests + + + + + + diff --git a/src/Exceptions/CouldNotSendNotification.php b/src/Exceptions/CouldNotSendNotification.php new file mode 100644 index 00000000..ec49dee0 --- /dev/null +++ b/src/Exceptions/CouldNotSendNotification.php @@ -0,0 +1,37 @@ +hasResponse()) { + return new static('kChat responded with an error but no response body found'); + } + + $statusCode = $exception->getResponse()->getStatusCode(); + $description = $exception->getMessage(); + + return new static("kChat responded with an error `{$statusCode} - {$description}`"); + } + + public static function couldNotCommunicateWithkChat(\Exception $exception) { + return new static("The communication with kChat failed. `{$exception->getMessage()}`"); + } + + public static function baseUrlMissing() + { + return new static('The base Url of your kChat instance is missing. Please add it in your config/services.php file.'); + } + + public static function channelMissing() { + return new static('The channel ID you wish to send the notification to is missing.'); + } + + public static function messageMissing() { + return new static('The message is missing.'); + } +} diff --git a/src/KChat.php b/src/KChat.php new file mode 100644 index 00000000..42fb22e0 --- /dev/null +++ b/src/KChat.php @@ -0,0 +1,93 @@ +httpClient = $http; + $this->baseUrl = $baseUrl; + $this->token = $token; + } + + /** + * Send a message to a Discord channel. + * + * @param string $channel + * @param array $data + * + * @return array + */ + + /** + * Send a message to a kChat channel. + * + * @param string $verb + * @param string $endpoint + * @param array $data + * + * @return array + * + * @throws \NotificationChannels\KChat\Exceptions\CouldNotSendNotification + */ + public function send(array $data): ?ResponseInterface + { + if (is_null($this->baseUrl)) { + throw CouldNotSendNotification::baseUrlMissing(); + } + if (! isset($data['channel_id'])) { + throw CouldNotSendNotification::channelMissing(); + } + if (! isset($data['message'])) { + throw CouldNotSendNotification::messageMissing(); + } + + try { + $url = rtrim($this->baseUrl, '/').'/api/v4/posts'; + $response = $this->httpClient->post($url, [ + 'headers' => [ + 'Authorization' => 'Bearer '.$this->token, + 'Content-Type' => 'application/json', + ], + 'body' => json_encode($data), + ]); + } catch (ClientException $exception) { + throw CouldNotSendNotification::kChatRespondedWithAnError($exception); + } catch (Exception $exception) { + throw CouldNotSendNotification::couldNotCommunicateWithkChat($exception); + } + + return $response; + } +} diff --git a/src/KChatChannel.php b/src/KChatChannel.php new file mode 100644 index 00000000..9583b26e --- /dev/null +++ b/src/KChatChannel.php @@ -0,0 +1,49 @@ +kChat = $kChat; + } + + /** + * Send the given notification. + * + * @param mixed $notifiable + * @param \Illuminate\Notifications\Notification $notification + */ + public function send($notifiable, Notification $notification) + { + $message = $notification->toKChat($notifiable); + + // if the recipient is not defined get it from the notifiable object + if ($message->toNotGiven()) { + $to = $notifiable->routeNotificationFor('kChat', $notification); + + if(is_null($to)) { + throw CouldNotSendNotification::channelMissing(); + } + $message->to($to); + } + + $response = $this->kChat->send($message->toArray()); + + return $response; + } +} diff --git a/src/KChatMessage.php b/src/KChatMessage.php new file mode 100644 index 00000000..a0201991 --- /dev/null +++ b/src/KChatMessage.php @@ -0,0 +1,99 @@ +content($content); + } + + /** + * @param string $channel_id + * + * @return self + */ + public function to(string $channel_id): self + { + if (! $channel_id) { + throw CouldNotSendNotification::channelMissing(); + } + $this->payload['channel_id'] = $channel_id; + + return $this; + } + + /** + * @param string $content + * + * @return self + */ + public function content(string $content): self + { + $this->payload['message'] = $content; + + return $this; + } + + /** + * @param string $root_id + * + * @return self + */ + public function commentTo(string $root_id): self + { + if ($root_id) { + $this->payload['root_id'] = $root_id; + } + + return $this; + } + + /** + * Determine if channel id is not given. + * + * @return bool + */ + public function toNotGiven(): bool + { + return ! isset($this->payload['channel_id']); + } + + /** + * Get payload value for given key. + * + * @param string $key + * + * @return mixed|null + */ + public function getPayloadValue(string $key) + { + return $this->payload[$key] ?? null; + } + + /** + * Returns params payload. + * + * @return array + */ + public function toArray(): array + { + return $this->payload; + } +} diff --git a/src/KChatServiceProvider.php b/src/KChatServiceProvider.php new file mode 100644 index 00000000..a29e55a4 --- /dev/null +++ b/src/KChatServiceProvider.php @@ -0,0 +1,25 @@ +app->when(KChatChannel::class) + ->needs(KChat::class) + ->give(function() { + $token = $this->app->make('config')->get('services.infomaniak_kchat.token'); + $base_url = $this->app->make('config')->get('services.infomaniak_kchat.base_url'); + + return new KChat( + new Client(), + $base_url, + $token + ); + }); + } +} diff --git a/tests/KChatChannelTest.php b/tests/KChatChannelTest.php new file mode 100644 index 00000000..ecf26323 --- /dev/null +++ b/tests/KChatChannelTest.php @@ -0,0 +1,143 @@ +kChat = Mockery::mock(KChat::class); + } + + public function tearDown(): void { + Mockery::close(); + parent::tearDown(); + } + + /** @test */ + public function it_can_send_a_notification() { + $this->kChat->shouldReceive('send') + ->with( + [ + 'channel_id' => '123456789', + 'message' => 'This is my content.' + ]) + ->once() + ->andReturn(new Response(200)); + + $channel = new KChatChannel($this->kChat); + + $response = $channel->send(new TestNotifiable(), new TestNotification()); + $this->assertEquals(200, $response->getStatusCode()); + } + + /** @test */ + public function it_does_not_send_a_notification_if_the_notifiable_does_not_provide_a_kchat_channel() + { + $this->expectException(CouldNotSendNotification::class); + + $channel = new KChatChannel($this->kChat); + $channel->send(new TestNotifiableWithoutRoute(), new TestNotificationNoChannelID()); + } + + /** @test */ + public function it_does_send_a_notification_if_the_notifiable_does_not_provide_a_kchat_channel_but_the_to_param_is_set() + { + $this->kChat->shouldReceive('send') + ->with( + [ + 'channel_id' => '123456789', + 'message' => 'This is my content.' + ]) + ->once() + ->andReturn(new Response(200)); + + $channel = new KChatChannel($this->kChat); + + $response = $channel->send(new TestNotifiableWithoutRoute(), new TestNotificationWithToParam()); + $this->assertEquals(200, $response->getStatusCode()); + } +} + +/** + * Class TestNotifiable. + */ +class TestNotifiable +{ + use Notifiable; + + public function routeNotificationForKChat(Notification $notification = null) + { + return '123456789'; + } +} + +/** + * Class TestNotifiableWithoutRoute. + */ +class TestNotifiableWithoutRoute +{ + use Notifiable; +} + +/** + * Class TestNotification. + */ +class TestNotification extends Notification +{ + public function toKChat() + { + return (new KChatMessage()) + ->content('This is my content.'); + } +} + +/** + * Class TestNotificationNoChannelID. + */ +class TestNotificationNoChannelID extends Notification +{ + /** + * @param $notifiable + * + * @return KChatMessage + */ + public function toKChat($notifiable): KChatMessage + { + return (new KChatMessage()) + ->content('This is my content.'); + } +} + +/** + * Class TestNotificationWithToParam. + */ +class TestNotificationWithToParam extends Notification +{ + /** + * @param $notifiable + * + * @return KChatMessage + */ + public function toKChat($notifiable): KChatMessage + { + return (new KChatMessage()) + ->content('This is my content.') + ->to('123456789'); + } +} diff --git a/tests/KChatMessageTest.php b/tests/KChatMessageTest.php new file mode 100644 index 00000000..fde641db --- /dev/null +++ b/tests/KChatMessageTest.php @@ -0,0 +1,67 @@ +assertEquals('Laravel Notification Channels are awesome!', $message->getPayloadValue('message')); + } + + /** @test */ + public function a_content_can_be_set(): void + { + $message = new KChatMessage(); + $message->content('Laravel Notification Test content'); + $this->assertEquals('Laravel Notification Test content', $message->getPayloadValue('message')); + } + + /** @test */ + public function a_channel_id_can_be_set(): void + { + $message = new KChatMessage(); + $message->to('123456789'); + $this->assertEquals('123456789', $message->getPayloadValue('channel_id')); + } + + /** @test */ + public function a_comment_id_can_be_set(): void + { + $message = new KChatMessage(); + $message->commentTo('123456789'); + $this->assertEquals('123456789', $message->getPayloadValue('root_id')); + } + + /** @test */ + public function a_comment_id_can_be_empty(): void + { + $message = new KChatMessage(); + $message->commentTo(''); + $this->assertEquals(null, $message->getPayloadValue('root_id')); + } + + /** @test */ + public function is_to_empty(): void + { + $message = new KChatMessage(); + $this->assertEquals(true, $message->toNotGiven()); + } + + /** @test */ + public function is_to_not_empty(): void + { + $message = new KChatMessage(); + $message->to('123456789'); + $this->assertEquals(false, $message->toNotGiven()); + } +} From 73f0424783db7bd585fea92386b94871488808b5 Mon Sep 17 00:00:00 2001 From: Axel Piaget Date: Tue, 1 Aug 2023 23:18:41 +0200 Subject: [PATCH 2/3] style --- src/Exceptions/CouldNotSendNotification.php | 9 +++++--- src/KChat.php | 24 +++++++-------------- src/KChatChannel.php | 8 +++---- src/KChatMessage.php | 15 +++++-------- src/KChatServiceProvider.php | 2 +- tests/KChatChannelTest.php | 22 ++++++++++--------- tests/KChatMessageTest.php | 1 - 7 files changed, 36 insertions(+), 45 deletions(-) diff --git a/src/Exceptions/CouldNotSendNotification.php b/src/Exceptions/CouldNotSendNotification.php index ec49dee0..c742080a 100644 --- a/src/Exceptions/CouldNotSendNotification.php +++ b/src/Exceptions/CouldNotSendNotification.php @@ -18,7 +18,8 @@ public static function kChatRespondedWithAnError(ClientException $exception) return new static("kChat responded with an error `{$statusCode} - {$description}`"); } - public static function couldNotCommunicateWithkChat(\Exception $exception) { + public static function couldNotCommunicateWithkChat(\Exception $exception) + { return new static("The communication with kChat failed. `{$exception->getMessage()}`"); } @@ -27,11 +28,13 @@ public static function baseUrlMissing() return new static('The base Url of your kChat instance is missing. Please add it in your config/services.php file.'); } - public static function channelMissing() { + public static function channelMissing() + { return new static('The channel ID you wish to send the notification to is missing.'); } - public static function messageMissing() { + public static function messageMissing() + { return new static('The message is missing.'); } } diff --git a/src/KChat.php b/src/KChat.php index 42fb22e0..cf15749f 100644 --- a/src/KChat.php +++ b/src/KChat.php @@ -8,7 +8,8 @@ use NotificationChannels\KChat\Exceptions\CouldNotSendNotification; use Psr\Http\Message\ResponseInterface; -class KChat { +class KChat +{ /** * kChat API base URL. * @@ -31,8 +32,9 @@ class KChat { protected $token; /** - * @param \GuzzleHttp\Client $http - * @param string $token + * @param \GuzzleHttp\Client $http + * @param string $baseUrl + * @param string $token */ public function __construct(HttpClient $http, $baseUrl, $token) { @@ -41,22 +43,12 @@ public function __construct(HttpClient $http, $baseUrl, $token) $this->token = $token; } - /** - * Send a message to a Discord channel. - * - * @param string $channel - * @param array $data - * - * @return array - */ - /** * Send a message to a kChat channel. * - * @param string $verb - * @param string $endpoint - * @param array $data - * + * @param string $verb + * @param string $endpoint + * @param array $data * @return array * * @throws \NotificationChannels\KChat\Exceptions\CouldNotSendNotification diff --git a/src/KChatChannel.php b/src/KChatChannel.php index 9583b26e..b323a229 100644 --- a/src/KChatChannel.php +++ b/src/KChatChannel.php @@ -15,7 +15,7 @@ class KChatChannel /** * Channel constructor. * - * @param KChat $kChat + * @param KChat $kChat */ public function __construct(KChat $kChat) { @@ -25,8 +25,8 @@ public function __construct(KChat $kChat) /** * Send the given notification. * - * @param mixed $notifiable - * @param \Illuminate\Notifications\Notification $notification + * @param mixed $notifiable + * @param \Illuminate\Notifications\Notification $notification */ public function send($notifiable, Notification $notification) { @@ -36,7 +36,7 @@ public function send($notifiable, Notification $notification) if ($message->toNotGiven()) { $to = $notifiable->routeNotificationFor('kChat', $notification); - if(is_null($to)) { + if (is_null($to)) { throw CouldNotSendNotification::channelMissing(); } $message->to($to); diff --git a/src/KChatMessage.php b/src/KChatMessage.php index a0201991..94702965 100644 --- a/src/KChatMessage.php +++ b/src/KChatMessage.php @@ -10,8 +10,7 @@ class KChatMessage protected $payload = []; /** - * @param string $content - * + * @param string $content * @return self */ public static function create(string $content = ''): self @@ -25,8 +24,7 @@ public function __construct(string $content = '') } /** - * @param string $channel_id - * + * @param string $channel_id * @return self */ public function to(string $channel_id): self @@ -40,8 +38,7 @@ public function to(string $channel_id): self } /** - * @param string $content - * + * @param string $content * @return self */ public function content(string $content): self @@ -52,8 +49,7 @@ public function content(string $content): self } /** - * @param string $root_id - * + * @param string $root_id * @return self */ public function commentTo(string $root_id): self @@ -78,8 +74,7 @@ public function toNotGiven(): bool /** * Get payload value for given key. * - * @param string $key - * + * @param string $key * @return mixed|null */ public function getPayloadValue(string $key) diff --git a/src/KChatServiceProvider.php b/src/KChatServiceProvider.php index a29e55a4..dc5435c4 100644 --- a/src/KChatServiceProvider.php +++ b/src/KChatServiceProvider.php @@ -11,7 +11,7 @@ public function boot() { $this->app->when(KChatChannel::class) ->needs(KChat::class) - ->give(function() { + ->give(function () { $token = $this->app->make('config')->get('services.infomaniak_kchat.token'); $base_url = $this->app->make('config')->get('services.infomaniak_kchat.base_url'); diff --git a/tests/KChatChannelTest.php b/tests/KChatChannelTest.php index ecf26323..ad63b214 100644 --- a/tests/KChatChannelTest.php +++ b/tests/KChatChannelTest.php @@ -15,27 +15,31 @@ /** * Class MicrosoftTeamsChannelTest. */ -class KChatChannelTest extends TestCase { +class KChatChannelTest extends TestCase +{ /** @var Mockery\Mock */ protected $kChat; - public function setUp(): void { + public function setUp(): void + { parent::setUp(); $this->kChat = Mockery::mock(KChat::class); } - public function tearDown(): void { + public function tearDown(): void + { Mockery::close(); parent::tearDown(); } /** @test */ - public function it_can_send_a_notification() { + public function it_can_send_a_notification() + { $this->kChat->shouldReceive('send') ->with( [ 'channel_id' => '123456789', - 'message' => 'This is my content.' + 'message' => 'This is my content.', ]) ->once() ->andReturn(new Response(200)); @@ -62,7 +66,7 @@ public function it_does_send_a_notification_if_the_notifiable_does_not_provide_a ->with( [ 'channel_id' => '123456789', - 'message' => 'This is my content.' + 'message' => 'This is my content.', ]) ->once() ->andReturn(new Response(200)); @@ -113,8 +117,7 @@ public function toKChat() class TestNotificationNoChannelID extends Notification { /** - * @param $notifiable - * + * @param $notifiable * @return KChatMessage */ public function toKChat($notifiable): KChatMessage @@ -130,8 +133,7 @@ public function toKChat($notifiable): KChatMessage class TestNotificationWithToParam extends Notification { /** - * @param $notifiable - * + * @param $notifiable * @return KChatMessage */ public function toKChat($notifiable): KChatMessage diff --git a/tests/KChatMessageTest.php b/tests/KChatMessageTest.php index fde641db..77e1753e 100644 --- a/tests/KChatMessageTest.php +++ b/tests/KChatMessageTest.php @@ -2,7 +2,6 @@ namespace NotificationChannels\KChat\Test; -use NotificationChannels\KChat\Exceptions\CouldNotSendNotification; use NotificationChannels\KChat\KChatMessage; use PHPUnit\Framework\TestCase; From 10cac04e20b39f11ab2017be4c364a691fa01b73 Mon Sep 17 00:00:00 2001 From: Axel Piaget Date: Tue, 1 Aug 2023 23:20:10 +0200 Subject: [PATCH 3/3] Test matrix --- .github/workflows/tests.yml | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0051216f..15942f68 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: true matrix: - php: [7.2, 7.3, 7.4, 8.0, 8.1, 8.2] + php: [7.3, 7.4, 8.0, 8.1, 8.2] name: Tests on PHP ${{ matrix.php }} - ${{ matrix.stability }} diff --git a/composer.json b/composer.json index c7fcdf3d..a711f6fe 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ ], "require": { "ext-json": "*", - "php": ">=7.2", + "php": ">=7.3", "guzzlehttp/guzzle": "^6.3 || ^7.0", "illuminate/notifications": "~6.0 || ~7.0 || ~8.0 || ~9.0 || ~10.0", "illuminate/support": "~6.0 || ~7.0 || ~8.0 || ~9.0 || ~10.0"