Skip to content

Commit cb2da0a

Browse files
authored
Add event MagicLink Delete (#129)
1 parent a270d37 commit cb2da0a

File tree

5 files changed

+122
-6
lines changed

5 files changed

+122
-6
lines changed

README.md

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,35 @@ $urlToSend = $magiclink->url;
314314

315315
## Events
316316

317-
MagicLink fires two events:
317+
MagicLink can fires three events:
318318

319-
- `MagicLink\Events\MagicLinkWasCreated`
320-
- `MagicLink\Events\MagicLinkWasVisited`
319+
### MagicLinkWasCreated
320+
321+
Event `MagicLink\Events\MagicLinkWasCreated`
322+
323+
This event is fired when a magic link is created.
324+
325+
### MagicLinkWasVisited
326+
327+
Event `MagicLink\Events\MagicLinkWasVisited`
328+
329+
This event is fired when a magic link is visited.
330+
331+
### MagicLinkWasDeleted
332+
333+
Event `MagicLink\Events\MagicLinkWasDeleted`
334+
335+
This event is fired when you disable mass deletion. Add this line in your
336+
`.env` file to disable mass deletion:
337+
338+
```.env
339+
# Disable mass deletion for enable event MagicLinkWasDeleted
340+
MAGICLINK_DELETE_MASSIVE=false
341+
```
342+
343+
> [!WARNING]
344+
> If you disable mass deletion, the cleanup will be performed one by one.
345+
> If you have many records, this can be an issue.
321346
322347
## Customization
323348

config/magiclink.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@
1515
'view' => 'magiclink::ask-for-access-code-form',
1616
],
1717

18+
/*
19+
|--------------------------------------------------------------------------
20+
| Delete Magic Link Expired massive
21+
|--------------------------------------------------------------------------
22+
|
23+
| Expired MagicLinks are automatically and massively deleted from the database.
24+
| If you want to disable this option, change the value to false.
25+
|
26+
| If you disable this option, expired MagicLinks will be deleted one by one
27+
| triggering the event MagicLink\Events\MagicLinkWasDeleted.
28+
|
29+
*/
30+
'delete_massive' => env('MAGICLINK_DELETE_MASSIVE', true),
31+
1832
/*
1933
|--------------------------------------------------------------------------
2034
| Disable default route

src/Events/MagicLinkWasDeleted.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace MagicLink\Events;
4+
5+
class MagicLinkWasDeleted
6+
{
7+
public $magiclink;
8+
9+
public function __construct($magiclink)
10+
{
11+
$this->magiclink = $magiclink;
12+
}
13+
}

src/MagicLink.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Illuminate\Support\Str;
1111
use MagicLink\Actions\ActionAbstract;
1212
use MagicLink\Events\MagicLinkWasCreated;
13+
use MagicLink\Events\MagicLinkWasDeleted;
1314
use MagicLink\Events\MagicLinkWasVisited;
1415

1516
/**
@@ -214,16 +215,28 @@ public static function getMagicLinkByToken($token)
214215
*/
215216
public static function deleteMagicLinkExpired()
216217
{
217-
static::where(function ($query) {
218+
$query = MagicLink::where(function ($query) {
218219
$query
219220
->where('available_at', '<', Carbon::now())
220221
->orWhere(function ($query) {
221222
$query
222223
->whereNotNull('max_visits')
223224
->whereRaw('max_visits <= num_visits');
224225
});
225-
})
226-
->delete();
226+
});
227+
228+
if (config('magiclink.delete_massive', true)) {
229+
$query->delete();
230+
231+
return;
232+
}
233+
234+
235+
$query->get()->each(function (MagicLink $magiclink) {
236+
$magiclink->delete();
237+
238+
event(new MagicLinkWasDeleted($magiclink));
239+
});
227240
}
228241

229242
/**

tests/MagicLinkDeleteTest.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
namespace MagicLink\Test;
44

5+
use Illuminate\Support\Collection;
6+
use Illuminate\Support\Facades\Event;
57
use MagicLink\Actions\LoginAction;
8+
use MagicLink\Actions\ResponseAction;
9+
use MagicLink\Events\MagicLinkWasDeleted;
610
use MagicLink\MagicLink;
711
use MagicLink\Test\TestSupport\User;
812

@@ -80,4 +84,51 @@ public function test_delete_all_magiclink()
8084

8185
$this->assertEquals(0, MagicLink::count());
8286
}
87+
88+
public function test_delete_all_magiclink_expired_one_and_one_dispatch_event_deleted()
89+
{
90+
Event::fake([MagicLinkWasDeleted::class]);
91+
92+
config(['magiclink.delete_massive' => false]);
93+
94+
$this->createMagicLinkExpired(3);
95+
96+
MagicLink::deleteMagicLinkExpired();
97+
98+
Event::assertDispatched(MagicLinkWasDeleted::class, 3);
99+
100+
Event::assertDispatched(MagicLinkWasDeleted::class,function (MagicLinkWasDeleted $event) {
101+
return $event->magiclink->action->run()['message'] === 'Hello World 1';
102+
});
103+
104+
$this->assertEquals(0, MagicLink::count());
105+
}
106+
107+
public function test_delete_all_magiclink_expired_all_not_dispatch_event_deleted()
108+
{
109+
Event::fake([MagicLinkWasDeleted::class]);
110+
111+
config(['magiclink.delete_massive' => true]);
112+
113+
$this->createMagicLinkExpired(3);
114+
115+
MagicLink::deleteMagicLinkExpired();
116+
117+
Event::assertDispatched(MagicLinkWasDeleted::class, 0);
118+
119+
$this->assertEquals(0, MagicLink::count());
120+
}
121+
122+
private function createMagicLinkExpired(int $count = 1): Collection
123+
{
124+
return collect(range(1, $count))
125+
->map(function ($index) {
126+
$magiclink = MagicLink::create(new ResponseAction(['message' => 'Hello World ' . $index]));
127+
128+
$magiclink->available_at = now()->subMinute();
129+
$magiclink->save();
130+
131+
return $magiclink;
132+
});
133+
}
83134
}

0 commit comments

Comments
 (0)