![]() Server : Apache/2.4.62 (Unix) OpenSSL/1.0.2k-fips System : Linux server1.richineiserver.com 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 User : fdshops ( 1003) PHP Version : 8.2.21 Disable Function : NONE Directory : /home/fdshops/public_html/vendor/arcanedev/log-viewer/src/Http/Controllers/ |
<?php declare(strict_types=1); namespace Arcanedev\LogViewer\Http\Controllers; use Arcanedev\LogViewer\Contracts\LogViewer as LogViewerContract; use Arcanedev\LogViewer\Entities\{LogEntry, LogEntryCollection}; use Arcanedev\LogViewer\Exceptions\LogNotFoundException; use Arcanedev\LogViewer\Tables\StatsTable; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Routing\Controller; use Illuminate\Support\{Arr, Collection, Str}; /** * Class LogViewerController * * @author ARCANEDEV <arcanedev.maroc@gmail.com> */ class LogViewerController extends Controller { /* ----------------------------------------------------------------- | Properties | ----------------------------------------------------------------- */ /** * The log viewer instance * * @var \Arcanedev\LogViewer\Contracts\LogViewer */ protected $logViewer; /** @var int */ protected $perPage = 30; /** @var string */ protected $showRoute = 'log-viewer::logs.show'; /* ----------------------------------------------------------------- | Constructor | ----------------------------------------------------------------- */ /** * LogViewerController constructor. * * @param \Arcanedev\LogViewer\Contracts\LogViewer $logViewer */ public function __construct(LogViewerContract $logViewer) { $this->logViewer = $logViewer; $this->perPage = config('log-viewer.per-page', $this->perPage); } /* ----------------------------------------------------------------- | Main Methods | ----------------------------------------------------------------- */ /** * Show the dashboard. * * @return \Illuminate\View\View */ public function index() { $stats = $this->logViewer->statsTable(); $chartData = $this->prepareChartData($stats); $percents = $this->calcPercentages($stats->footer(), $stats->header()); return $this->view('dashboard', compact('chartData', 'percents')); } /** * List all logs. * * @param \Illuminate\Http\Request $request * * @return \Illuminate\View\View */ public function listLogs(Request $request) { $stats = $this->logViewer->statsTable(); $headers = $stats->header(); $rows = $this->paginate($stats->rows(), $request); return $this->view('logs', compact('headers', 'rows')); } /** * Show the log. * * @param \Illuminate\Http\Request $request * @param string $date * * @return \Illuminate\View\View */ public function show(Request $request, $date) { $level = 'all'; $log = $this->getLogOrFail($date); $query = $request->get('query'); $levels = $this->logViewer->levelsNames(); $entries = $log->entries($level)->paginate($this->perPage); return $this->view('show', compact('level', 'log', 'query', 'levels', 'entries')); } /** * Filter the log entries by level. * * @param \Illuminate\Http\Request $request * @param string $date * @param string $level * * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse */ public function showByLevel(Request $request, $date, $level) { if ($level === 'all') return redirect()->route($this->showRoute, [$date]); $log = $this->getLogOrFail($date); $query = $request->get('query'); $levels = $this->logViewer->levelsNames(); $entries = $this->logViewer->entries($date, $level)->paginate($this->perPage); return $this->view('show', compact('level', 'log', 'query', 'levels', 'entries')); } /** * Show the log with the search query. * * @param \Illuminate\Http\Request $request * @param string $date * @param string $level * * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse */ public function search(Request $request, $date, $level = 'all') { $query = $request->get('query'); if (is_null($query)) return redirect()->route($this->showRoute, [$date]); $log = $this->getLogOrFail($date); $levels = $this->logViewer->levelsNames(); $needles = array_map(function ($needle) { return Str::lower($needle); }, array_filter(explode(' ', $query))); $entries = $log->entries($level) ->unless(empty($needles), function (LogEntryCollection $entries) use ($needles) { return $entries->filter(function (LogEntry $entry) use ($needles) { foreach ([$entry->header, $entry->stack, $entry->context()] as $subject) { if (Str::containsAll(Str::lower($subject), $needles)) return true; } return false; }); }) ->paginate($this->perPage); return $this->view('show', compact('level', 'log', 'query', 'levels', 'entries')); } /** * Download the log * * @param string $date * * @return \Symfony\Component\HttpFoundation\BinaryFileResponse */ public function download($date) { return $this->logViewer->download($date); } /** * Delete a log. * * @param \Illuminate\Http\Request $request * * @return \Illuminate\Http\JsonResponse */ public function delete(Request $request) { abort_unless($request->ajax(), 405, 'Method Not Allowed'); $date = $request->input('date'); return response()->json([ 'result' => $this->logViewer->delete($date) ? 'success' : 'error' ]); } /* ----------------------------------------------------------------- | Other Methods | ----------------------------------------------------------------- */ /** * Get the evaluated view contents for the given view. * * @param string $view * @param array $data * @param array $mergeData * * @return \Illuminate\View\View */ protected function view($view, $data = [], $mergeData = []) { $theme = config('log-viewer.theme'); return view()->make("log-viewer::{$theme}.{$view}", $data, $mergeData); } /** * Paginate logs. * * @param array $data * @param \Illuminate\Http\Request $request * * @return \Illuminate\Pagination\LengthAwarePaginator */ protected function paginate(array $data, Request $request) { $data = new Collection($data); $page = $request->get('page', 1); $path = $request->url(); return new LengthAwarePaginator( $data->forPage($page, $this->perPage), $data->count(), $this->perPage, $page, compact('path') ); } /** * Get a log or fail * * @param string $date * * @return \Arcanedev\LogViewer\Entities\Log|null */ protected function getLogOrFail($date) { $log = null; try { $log = $this->logViewer->get($date); } catch (LogNotFoundException $e) { abort(404, $e->getMessage()); } return $log; } /** * Prepare chart data. * * @param \Arcanedev\LogViewer\Tables\StatsTable $stats * * @return string */ protected function prepareChartData(StatsTable $stats) { $totals = $stats->totals()->all(); return json_encode([ 'labels' => Arr::pluck($totals, 'label'), 'datasets' => [ [ 'data' => Arr::pluck($totals, 'value'), 'backgroundColor' => Arr::pluck($totals, 'color'), 'hoverBackgroundColor' => Arr::pluck($totals, 'highlight'), ], ], ]); } /** * Calculate the percentage. * * @param array $total * @param array $names * * @return array */ protected function calcPercentages(array $total, array $names) { $percents = []; $all = Arr::get($total, 'all'); foreach ($total as $level => $count) { $percents[$level] = [ 'name' => $names[$level], 'count' => $count, 'percent' => $all ? round(($count / $all) * 100, 2) : 0, ]; } return $percents; } }