From e93234a79ae13f912311f575d1ee304940f8b10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20R=C3=B6pstorf?= <13087909+FRoepstorf@users.noreply.github.com> Date: Thu, 24 Aug 2023 07:04:04 +0200 Subject: [PATCH 01/10] Collects errors on eventBridge putEvents and logs them --- .../Broadcasters/EventBridgeBroadcaster.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php b/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php index 2f70441..206708b 100644 --- a/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php +++ b/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php @@ -4,6 +4,7 @@ use Aws\EventBridge\EventBridgeClient; use Illuminate\Broadcasting\Broadcasters\Broadcaster; +use Illuminate\Support\Facades\Log; class EventBridgeBroadcaster extends Broadcaster { @@ -52,9 +53,19 @@ public function broadcast(array $channels, $event, array $payload = []) { $events = $this->mapToEventBridgeEntries($channels, $event, $payload); - $this->eventBridgeClient->putEvents([ + $eventBridgeResult = $this->eventBridgeClient->putEvents([ 'Entries' => $events, ]); + + if ($eventBridgeResult->get('FailedEntryCount') > 0) { + $errors = collect(); + foreach ($eventBridgeResult->get('Entries') as $entry) { + if (isset($entry['ErrorMessage'])) { + $errors->push([$entry['ErrorMessage'], $entry['ErrorCode']]); + } + } + Log::error('Failed to send event to EventBridge', ['errors' => $errors->all()]); + } } /** From 8c166d271d198c7828d5fb74b1cd4b3785b9c735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20R=C3=B6pstorf?= <13087909+FRoepstorf@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:05:35 +0200 Subject: [PATCH 02/10] Plural on log message as it could contain more than one event --- src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php b/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php index 206708b..f279110 100644 --- a/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php +++ b/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php @@ -64,7 +64,7 @@ public function broadcast(array $channels, $event, array $payload = []) $errors->push([$entry['ErrorMessage'], $entry['ErrorCode']]); } } - Log::error('Failed to send event to EventBridge', ['errors' => $errors->all()]); + Log::error('Failed to send events to EventBridge', ['errors' => $errors->all()]); } } From a1f685d1d0085c315dd8cff0f8d8125d139fbf6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20R=C3=B6pstorf?= <13087909+FRoepstorf@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:13:38 +0200 Subject: [PATCH 03/10] Adds support for illuminate 10 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a304679..1cd6a46 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "php": "^7.3|^8.0", "ext-json": "*", "aws/aws-sdk-php": "^3.155", - "illuminate/support": "^8.52 || ^9.0" + "illuminate/support": "^8.52 || ^9.0 || ^10.0" }, "require-dev": { "orchestra/testbench": "^6.0 || ^7.0" From 310bedab3e1e14202a3ca0e284241c1fc31966b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20R=C3=B6pstorf?= <13087909+FRoepstorf@users.noreply.github.com> Date: Sat, 26 Aug 2023 07:59:08 +0200 Subject: [PATCH 04/10] Adds tests to ensure error handling works --- tests/Pub/BasicEvents/EventBridgeTest.php | 70 +++++++++++++++++++---- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/tests/Pub/BasicEvents/EventBridgeTest.php b/tests/Pub/BasicEvents/EventBridgeTest.php index fc99bb5..ce4bdaf 100644 --- a/tests/Pub/BasicEvents/EventBridgeTest.php +++ b/tests/Pub/BasicEvents/EventBridgeTest.php @@ -2,6 +2,8 @@ namespace PodPoint\AwsPubSub\Tests\Pub\BasicEvents; +use Aws\Result; +use Illuminate\Support\Facades\Log; use Mockery as m; use Mockery\MockInterface; use PodPoint\AwsPubSub\Tests\Pub\Concerns\InteractsWithEventBridge; @@ -21,7 +23,9 @@ public function it_broadcasts_basic_event_with_the_event_name_as_the_detail_type { $janeRetrieved = new UserRetrieved($this->createJane()); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved) { + $awsResultMock = $this->createMock(Result::class); + $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); + $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { $eventBridge ->shouldReceive('putEvents') ->once() @@ -30,7 +34,7 @@ public function it_broadcasts_basic_event_with_the_event_name_as_the_detail_type && $arg['Entries'][0]['DetailType'] === UserRetrieved::class && $arg['Entries'][0]['EventBusName'] === 'users' && $arg['Entries'][0]['Source'] === 'my-app'; - })); + }))->andReturn($awsResultMock); }); event($janeRetrieved); @@ -41,14 +45,16 @@ public function it_broadcasts_basic_event_with_action() { $janeRetrieved = new UserRetrievedWithCustomName($this->createJane()); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved) { + $awsResultMock = $this->createMock(Result::class); + $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); + $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { $eventBridge ->shouldReceive('putEvents') ->once() ->with(m::on(function ($arg) use ($janeRetrieved) { return $arg['Entries'][0]['Detail'] === json_encode($janeRetrieved) && $arg['Entries'][0]['DetailType'] === 'user.retrieved'; - })); + }))->andReturn($awsResultMock); }); event($janeRetrieved); @@ -59,7 +65,9 @@ public function it_broadcasts_basic_event_with_action_and_custom_payload() { $janeRetrieved = new UserRetrievedWithCustomPayload($this->createJane()); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved) { + $awsResultMock = $this->createMock(Result::class); + $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); + $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { $eventBridge ->shouldReceive('putEvents') ->once() @@ -69,7 +77,7 @@ public function it_broadcasts_basic_event_with_action_and_custom_payload() return $arg['Entries'][0]['Detail'] === json_encode($customPayload) && $arg['Entries'][0]['DetailType'] === UserRetrievedWithCustomPayload::class && $arg['Entries'][0]['EventBusName'] === 'users'; - })); + }))->andReturn($awsResultMock); }); event($janeRetrieved); @@ -80,7 +88,9 @@ public function it_broadcasts_basic_event_to_multiple_channels_as_buses() { $janeRetrieved = new UserRetrievedWithMultipleChannels($this->createJane()); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved) { + $awsResultMock = $this->createMock(Result::class); + $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); + $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { $eventBridge ->shouldReceive('putEvents') ->once() @@ -93,7 +103,7 @@ public function it_broadcasts_basic_event_to_multiple_channels_as_buses() }) ->filter() ->count() === 2; - })); + }))->andReturn($awsResultMock); }); event($janeRetrieved); @@ -106,7 +116,9 @@ public function it_can_use_a_source() $janeRetrieved = new UserRetrievedWithMultipleChannels($this->createJane()); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved) { + $awsResultMock = $this->createMock(Result::class); + $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); + $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { $eventBridge ->shouldReceive('putEvents') ->once() @@ -117,12 +129,50 @@ public function it_can_use_a_source() }) ->filter() ->count() > 0; - })); + })) + ->andReturn($awsResultMock); }); event($janeRetrieved); } + /** @test */ + public function it_logs_errors_when_events_fail_to_send() + { + $janeRetrieved = new UserRetrieved($this->createJane()); + + Log::spy(); + $awsResultMock = $this->createMock(Result::class); + $awsResultMock->method('get')->willReturnMap([ + ['FailedEntryCount', 1], + ['Entries', [ + [ + 'ErrorCode' => 'SomeErrorCode', + 'ErrorMessage' => 'SomeErrorMessage', + ], + ]], + ]); + $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $eventBridge + ->shouldReceive('putEvents') + ->once() + ->with(m::on(function ($arg) use ($janeRetrieved) { + return $arg['Entries'][0]['Detail'] === json_encode($janeRetrieved) + && $arg['Entries'][0]['DetailType'] === UserRetrieved::class + && $arg['Entries'][0]['EventBusName'] === 'users' + && $arg['Entries'][0]['Source'] === 'my-app'; + }))->andReturn($awsResultMock); + }); + + Log::shouldReceive('error')->once()->with('Failed to send events to EventBridge', [ + 'errors' => [ + ['SomeErrorMessage', 'SomeErrorCode'], + ], + ]); + + event($janeRetrieved); + } + protected function createJane(): User { return User::create([ From 743a986b0d5c7fd42f574c429fbaad636c2bf16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20R=C3=B6pstorf?= <13087909+FRoepstorf@users.noreply.github.com> Date: Sat, 26 Aug 2023 08:00:15 +0200 Subject: [PATCH 05/10] Revert illuminate/support 10^ support, existing pr should me merged --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1cd6a46..a304679 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "php": "^7.3|^8.0", "ext-json": "*", "aws/aws-sdk-php": "^3.155", - "illuminate/support": "^8.52 || ^9.0 || ^10.0" + "illuminate/support": "^8.52 || ^9.0" }, "require-dev": { "orchestra/testbench": "^6.0 || ^7.0" From fe94050549ee071628286ac64ca556264c03e0fc Mon Sep 17 00:00:00 2001 From: clemblanco Date: Thu, 28 Sep 2023 15:05:19 +0200 Subject: [PATCH 06/10] WIP --- composer.json | 3 +- .../Broadcasters/EventBridgeBroadcaster.php | 24 ++-- tests/Pub/BasicEvents/EventBridgeTest.php | 117 ++++++++---------- 3 files changed, 67 insertions(+), 77 deletions(-) diff --git a/composer.json b/composer.json index a304679..5807eae 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,8 @@ "php": "^7.3|^8.0", "ext-json": "*", "aws/aws-sdk-php": "^3.155", - "illuminate/support": "^8.52 || ^9.0" + "illuminate/support": "^8.52 || ^9.0", + "laravel/framework": "9.*" }, "require-dev": { "orchestra/testbench": "^6.0 || ^7.0" diff --git a/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php b/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php index f279110..ca62663 100644 --- a/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php +++ b/src/Pub/Broadcasting/Broadcasters/EventBridgeBroadcaster.php @@ -4,6 +4,7 @@ use Aws\EventBridge\EventBridgeClient; use Illuminate\Broadcasting\Broadcasters\Broadcaster; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Log; class EventBridgeBroadcaster extends Broadcaster @@ -53,18 +54,16 @@ public function broadcast(array $channels, $event, array $payload = []) { $events = $this->mapToEventBridgeEntries($channels, $event, $payload); - $eventBridgeResult = $this->eventBridgeClient->putEvents([ + $result = $this->eventBridgeClient->putEvents([ 'Entries' => $events, ]); - if ($eventBridgeResult->get('FailedEntryCount') > 0) { - $errors = collect(); - foreach ($eventBridgeResult->get('Entries') as $entry) { - if (isset($entry['ErrorMessage'])) { - $errors->push([$entry['ErrorMessage'], $entry['ErrorCode']]); - } - } - Log::error('Failed to send events to EventBridge', ['errors' => $errors->all()]); + if ($this->failedToBroadcast($result)) { + Log::error('Failed to send events to EventBridge', [ + 'errors' => collect($result->get('Entries'))->filter(function (array $entry) { + return Arr::hasAny($entry, ['ErrorCode', 'ErrorMessage']); + })->toArray(), + ]); } } @@ -87,4 +86,11 @@ protected function mapToEventBridgeEntries(array $channels, string $event, array }) ->all(); } + + protected function failedToBroadcast(?\Aws\Result $result): bool + { + return $result + && $result->hasKey('FailedEntryCount') + && $result->get('FailedEntryCount') > 0; + } } diff --git a/tests/Pub/BasicEvents/EventBridgeTest.php b/tests/Pub/BasicEvents/EventBridgeTest.php index ce4bdaf..4354900 100644 --- a/tests/Pub/BasicEvents/EventBridgeTest.php +++ b/tests/Pub/BasicEvents/EventBridgeTest.php @@ -21,92 +21,84 @@ class EventBridgeTest extends TestCase /** @test */ public function it_broadcasts_basic_event_with_the_event_name_as_the_detail_type_and_serialised_event_as_the_detail() { - $janeRetrieved = new UserRetrieved($this->createJane()); + $event = new UserRetrieved($this->createJane()); - $awsResultMock = $this->createMock(Result::class); - $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $this->mockEventBridge(function (MockInterface $eventBridge) use ($event) { $eventBridge ->shouldReceive('putEvents') ->once() - ->with(m::on(function ($arg) use ($janeRetrieved) { - return $arg['Entries'][0]['Detail'] === json_encode($janeRetrieved) + ->with(m::on(function ($arg) use ($event) { + return $arg['Entries'][0]['Detail'] === json_encode($event) && $arg['Entries'][0]['DetailType'] === UserRetrieved::class && $arg['Entries'][0]['EventBusName'] === 'users' && $arg['Entries'][0]['Source'] === 'my-app'; - }))->andReturn($awsResultMock); + })); }); - event($janeRetrieved); + event($event); } /** @test */ public function it_broadcasts_basic_event_with_action() { - $janeRetrieved = new UserRetrievedWithCustomName($this->createJane()); + $event = new UserRetrievedWithCustomName($this->createJane()); - $awsResultMock = $this->createMock(Result::class); - $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $this->mockEventBridge(function (MockInterface $eventBridge) use ($event) { $eventBridge ->shouldReceive('putEvents') ->once() - ->with(m::on(function ($arg) use ($janeRetrieved) { - return $arg['Entries'][0]['Detail'] === json_encode($janeRetrieved) + ->with(m::on(function ($arg) use ($event) { + return $arg['Entries'][0]['Detail'] === json_encode($event) && $arg['Entries'][0]['DetailType'] === 'user.retrieved'; - }))->andReturn($awsResultMock); + })); }); - event($janeRetrieved); + event($event); } /** @test */ public function it_broadcasts_basic_event_with_action_and_custom_payload() { - $janeRetrieved = new UserRetrievedWithCustomPayload($this->createJane()); + $event = new UserRetrievedWithCustomPayload($this->createJane()); - $awsResultMock = $this->createMock(Result::class); - $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $this->mockEventBridge(function (MockInterface $eventBridge) use ($event) { $eventBridge ->shouldReceive('putEvents') ->once() - ->with(m::on(function ($arg) use ($janeRetrieved) { - $customPayload = array_merge($janeRetrieved->broadcastWith(), ['socket' => null]); + ->with(m::on(function ($arg) use ($event) { + $customPayload = array_merge($event->broadcastWith(), ['socket' => null]); return $arg['Entries'][0]['Detail'] === json_encode($customPayload) && $arg['Entries'][0]['DetailType'] === UserRetrievedWithCustomPayload::class && $arg['Entries'][0]['EventBusName'] === 'users'; - }))->andReturn($awsResultMock); + })); }); - event($janeRetrieved); + event($event); } /** @test */ public function it_broadcasts_basic_event_to_multiple_channels_as_buses() { - $janeRetrieved = new UserRetrievedWithMultipleChannels($this->createJane()); + $event = new UserRetrievedWithMultipleChannels($this->createJane()); - $awsResultMock = $this->createMock(Result::class); - $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $this->mockEventBridge(function (MockInterface $eventBridge) use ($event) { $eventBridge ->shouldReceive('putEvents') ->once() - ->with(m::on(function ($arg) use ($janeRetrieved) { - return collect($janeRetrieved->broadcastOn()) - ->map(function ($channel, $key) use ($arg, $janeRetrieved) { - return $arg['Entries'][$key]['Detail'] === json_encode($janeRetrieved) + ->with(m::on(function ($arg) use ($event) { + return collect($event->broadcastOn()) + ->map(function ($channel, $key) use ($arg, $event) { + return $arg['Entries'][$key]['Detail'] === json_encode($event) && $arg['Entries'][$key]['DetailType'] === UserRetrievedWithMultipleChannels::class && $arg['Entries'][$key]['EventBusName'] === $channel; }) ->filter() ->count() === 2; - }))->andReturn($awsResultMock); + })); }); - event($janeRetrieved); + event($event); } /** @test */ @@ -114,63 +106,54 @@ public function it_can_use_a_source() { config(['broadcasting.connections.eventbridge.source' => 'some-other-source']); - $janeRetrieved = new UserRetrievedWithMultipleChannels($this->createJane()); + $event = new UserRetrievedWithMultipleChannels($this->createJane()); - $awsResultMock = $this->createMock(Result::class); - $awsResultMock->method('get')->with('FailedEntryCount')->willReturn(0); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $this->mockEventBridge(function (MockInterface $eventBridge) use ($event) { $eventBridge ->shouldReceive('putEvents') ->once() - ->with(m::on(function ($arg) use ($janeRetrieved) { - return collect($janeRetrieved->broadcastOn()) + ->with(m::on(function ($arg) use ($event) { + return collect($event->broadcastOn()) ->map(function ($channel, $key) use ($arg) { return $arg['Entries'][$key]['Source'] === 'some-other-source'; }) ->filter() ->count() > 0; - })) - ->andReturn($awsResultMock); + })); }); - event($janeRetrieved); + event($event); } /** @test */ public function it_logs_errors_when_events_fail_to_send() { - $janeRetrieved = new UserRetrieved($this->createJane()); - - Log::spy(); - $awsResultMock = $this->createMock(Result::class); - $awsResultMock->method('get')->willReturnMap([ - ['FailedEntryCount', 1], - ['Entries', [ - [ - 'ErrorCode' => 'SomeErrorCode', - 'ErrorMessage' => 'SomeErrorMessage', - ], - ]], - ]); - $this->mockEventBridge(function (MockInterface $eventBridge) use ($janeRetrieved, $awsResultMock) { + $event = new UserRetrieved($this->createJane()); + + $failedEntry = [ + 'ErrorCode' => 'InternalFailure', + 'ErrorMessage' => 'Something went wrong', + 'EventId' => $this->faker->uuid, + ]; + + $this->mockEventBridge(function (MockInterface $eventBridge) use ($event, $failedEntry) { $eventBridge ->shouldReceive('putEvents') ->once() - ->with(m::on(function ($arg) use ($janeRetrieved) { - return $arg['Entries'][0]['Detail'] === json_encode($janeRetrieved) - && $arg['Entries'][0]['DetailType'] === UserRetrieved::class - && $arg['Entries'][0]['EventBusName'] === 'users' - && $arg['Entries'][0]['Source'] === 'my-app'; - }))->andReturn($awsResultMock); + ->andReturn(new Result([ + 'FailedEntryCount' => 1, + 'Entries' => [ + $failedEntry, + ['EventId' => $this->faker->uuid], + ], + ])); }); Log::shouldReceive('error')->once()->with('Failed to send events to EventBridge', [ - 'errors' => [ - ['SomeErrorMessage', 'SomeErrorCode'], - ], + 'errors' => [$failedEntry], ]); - event($janeRetrieved); + event($event); } protected function createJane(): User From 72ecd1fc7d42e8a8ff12cf2a6ed610b6726dd8b8 Mon Sep 17 00:00:00 2001 From: clemblanco Date: Thu, 28 Sep 2023 15:11:58 +0200 Subject: [PATCH 07/10] WIP --- tests/Pub/BasicEvents/EventBridgeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Pub/BasicEvents/EventBridgeTest.php b/tests/Pub/BasicEvents/EventBridgeTest.php index 4354900..b14be89 100644 --- a/tests/Pub/BasicEvents/EventBridgeTest.php +++ b/tests/Pub/BasicEvents/EventBridgeTest.php @@ -136,7 +136,7 @@ public function it_logs_errors_when_events_fail_to_send() 'EventId' => $this->faker->uuid, ]; - $this->mockEventBridge(function (MockInterface $eventBridge) use ($event, $failedEntry) { + $this->mockEventBridge(function (MockInterface $eventBridge) use ($failedEntry) { $eventBridge ->shouldReceive('putEvents') ->once() From 2f25ce3a8ec5441b3b925dd4929c91dc4a77b406 Mon Sep 17 00:00:00 2001 From: clemblanco Date: Thu, 28 Sep 2023 15:32:47 +0200 Subject: [PATCH 08/10] WIP --- .github/workflows/run-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index cf5525f..e3cc518 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest strategy: fail-fast: true matrix: From 99cd055738114385cccb53d5d6a8b0a2d733290d Mon Sep 17 00:00:00 2001 From: clemblanco Date: Thu, 28 Sep 2023 15:34:57 +0200 Subject: [PATCH 09/10] WIP --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5807eae..a304679 100644 --- a/composer.json +++ b/composer.json @@ -14,8 +14,7 @@ "php": "^7.3|^8.0", "ext-json": "*", "aws/aws-sdk-php": "^3.155", - "illuminate/support": "^8.52 || ^9.0", - "laravel/framework": "9.*" + "illuminate/support": "^8.52 || ^9.0" }, "require-dev": { "orchestra/testbench": "^6.0 || ^7.0" From 67befe3c9511205c0d27584f625308457802a626 Mon Sep 17 00:00:00 2001 From: clemblanco Date: Thu, 28 Sep 2023 15:36:01 +0200 Subject: [PATCH 10/10] ci: trigger