diff --git a/app/Enumerations/ActionLogTypesForLogger.php b/app/Enumerations/ActionLogTypesForLogger.php new file mode 100644 index 00000000..8566e5f6 --- /dev/null +++ b/app/Enumerations/ActionLogTypesForLogger.php @@ -0,0 +1,16 @@ +string_id, $type->id); + } + } +} \ No newline at end of file diff --git a/app/Listeners/LogLogin.php b/app/Listeners/LogLogin.php new file mode 100644 index 00000000..4e2cecc5 --- /dev/null +++ b/app/Listeners/LogLogin.php @@ -0,0 +1,36 @@ + $event->user->id, + 'name' => $event->user->name, + 'email' => $event->user->email + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'login'; + } +} diff --git a/app/Listeners/LogLogout.php b/app/Listeners/LogLogout.php new file mode 100644 index 00000000..7aeefce3 --- /dev/null +++ b/app/Listeners/LogLogout.php @@ -0,0 +1,37 @@ + $event->user->id, + 'name' => $event->user->name, + 'email' => $event->user->email + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'logout'; + } +} diff --git a/app/Listeners/Logger.php b/app/Listeners/Logger.php new file mode 100644 index 00000000..e1b75628 --- /dev/null +++ b/app/Listeners/Logger.php @@ -0,0 +1,74 @@ +actionTypes = ActionLogTypesForLogger::getWithTranslations(); + } + + /** + * Shortcut for loging events + * + * @param array $parameters + */ + protected function saveLog($parameters = []) + { + // try to translate string id into integer id + $typeId = $this->getTypeId(); + + // is user logged in and exists given type? + if (!Auth::check() || is_null($typeId)) { + return; + } + + // get user id + $userId = Auth::user()->id; + + // setup object for insertion + $data = [ + 'user_id' => $userId, + 'type_id' => $typeId, + 'parameters' => json_encode((array)$parameters) + ]; + + // create new logged event + ActionLog::create($data); + } + + /** + * Translate string id to integer id + * + * @return int|null ID of action type when exists, null otherwise + */ + private function getTypeId() + { + $name = $this->getName(); + if (!isset($this->actionTypes[$name])) { + return null; + } + + return $this->actionTypes[$name]; + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + abstract protected function getName(); +} diff --git a/app/Models/ActionLog.php b/app/Models/ActionLog.php index 8b95d4b6..809a43b7 100644 --- a/app/Models/ActionLog.php +++ b/app/Models/ActionLog.php @@ -9,8 +9,9 @@ use Illuminate\Database\Eloquent\Model; */ class ActionLog extends Model { + protected $table = 'action_log'; - public $timestamps = true; + public $timestamps = false; protected $fillable = [ 'type_id', diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 58ce9624..935202c4 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,12 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'App\Events\SomeEvent' => [ - 'App\Listeners\EventListener', + // internal Laravel events - should work as auth.login and auth.logout, however it doesn't... + 'Illuminate\Auth\Events\Login' => [ + 'App\Listeners\LogLogin' + ], + 'Illuminate\Auth\Events\Logout' => [ + 'App\Listeners\LogLogout' ], ]; diff --git a/database/seeds/SeedActionLogTypes.php b/database/seeds/SeedActionLogTypes.php index c832e0db..126faaa6 100644 --- a/database/seeds/SeedActionLogTypes.php +++ b/database/seeds/SeedActionLogTypes.php @@ -15,6 +15,7 @@ class SeedActionLogTypes extends Seeder 'login', 'logout', 'userEdit', + 'createUser', 'newCustomField', 'editCustomField', 'deleteCustomField',