summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/access_log.php11
-rw-r--r--database/migrations/0000_00_00_000000_create_access_log_table.php44
-rw-r--r--src/AccessLogServiceProvider.php14
-rw-r--r--src/Http/AccessLogMiddleware.php43
-rw-r--r--src/Http/Models/AccessLog.php33
5 files changed, 145 insertions, 0 deletions
diff --git a/config/access_log.php b/config/access_log.php
new file mode 100644
index 0000000..1a8663c
--- /dev/null
+++ b/config/access_log.php
@@ -0,0 +1,11 @@
+<?php
+
+return [
+ 'enabled' => env('ACCESS_LOG_ENABLED', true),
+ 'table_name' => 'access_log',
+ 'log_ip' => false,
+ 'log_user_agent' => false,
+
+ 'model' => \Lightscale\LaralightAccessLog\Models\AccessLog::class,
+ 'user_model' => \Illuminate\Foundation\Auth\User::class,
+];
diff --git a/database/migrations/0000_00_00_000000_create_access_log_table.php b/database/migrations/0000_00_00_000000_create_access_log_table.php
new file mode 100644
index 0000000..870f737
--- /dev/null
+++ b/database/migrations/0000_00_00_000000_create_access_log_table.php
@@ -0,0 +1,44 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+ /**
+ * Run the migrations.
+ */
+ public function up(): void
+ {
+ Schema::create(config('access_log.table_name'), function (Blueprint $table) {
+ $table->id();
+ $table->foreignId('user_id')->nullable();
+ $table->enum('method', [
+ 'GET',
+ 'HEAD',
+ 'POST',
+ 'PUT',
+ 'DELETE',
+ 'CONNECT',
+ 'OPTIONS',
+ 'PATCH',
+ 'PURGE',
+ 'TRACE',
+ ]);
+ $table->string('path');
+ $table->string('referer')->nullable();
+ $table->unsignedSmallInteger('status');
+ $table->jsonb('properties')->nullable();
+ $table->timestamp('created_at');
+ });
+ }
+
+ /**p
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists(config('access_log.table_name'));
+ }
+};
diff --git a/src/AccessLogServiceProvider.php b/src/AccessLogServiceProvider.php
index b6c56c4..aa4b647 100644
--- a/src/AccessLogServiceProvider.php
+++ b/src/AccessLogServiceProvider.php
@@ -6,5 +6,19 @@ use Illuminate\Support\ServiceProvider;
class AccessLogServiceProvider extends ServiceProvider
{
+ public function boot(): void
+ {
+ $ns = "laralight-access-log";
+ $dir = __DIR__;
+ $root = "{$dir}/..";
+ $this->publishesMigrations([
+ "{$root}/database/migrations" => database_path('migrations'),
+ ]);
+
+ $this->mergeConfigFrom("$root/config/access_log.php", 'access_log');
+ $this->publishes([
+ "{$root}/config/access_log.php" => config_path('access_log.php'),
+ ], "{$ns}:config");
+ }
}
diff --git a/src/Http/AccessLogMiddleware.php b/src/Http/AccessLogMiddleware.php
new file mode 100644
index 0000000..92f9810
--- /dev/null
+++ b/src/Http/AccessLogMiddleware.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Lightscale\AccessLog\Http;
+
+use Lightscale\AccessLog\Models\AccessLog;
+
+use Illuminate\Http\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+use Closure;
+
+class AccessLogMiddleware
+{
+ public function properties(Request $request, Response $response): ?iterable
+ {
+ return null;
+ }
+
+ public function shouldLog(): boolean
+ {
+ return config('access_log.enabled');
+ }
+
+ public function createLog(Request $request, Response $response): void
+ {
+ $model = config('access_log.model');
+ $log = new $model([
+ 'path' => $request->path(),
+ 'referer' => $request->referer(),
+ 'status' => $request->status(),
+ 'properties' => $this->properties($request, $response),
+ ]);
+ $log->user()->associate($request->user());
+ $log->save();
+ }
+
+ public function handle(Request $request, Closure $next): Response
+ {
+ $response = $next();
+ if ($this->shouldLog()) $this->createLog($request, $response);
+ return $response;
+ }
+}
diff --git a/src/Http/Models/AccessLog.php b/src/Http/Models/AccessLog.php
new file mode 100644
index 0000000..cdfef4b
--- /dev/null
+++ b/src/Http/Models/AccessLog.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Lightscale\LaralightAccessLog\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class AccessLog extends Model
+{
+ const UPDATED_AT = null;
+
+ protected array $guarded = [
+ 'user_id'
+ ];
+
+ public function __construct(array $attributes = [])
+ {
+ $this->setTable(config('access_log.table_name'));
+
+ parent::__construct($attributes);
+ }
+
+ protected function cast(): array
+ {
+ return [
+ 'properties' => 'collection',
+ ]
+ }
+
+ public function user(): BelongsTo
+ {
+ return $this->belongsTo(config('access_log.user_model'));
+ }
+}