diff options
| -rw-r--r-- | config/access_log.php | 11 | ||||
| -rw-r--r-- | database/migrations/0000_00_00_000000_create_access_log_table.php | 44 | ||||
| -rw-r--r-- | src/AccessLogServiceProvider.php | 14 | ||||
| -rw-r--r-- | src/Http/AccessLogMiddleware.php | 43 | ||||
| -rw-r--r-- | src/Http/Models/AccessLog.php | 33 | 
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')); +    } +} | 
