Skip to content

Commit

Permalink
🎉 [1.4.0] Version Update
Browse files Browse the repository at this point in the history
- Support multiple mode for Edit Event Log
- Add retrieved event log support
- Fine tune some code.
  • Loading branch information
yungts97 committed Oct 2, 2022
1 parent cce4a92 commit f0518ed
Show file tree
Hide file tree
Showing 13 changed files with 207 additions and 40 deletions.
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,18 @@ Log::all();

However, you can get activity logs from a model by using this.
```php
$post->logs();
$post->logs; // get all model's logs
$post->log; // get the latest model's log
$post->logs()->where('log_type', 'edit')->get(); // get filtered logs
```

You allowed to specify the mode for the `edit` event log. There are two modes available now `simple`/`full`. The default mode is `full`.
```php
# config/user-activity-log.php

# only can choose either one of them
'mode' => 'full', # the 'full' mode record everything
'mode' => 'simple', # the 'simple' mode only record the modified columns
```

## ⚙️ Configuration
Expand All @@ -122,10 +133,17 @@ return [
'create' => true,
'edit' => true,
'delete' => true,
'retrieve' => false,
'login' => true,
'logout' => true
],

# the mode is only for 'edit' event log
# the 'simple' mode only record the modified columns
# the 'full' mode record everything
# supported mode => 'simple' / 'full'
'mode' => 'full',

# timezone for log date time (Change to your region time zone)
# UTC is always the time zone being recorded.
# define your timezone to have the accurate logs time and filtered record (Especially filtered by date time)
Expand Down
9 changes: 8 additions & 1 deletion config/user-activity-log.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,19 @@
'create' => true,
'edit' => true,
'delete' => true,
'retrieve' => false,
'login' => true,
'logout' => true
],

# the mode is only for 'edit' event log
# the 'simple' mode only record the modified columns
# the 'full' mode record everything
# supported mode => 'simple' / 'full'
'mode' => 'full',

# timezone for log date time (Change to your region time zone)
# UTC is always the time zone being recorded.
# define your timezone to have the accurate logs time and filtered record (Especially filtered by date time)
'timezone' => 'UTC'
];
];
20 changes: 20 additions & 0 deletions src/Events/RetrievedModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Yungts97\LaravelUserActivityLog\Events;

use Illuminate\Queue\SerializesModels;
use Illuminate\Database\Eloquent\Model;

class RetrievedModel
{
use SerializesModels;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(public Model $model)
{
}
}
9 changes: 2 additions & 7 deletions src/Listeners/CreatedListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@

namespace Yungts97\LaravelUserActivityLog\Listeners;

use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasTableName;
use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasData;

class CreatedListener extends Listener
class CreatedListener extends ModelListener
{
use HasTableName, HasData;

public function __construct()
{
parent::__construct("create");
}
}
}
9 changes: 2 additions & 7 deletions src/Listeners/DeletedListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@

namespace Yungts97\LaravelUserActivityLog\Listeners;

use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasTableName;
use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasData;

class DeletedListener extends Listener
class DeletedListener extends ModelListener
{
use HasTableName, HasData;

public function __construct()
{
parent::__construct("delete");
}
}
}
14 changes: 13 additions & 1 deletion src/Listeners/Listener.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Yungts97\LaravelUserActivityLog\Listeners;

use Yungts97\LaravelUserActivityLog\Models\Log;
use Illuminate\Contracts\Auth\Authenticatable;

class Listener
{
Expand All @@ -29,6 +30,7 @@ protected function logging()
'ip' => request()->ip(),
'user_agent' => request()->userAgent()
];

// insert log record
Log::create([
'user_id' => auth()?->user()?->id,
Expand All @@ -42,6 +44,9 @@ protected function logging()

protected function isLoggable()
{
// always skip retrieve event for authenticatable model. Exp. App\Models\User
if ($this->isRetrieveAuthenticatableModel()) return false;

return config("user-activity-log.events.{$this->event_name}", false);
}

Expand All @@ -54,4 +59,11 @@ protected function getData()
{
return null;
}
}

private function isRetrieveAuthenticatableModel()
{
return
$this->event_name === 'retrieve' &&
$this->event?->model instanceof Authenticatable;
}
}
16 changes: 16 additions & 0 deletions src/Listeners/ModelListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Yungts97\LaravelUserActivityLog\Listeners;

use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasData;
use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasTableName;

class ModelListener extends Listener
{
use HasTableName, HasData;

public function __construct(string $event_name = "")
{
parent::__construct($event_name);
}
}
11 changes: 11 additions & 0 deletions src/Listeners/RetrievedListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Yungts97\LaravelUserActivityLog\Listeners;

class RetrievedListener extends ModelListener
{
public function __construct()
{
parent::__construct("retrieve");
}
}
9 changes: 2 additions & 7 deletions src/Listeners/UpdatedListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@

namespace Yungts97\LaravelUserActivityLog\Listeners;

use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasTableName;
use Yungts97\LaravelUserActivityLog\Traits\ListenerTraits\HasData;

class UpdatedListener extends Listener
class UpdatedListener extends ModelListener
{
use HasTableName, HasData;

public function __construct()
{
parent::__construct("edit");
}
}
}
10 changes: 7 additions & 3 deletions src/Traits/ListenerTraits/HasData.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ trait HasData
{
protected function getData()
{
return $this->event_name === 'create' ?
Arr::except($this->event->model->toArray(), $this->event->model->log_hidden ?? []) :
if ($this->event_name === 'create')
return Arr::except($this->event->model->toArray(), $this->event->model->log_hidden ?? []);

$mode = config("user-activity-log.mode", 'simple');
return $this->event_name === 'edit' && $mode === 'simple' ?
Arr::except([...$this->event->model->getChanges(), 'id' => $this->event->model->id], $this->event->model->log_hidden ?? []) :
Arr::except($this->event->model->getRawOriginal(), $this->event->model->log_hidden ?? []);
}
}
}
14 changes: 9 additions & 5 deletions src/Traits/Loggable.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Yungts97\LaravelUserActivityLog\Events\CreatedModel;
use Yungts97\LaravelUserActivityLog\Events\DeletedModel;
use Yungts97\LaravelUserActivityLog\Events\UpdatedModel;
use Yungts97\LaravelUserActivityLog\Events\RetrievedModel;

trait Loggable
{
Expand All @@ -15,14 +16,17 @@ public function initializeLoggable()
'created' => CreatedModel::class,
'updated' => UpdatedModel::class,
'deleted' => DeletedModel::class,
'retrieved' => RetrievedModel::class,
];
}

public function log()
{
return $this->hasOne(Log::class, 'data->id', 'id')->where('table_name', $this->getTable());
}

public function logs()
{
return Log::where([
['table_name', $this->getTable()],
['data->id', $this->id]
])->get();
return $this->hasMany(Log::class, 'data->id', 'id')->where('table_name', $this->getTable());
}
}
}
13 changes: 9 additions & 4 deletions src/UserActivityLogEventServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
use Illuminate\Auth\Events\Login;
use Illuminate\Auth\Events\Logout;
use Yungts97\LaravelUserActivityLog\Events\CreatedModel;
use Yungts97\LaravelUserActivityLog\Events\UpdatedModel;
use Yungts97\LaravelUserActivityLog\Events\DeletedModel;
use Yungts97\LaravelUserActivityLog\Listeners\LogoutListener;
use Yungts97\LaravelUserActivityLog\Events\UpdatedModel;
use Yungts97\LaravelUserActivityLog\Events\RetrievedModel;
use Yungts97\LaravelUserActivityLog\Listeners\LoginListener;
use Yungts97\LaravelUserActivityLog\Listeners\LogoutListener;
use Yungts97\LaravelUserActivityLog\Listeners\CreatedListener;
use Yungts97\LaravelUserActivityLog\Listeners\UpdatedListener;
use Yungts97\LaravelUserActivityLog\Listeners\DeletedListener;
use Yungts97\LaravelUserActivityLog\Listeners\UpdatedListener;
use Yungts97\LaravelUserActivityLog\Listeners\RetrievedListener;
use Illuminate\Foundation\Support\Providers\EventServiceProvider;


Expand All @@ -32,11 +34,14 @@ class UserActivityLogEventServiceProvider extends EventServiceProvider
],
DeletedModel::class => [
DeletedListener::class
],
RetrievedModel::class => [
RetrievedListener::class
]
];

public function boot()
{
parent::boot();
}
}
}
93 changes: 89 additions & 4 deletions tests/Feature/UserActivityLogTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,30 @@ function it_can_log_on_delete_event()
]);
}

/** @test */
function it_can_log_on_retrieve_event()
{
config(['user-activity-log.events.retrieve' => true]);

//user login
$user = User::first();
Auth::login($user);

//create a post
$newPost = new Post(['name' => 'Post 1']);
$user->posts()->save($newPost);

//retrieve a post
$post = Post::first();

//checking database have the activity log record
$this->assertDatabaseHas('logs', [
'log_type' => 'retrieve',
'user_id' => $user->id,
'table_name' => 'posts'
]);
}

/** @test */
function it_can_skip_logging()
{
Expand Down Expand Up @@ -133,9 +157,70 @@ function it_can_get_logs_from_the_model()
'table_name' => 'posts'
]);

$logs = $newPost->logs();
$logs = $newPost->logs;
$this->assertCount(1, $logs);

$this->assertEquals($newPost->toArray(), $logs[0]->data);

$newPost->unsetRelation('logs');
$this->assertEquals($newPost->toArray(), $logs->first()->data);
}

/** @test */
function it_can_log_on_edit_event_with_simple_mode()
{
config(['user-activity-log.mode' => 'simple']);

//user login
$user = User::first();
Auth::login($user);

//create a post
$newPost = new Post(['name' => 'Post 1']);
$user->posts()->save($newPost);

//edit the post
$newPost->name = "Post 1 edited";
$newPost->save();

//checking database have the activity log record
$this->assertDatabaseHas('logs', [
'log_type' => 'edit',
'user_id' => $user->id,
'table_name' => 'posts'
]);

//since the latest log is edit type, so just simply use latest log to test
$actualLogData = $newPost->log->data;
$expectedLogData = [...$newPost->getChanges(), 'id' => $newPost->id];
$this->assertTrue($expectedLogData == $actualLogData);
}

/** @test */
function it_can_log_on_edit_event_with_full_mode()
{
config(['user-activity-log.mode' => 'full']);

//user login
$user = User::first();
Auth::login($user);

//create a post
$newPost = new Post(['name' => 'Post 1']);
$user->posts()->save($newPost);
$expectedLogData = $newPost->getRawOriginal();

//edit the post
$newPost->name = "Post 1 edited";
$newPost->save();

//checking database have the activity log record
$this->assertDatabaseHas('logs', [
'log_type' => 'edit',
'user_id' => $user->id,
'table_name' => 'posts'
]);

//since the latest log is edit type, so just simply use latest log to test
$actualLogData = $newPost->log->data;
$this->assertTrue($expectedLogData == $actualLogData);
}
}
}

0 comments on commit f0518ed

Please sign in to comment.