Viewing file: AuditLogController.php (4.72 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers;
use App\Models\AuditLog; use Illuminate\Http\Request;
class AuditLogController extends Controller { /** * Display a listing of the resource. */ public function index(Request $request) { $query = AuditLog::with(['user', 'campaign', 'hilltopAccount']) ->latest();
// Filter by user if ($request->has('user_id')) { $query->where('user_id', $request->user_id); }
// Filter by action if ($request->has('action')) { $query->where('action', 'like', '%' . $request->action . '%'); }
// Filter by entity type if ($request->has('entity_type')) { $query->where('entity_type', $request->entity_type); }
// Filter by status if ($request->has('status')) { $query->where('status', $request->status); }
// Filter by date range if ($request->has('start_date')) { $query->whereDate('created_at', '>=', $request->start_date); } if ($request->has('end_date')) { $query->whereDate('created_at', '<=', $request->end_date); }
// Search (general search) if ($request->has('search')) { $search = $request->search; $query->where(function ($q) use ($search) { $q->where('action', 'like', "%{$search}%") ->orWhere('details', 'like', "%{$search}%") ->orWhereHas('user', function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }); }); }
$logs = $query->paginate($request->per_page ?? 15);
return response()->json($logs); } /** * Export audit logs as CSV. */ public function export(Request $request) { $query = AuditLog::with(['user', 'campaign', 'hilltopAccount']) ->latest();
// Filter by user if ($request->has('user_id')) { $query->where('user_id', $request->user_id); }
// Filter by action if ($request->has('action')) { $query->where('action', 'like', '%' . $request->action . '%'); }
// Filter by entity type if ($request->has('entity_type')) { $query->where('entity_type', $request->entity_type); }
// Filter by status if ($request->has('status')) { $query->where('status', $request->status); }
// Filter by date range if ($request->has('start_date')) { $query->whereDate('created_at', '>=', $request->start_date); } if ($request->has('end_date')) { $query->whereDate('created_at', '<=', $request->end_date); }
// Search (general search) if ($request->has('search')) { $search = $request->search; $query->where(function ($q) use ($search) { $q->where('action', 'like', "%{$search}%") ->orWhere('details', 'like', "%{$search}%") ->orWhereHas('user', function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }); }); }
$filename = 'audit-logs-' . date('Y-m-d-H-i-s') . '.csv';
$headers = [ "Content-type" => "text/csv", "Content-Disposition" => "attachment; filename=$filename", "Pragma" => "no-cache", "Cache-Control" => "must-revalidate, post-check=0, pre-check=0", "Expires" => "0" ];
$callback = function() use ($query) { $file = fopen('php://output', 'w'); // Header row fputcsv($file, ['ID', 'Timestamp', 'User', 'Action', 'Entity Type', 'Entity ID', 'Status', 'Details']);
$query->chunk(100, function($logs) use ($file) { foreach ($logs as $log) { $userName = $log->user ? $log->user->name . ' (' . $log->user->email . ')' : 'System'; fputcsv($file, [ $log->id, $log->created_at, $userName, $log->action, $log->entity_type, $log->entity_id, $log->status, json_encode($log->details) ]); } });
fclose($file); };
return response()->stream($callback, 200, $headers); } }
|