Skip to content

Commit

Permalink
Add event MagicLink Delete (#129)
Browse files Browse the repository at this point in the history
  • Loading branch information
cesargb authored Jan 8, 2025
1 parent a270d37 commit cb2da0a
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 6 deletions.
31 changes: 28 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,10 +314,35 @@ $urlToSend = $magiclink->url;

## Events

MagicLink fires two events:
MagicLink can fires three events:

- `MagicLink\Events\MagicLinkWasCreated`
- `MagicLink\Events\MagicLinkWasVisited`
### MagicLinkWasCreated

Event `MagicLink\Events\MagicLinkWasCreated`

This event is fired when a magic link is created.

### MagicLinkWasVisited

Event `MagicLink\Events\MagicLinkWasVisited`

This event is fired when a magic link is visited.

### MagicLinkWasDeleted

Event `MagicLink\Events\MagicLinkWasDeleted`

This event is fired when you disable mass deletion. Add this line in your
`.env` file to disable mass deletion:

```.env
# Disable mass deletion for enable event MagicLinkWasDeleted
MAGICLINK_DELETE_MASSIVE=false
```

> [!WARNING]
> If you disable mass deletion, the cleanup will be performed one by one.
> If you have many records, this can be an issue.
## Customization

Expand Down
14 changes: 14 additions & 0 deletions config/magiclink.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,20 @@
'view' => 'magiclink::ask-for-access-code-form',
],

/*
|--------------------------------------------------------------------------
| Delete Magic Link Expired massive
|--------------------------------------------------------------------------
|
| Expired MagicLinks are automatically and massively deleted from the database.
| If you want to disable this option, change the value to false.
|
| If you disable this option, expired MagicLinks will be deleted one by one
| triggering the event MagicLink\Events\MagicLinkWasDeleted.
|
*/
'delete_massive' => env('MAGICLINK_DELETE_MASSIVE', true),

/*
|--------------------------------------------------------------------------
| Disable default route
Expand Down
13 changes: 13 additions & 0 deletions src/Events/MagicLinkWasDeleted.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace MagicLink\Events;

class MagicLinkWasDeleted
{
public $magiclink;

public function __construct($magiclink)
{
$this->magiclink = $magiclink;
}
}
19 changes: 16 additions & 3 deletions src/MagicLink.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Illuminate\Support\Str;
use MagicLink\Actions\ActionAbstract;
use MagicLink\Events\MagicLinkWasCreated;
use MagicLink\Events\MagicLinkWasDeleted;
use MagicLink\Events\MagicLinkWasVisited;

/**
Expand Down Expand Up @@ -214,16 +215,28 @@ public static function getMagicLinkByToken($token)
*/
public static function deleteMagicLinkExpired()
{
static::where(function ($query) {
$query = MagicLink::where(function ($query) {
$query
->where('available_at', '<', Carbon::now())
->orWhere(function ($query) {
$query
->whereNotNull('max_visits')
->whereRaw('max_visits <= num_visits');
});
})
->delete();
});

if (config('magiclink.delete_massive', true)) {
$query->delete();

return;
}


$query->get()->each(function (MagicLink $magiclink) {
$magiclink->delete();

event(new MagicLinkWasDeleted($magiclink));
});
}

/**
Expand Down
51 changes: 51 additions & 0 deletions tests/MagicLinkDeleteTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

namespace MagicLink\Test;

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Event;
use MagicLink\Actions\LoginAction;
use MagicLink\Actions\ResponseAction;
use MagicLink\Events\MagicLinkWasDeleted;
use MagicLink\MagicLink;
use MagicLink\Test\TestSupport\User;

Expand Down Expand Up @@ -80,4 +84,51 @@ public function test_delete_all_magiclink()

$this->assertEquals(0, MagicLink::count());
}

public function test_delete_all_magiclink_expired_one_and_one_dispatch_event_deleted()
{
Event::fake([MagicLinkWasDeleted::class]);

config(['magiclink.delete_massive' => false]);

$this->createMagicLinkExpired(3);

MagicLink::deleteMagicLinkExpired();

Event::assertDispatched(MagicLinkWasDeleted::class, 3);

Event::assertDispatched(MagicLinkWasDeleted::class,function (MagicLinkWasDeleted $event) {
return $event->magiclink->action->run()['message'] === 'Hello World 1';
});

$this->assertEquals(0, MagicLink::count());
}

public function test_delete_all_magiclink_expired_all_not_dispatch_event_deleted()
{
Event::fake([MagicLinkWasDeleted::class]);

config(['magiclink.delete_massive' => true]);

$this->createMagicLinkExpired(3);

MagicLink::deleteMagicLinkExpired();

Event::assertDispatched(MagicLinkWasDeleted::class, 0);

$this->assertEquals(0, MagicLink::count());
}

private function createMagicLinkExpired(int $count = 1): Collection
{
return collect(range(1, $count))
->map(function ($index) {
$magiclink = MagicLink::create(new ResponseAction(['message' => 'Hello World ' . $index]));

$magiclink->available_at = now()->subMinute();
$magiclink->save();

return $magiclink;
});
}
}

0 comments on commit cb2da0a

Please sign in to comment.