View file app/Controllers/Admin/SmileController.php

File size: 6.7Kb
<?php

namespace App\Controllers\Admin;

use App\Classes\Validator;
use App\Models\Smile;
use App\Models\User;
use Illuminate\Database\Capsule\Manager as DB;
use Intervention\Image\ImageManagerStatic as Image;
use Illuminate\Http\Request;

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

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

    /**
     * Главная страница
     *
     * @return string
     */
    public function index(): string
    {
        $total = Smile::query()->count();
        $page = paginate(setting('smilelist'), $total);

        $smiles = Smile::query()
            ->orderBy(DB::connection()->raw('CHAR_LENGTH(`code`)'))
            ->orderBy('name')
            ->limit($page->limit)
            ->offset($page->offset)
            ->get();

        return view('admin/smiles/index', compact('smiles', 'page'));
    }

    /**
     * Добавление смайла
     *
     * @param Request   $request
     * @param Validator $validator
     * @return string
     */
    public function create(Request $request, Validator $validator): string
    {
        if (! is_writable(UPLOADS.'/smiles')){
            abort('default', 'Директория со смайлами недоступна для записи!');
        }

        if ($request->isMethod('post')) {
            $token = check($request->input('token'));
            $code  = check(utfLower($request->input('code')));
            $smile = $request->file('smile');

            $validator->equal($token, $_SESSION['token'], 'Неверный идентификатор сессии, повторите действие!')
                ->length($code, 2, 20, ['code' => 'Слишком длинный или короткий код смайла!'])
                ->regex($code, '|^:+[a-яa-z0-9_\-/\(\)]+$|i', ['code' => 'Код смайла должен начинаться с двоеточия. Разрешены буквы, цифры и дефис!']);

            $duplicate = Smile::query()->where('code', $code)->first();
            $validator->empty($duplicate, ['code' => 'Смайл с данным кодом уже имеется в списке!']);

            $rules = [
                'maxsize'   => setting('smilemaxsize'),
                'maxweight' => setting('smilemaxweight'),
                'minweight' => setting('smileminweight'),
            ];

            $validator->file($smile, $rules, ['smile' => 'Не удалось загрузить изображение!']);

            if ($validator->isValid()) {

                $newName = uniqueName($smile->getClientOriginalExtension());
                $path    = (new Smile())->uploadPath . '/' . $newName;
                Image::make($smile)->save($path);

                Smile::query()->create([
                    'name' => str_replace(HOME, '', $path),
                    'code' => $code,
                ]);

                clearCache();

                setFlash('success', 'Смайл успешно загружен!');
                redirect('/admin/smiles');
            } else {
                setInput($request->all());
                setFlash('danger', $validator->getErrors());
            }
        }

        return view('admin/smiles/create');
    }

    /**
     * Редактирование смайла
     *
     * @param int       $id
     * @param Request   $request
     * @param Validator $validator
     * @return string
     */
    public function edit(int $id, Request $request, Validator $validator): string
    {
        /** @var Smile $smile */
        $smile = Smile::query()->find($id);
        $page = int($request->input('page', 1));

        if (! $smile) {
            abort(404, 'Данного смайла не существует!');
        }

        if ($request->isMethod('post')) {

            $token = check($request->input('token'));
            $code  = check(utfLower($request->input('code')));

            $validator->equal($token, $_SESSION['token'], 'Неверный идентификатор сессии, повторите действие!')
                ->length($code, 2, 20, ['code' => 'Слишком длинный или короткий код смайла!'])
                ->regex($code, '|^:+[a-яa-z0-9_\-/\(\)]+$|i', ['code' => 'Код смайла должен начинаться с двоеточия. Разрешены буквы, цифры и дефис!']);

            $duplicate = Smile::query()->where('code', $code)->where('id', '<>', $smile->id)->first();
            $validator->empty($duplicate, ['code' => 'Смайл с данным кодом уже имеется в списке!']);

            if ($validator->isValid()) {

                $smile->update([
                    'code' => $code,
                ]);

                clearCache();

                setFlash('success', 'Смайл успешно отредактирован!');
                redirect('/admin/smiles?page=' . $page);
            } else {
                setInput($request->all());
                setFlash('danger', $validator->getErrors());
            }
        }

        return view('admin/smiles/edit', compact('smile', 'page'));
    }

    /**
     * Удаление смайлов
     *
     * @param Request   $request
     * @param Validator $validator
     * @return void
     */
    public function delete(Request $request, Validator $validator): void
    {
        if (! is_writable(UPLOADS . '/smiles')){
            abort('default', 'Директория со смайлами недоступна для записи!');
        }

        $page  = int($request->input('page', 1));
        $token = check($request->input('token'));
        $del   = intar($request->input('del'));

        $validator->equal($token, $_SESSION['token'], 'Неверный идентификатор сессии, повторите действие!')
            ->true($del, 'Отсутствуют выбранные смайлы для удаления!');

        if ($validator->isValid()) {

            $smiles = Smile::query()
                ->whereIn('id', $del)
                ->get();

            if ($smiles->isNotEmpty()) {
                foreach ($smiles as $smile) {
                    deleteFile(HOME . $smile->name);
                    $smile->delete();
                }
            }

            clearCache();

            setFlash('success', 'Выбранные смайлы успешно удалены!');
        } else {
            setFlash('danger', $validator->getErrors());
        }

        redirect('/admin/smiles?page=' . $page);
    }
}