Просмотр файла app/Controllers/Admin/CheckerController.php

Размер файла: 2.7Kb
<?php

namespace App\Controllers\Admin;

use App\Models\User;
use Illuminate\Http\Request;

class CheckerController extends AdminController
{
    /**
     * Конструктор
     */
    public function __construct()
    {
        parent::__construct();

        if (! isAdmin(User::BOSS)) {
            abort(403, 'Доступ запрещен!');
        }
    }

    /**
     * Главная страница
     *
     * @return string
     */
    public function index(): string
    {
        $files = $this->scanFiles('../');
        $files = str_replace('..//', '', $files);
        $diff  = [];

        if (file_exists(STORAGE . '/temp/checker.dat')) {
            $filesScan = json_decode(file_get_contents(STORAGE . '/temp/checker.dat'));

            $diff['left']  = array_diff($files, $filesScan);
            $diff['right'] = array_diff($filesScan, $files);
        }

        return view('admin/checkers/index', compact('diff'));
    }

    /**
     * Сканирование сайта
     *
     * @param Request $request
     * @return void
     */
    public function scan(Request $request): void
    {
        $token = check($request->input('token'));

        if ($token === $_SESSION['token']) {
            if (is_writable(STORAGE . '/temp')) {
                $files = $this->scanFiles('../');
                $files = str_replace('..//', '', $files);

                file_put_contents(STORAGE . '/temp/checker.dat', json_encode($files), LOCK_EX);

                setFlash('success', 'Сайт успешно отсканирован!');
            } else {
                setFlash('danger', 'Директория temp недоступна для записи!');
            }
        } else {
            setFlash('danger', 'Неверный идентификатор сессии, повторите действие!');
        }

        redirect('/admin/checkers');
    }

    /**
     * Сканирует директорию сайта
     *
     * @param string $dir
     * @return array
     */
    private function scanFiles($dir): array
    {
        static $state;

        $files = preg_grep('/^([^.])/', scandir($dir, SCANDIR_SORT_ASCENDING));

        foreach ($files as $file) {
            if (is_file($dir . '/' . $file)) {
                $ext = getExtension($file);

                if (! \in_array($ext, explode(',', setting('nocheck')), true)) {
                    $state[] = $dir . '/' . $file . ' / ' . dateFixed(filemtime($dir . '/' . $file), 'd.m.Y H:i') . ' / ' . formatFileSize($dir . '/' . $file);
                }
            } else {
                $state[] = $dir . '/' . $file;
                $this->scanFiles($dir . '/' . $file);
            }
        }

        return $state;
    }
}