move into sonardesk

This commit is contained in:
Mark Gregory
2026-10-12 14:50:13 +01:00
parent 5f0d2ceb72
commit 38b4a7406f
879 changed files with 24021 additions and 1 deletions
+6
View File
@@ -0,0 +1,6 @@
<?php
return [
'name' => 'Audit',
'enabled' => true,
];
@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('audit_logs', function (Blueprint $table): void {
$table->id();
$table->nullableMorphs('actor');
$table->string('event')->index();
$table->nullableMorphs('auditable');
$table->json('old_values')->nullable();
$table->json('new_values')->nullable();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->timestamp('created_at')->useCurrent();
});
}
public function down(): void
{
Schema::dropIfExists('audit_logs');
}
};
@@ -0,0 +1,14 @@
<?php
namespace Modules\Audit\Http\Controllers;
use App\Http\Controllers\Controller;
use Modules\Audit\Models\AuditLog;
final class AuditController extends Controller
{
public function index()
{
return view('audit::index', ['logs' => AuditLog::query()->latest('created_at')->paginate(50)]);
}
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace Modules\Audit\Models;
use Illuminate\Database\Eloquent\Model;
final class AuditLog extends Model
{
public $timestamps = false;
protected $guarded = [];
protected function casts(): array
{
return ['old_values' => 'array', 'new_values' => 'array', 'created_at' => 'datetime'];
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace Modules\Audit\Providers;
use Illuminate\Support\ServiceProvider;
use Modules\Audit\Support\ModuleInfo;
final class AuditServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->register(RouteServiceProvider::class);
$this->mergeConfigFrom(module_path(ModuleInfo::name(), 'Config/config.php'), ModuleInfo::nameLower());
}
public function boot(): void
{
$this->loadMigrationsFrom(module_path(ModuleInfo::name(), 'Database/Migrations'));
$this->loadViewsFrom(module_path(ModuleInfo::name(), 'Resources/views'), ModuleInfo::nameLower());
}
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace Modules\Audit\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
final class RouteServiceProvider extends ServiceProvider
{
public function boot(): void
{
parent::boot();
$this->routes(function (): void {
Route::middleware('web')->group(module_path('Audit', 'Routes/web.php'));
});
}
}
+1
View File
@@ -0,0 +1 @@
<x-layouts.app :title="__('Audit log')"><div class="space-y-6"><div><h1 class="text-2xl font-semibold">Audit log</h1><p class="mt-1 text-sm text-zinc-500">Recorded platform activity.</p></div><div class="overflow-hidden rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900"><table class="min-w-full divide-y divide-zinc-200 text-sm dark:divide-zinc-700"><thead><tr><th class="px-4 py-3 text-left">Event</th><th class="px-4 py-3 text-left">Actor</th><th class="px-4 py-3 text-left">IP</th><th class="px-4 py-3 text-left">Date</th></tr></thead><tbody class="divide-y divide-zinc-200 dark:divide-zinc-800">@forelse($logs as $log)<tr><td class="px-4 py-3 font-medium">{{ $log->event }}</td><td class="px-4 py-3">{{ $log->actor_type ? class_basename($log->actor_type).' #'.$log->actor_id : 'System' }}</td><td class="px-4 py-3">{{ $log->ip_address ?: '—' }}</td><td class="px-4 py-3">{{ optional($log->created_at)->format('d M Y H:i') }}</td></tr>@empty<tr><td colspan="4" class="px-4 py-10 text-center text-zinc-500">No audit events recorded.</td></tr>@endforelse</tbody></table></div>{{ $logs->links() }}</div></x-layouts.app>
+6
View File
@@ -0,0 +1,6 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\Audit\Http\Controllers\AuditController;
Route::middleware(['auth', 'verified'])->get('administration/audit', [AuditController::class, 'index'])->name('administration.audit.index');
+16
View File
@@ -0,0 +1,16 @@
<?php
namespace Modules\Audit\Support;
final class ModuleInfo
{
public static function name(): string
{
return 'Audit';
}
public static function nameLower(): string
{
return 'audit';
}
}
+5
View File
@@ -0,0 +1,5 @@
<?php
it('boots the Audit module', function (): void {
expect(config('audit.name'))->toBe('Audit');
});
+10
View File
@@ -0,0 +1,10 @@
{
"name": "absdev/audit-module",
"description": "Audit foundation module for the ABSDEV Laravel application platform.",
"type": "laravel-module",
"autoload": {
"psr-4": {
"Modules\\Audit\\": ""
}
}
}
+20
View File
@@ -0,0 +1,20 @@
{
"name": "Audit",
"alias": "audit",
"version": "1.0.0",
"description": "Audit foundation module for the ABSDEV Laravel application platform.",
"keywords": [
"laravel",
"modules",
"audit"
],
"priority": 10,
"providers": [
"Modules\\Audit\\Providers\\AuditServiceProvider"
],
"aliases": {},
"files": [],
"requires": [
"Core"
]
}