Uploaded From CV. Swandhana Server
This commit is contained in:
@@ -0,0 +1,312 @@
|
||||
<?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 <[email protected]>
|
||||
*/
|
||||
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);
|
||||
$this->showRoute = config('log-viewer.route.show', $this->showRoute);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
| 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Arcanedev\LogViewer\Http\Routes;
|
||||
|
||||
use Arcanedev\LogViewer\Http\Controllers\LogViewerController;
|
||||
use Arcanedev\Support\Routing\RouteRegistrar;
|
||||
|
||||
/**
|
||||
* Class LogViewerRoute
|
||||
*
|
||||
* @author ARCANEDEV <[email protected]>
|
||||
*/
|
||||
class LogViewerRoute extends RouteRegistrar
|
||||
{
|
||||
/* -----------------------------------------------------------------
|
||||
| Main Methods
|
||||
| -----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Map all routes.
|
||||
*/
|
||||
public function map(): void
|
||||
{
|
||||
$attributes = (array) config('log-viewer.route.attributes');
|
||||
|
||||
$this->group($attributes, function() {
|
||||
$this->name('log-viewer::')->group(function () {
|
||||
$this->get('/', [LogViewerController::class, 'index'])
|
||||
->name('dashboard'); // log-viewer::dashboard
|
||||
|
||||
$this->mapLogsRoutes();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Map the logs routes.
|
||||
*/
|
||||
private function mapLogsRoutes(): void
|
||||
{
|
||||
$this->prefix('logs')->name('logs.')->group(function() {
|
||||
$this->get('/', [LogViewerController::class, 'listLogs'])
|
||||
->name('list'); // log-viewer::logs.list
|
||||
|
||||
$this->delete('delete', [LogViewerController::class, 'delete'])
|
||||
->name('delete'); // log-viewer::logs.delete
|
||||
|
||||
$this->prefix('{date}')->group(function() {
|
||||
$this->get('/', [LogViewerController::class, 'show'])
|
||||
->name('show'); // log-viewer::logs.show
|
||||
|
||||
$this->get('download', [LogViewerController::class, 'download'])
|
||||
->name('download'); // log-viewer::logs.download
|
||||
|
||||
$this->get('{level}', [LogViewerController::class, 'showByLevel'])
|
||||
->name('filter'); // log-viewer::logs.filter
|
||||
|
||||
$this->get('{level}/search', [LogViewerController::class, 'search'])
|
||||
->name('search'); // log-viewer::logs.search
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user