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

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

namespace App\Controllers\Admin;

use App\Classes\Validator;
use App\Models\Invite;
use App\Models\User;
use Illuminate\Http\Request;

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

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

    /**
     * Главная страница
     *
     * @param Request $request
     * @return string
     */
    public function index(Request $request): string
    {
        $used = $request->input('used') ? 1 : 0;

        $total = Invite::query()->where('used', $used)->count();
        $page = paginate(setting('listinvite'), $total);

        $invites = Invite::query()
            ->where('used', $used)
            ->orderBy('created_at', 'desc')
            ->limit($page->limit)
            ->offset($page->offset)
            ->with('user', 'inviteUser')
            ->get();

        return view('admin/invitations/index', compact('invites', 'page', 'used'));
    }

    /**
     * Список ключей
     *
     * @return string
     */
    public function keys(): string
    {
        $keys = Invite::query()
            ->where('user_id', getUser('id'))
            ->where('used', 0)
            ->orderBy('created_at', 'desc')
            ->get();

        return view('admin/invitations/keys', compact('keys'));
    }

    /**
     * Создание ключей
     *
     * @param Request   $request
     * @param Validator $validator
     * @return string
     * @throws \Exception
     */
    public function create(Request $request, Validator $validator): string
    {
        if ($request->isMethod('post')) {
            $token  = check($request->input('token'));
            $keys   = int($request->input('keys'));

            $validator->equal($token, $_SESSION['token'], 'Неверный идентификатор сессии, повторите действие!')
                ->notEmpty($keys, ['keys' => 'Не указано число ключей!']);

            if ($validator->isValid()) {

                $newKeys = [];

                for ($i = 0; $i < $keys; $i++) {
                    $newKeys[] = [
                        'hash'       => str_random(random_int(12, 15)),
                        'user_id'    => getUser('id'),
                        'created_at' => SITETIME,
                    ];
                }

                Invite::query()->insert($newKeys);

                setFlash('success', 'Ключи успешно созданы!');
                redirect('/admin/invitations');
            } else {
                setInput($request->all());
                setFlash('danger', $validator->getErrors());
            }
        }

        $listKeys = [1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50];

        return view('admin/invitations/create', compact('listKeys'));
    }

    /**
     * Отправка ключей пользователю
     *
     * @param Request   $request
     * @param Validator $validator
     * @return void
     * @throws \Exception
     */
    public function send(Request $request, Validator $validator): void
    {
        $token    = check($request->input('token'));
        $login    = check($request->input('user'));
        $userkeys = int($request->input('userkeys'));

        /* @var User $user */
        $user = getUserByLogin($login);

        $validator->equal($token, $_SESSION['token'], 'Неверный идентификатор сессии, повторите действие!')
            ->notEmpty($user, ['user' => 'Пользователя с данным логином не существует!'])
            ->notEmpty($userkeys, ['userkeys' => 'Не указано число ключей!']);

        if ($validator->isValid()) {

            $newKeys  = [];
            $listKeys = [];

            for ($i = 0; $i < $userkeys; $i++) {

                $key = str_random(random_int(12, 15));

                $listKeys[] = $key;

                $newKeys[] = [
                    'hash'       => $key,
                    'user_id'    => $user->id,
                    'created_at' => SITETIME,
                ];
            }

            Invite::query()->insert($newKeys);

            $text = 'Вы получили пригласительные ключи в количестве ' . \count($listKeys) . 'шт.'.PHP_EOL.'Список ключей: '.implode(', ', $listKeys).PHP_EOL.'С помощью этих ключей вы можете пригласить ваших друзей на наш сайт!';
            $user->sendMessage(null, $text);

            setFlash('success', 'Ключи успешно отправлены!');
            redirect('/admin/invitations');
        } else {
            setInput($request->all());
            setFlash('danger', $validator->getErrors());
            redirect('/admin/invitations/create');
        }
    }

    /**
     * Отправка ключей активным пользователям
     *
     * @param Request   $request
     * @param Validator $validator
     * @return void
     * @throws \Exception
     */
    public function mail(Request $request, Validator $validator): void
    {
        $token = check($request->input('token'));

        $validator->equal($token, $_SESSION['token'], 'Неверный идентификатор сессии, повторите действие!')
            ->true(isAdmin(User::BOSS), 'Рассылать ключи может только владелец');

        $users = User::query()->where('updated_at', '>', strtotime('-1 week', SITETIME))->get();

        $users = $users->filter(function ($value, $key) {
            return $value->id !== getUser('id');
        });

        $validator->false($users->isEmpty(), 'Отсутствуют получатели ключей!');

        if ($validator->isValid()) {

            /** @var User $user */
            foreach ($users as $user) {
                $key = str_random(random_int(12, 15));

                Invite::query()->create([
                    'hash'       => $key,
                    'user_id'    => $user->id,
                    'created_at' => SITETIME,
                ]);

                $text = 'Поздравляем! Вы получили пригласительный ключ' . PHP_EOL . 'Ваш ключ: ' . $key . PHP_EOL.'С помощью этого ключа вы можете пригласить вашего друга на наш сайт!';
                $user->sendMessage(null, $text);
            }

            setFlash('success', 'Ключи успешно отправлены! ('. $users->count() .')');
            redirect('/admin/invitations');
        } else {
            setInput($request->all());
            setFlash('danger', $validator->getErrors());
            redirect('/admin/invitations/create');
        }
    }

    /**
     * Удаление ключей
     *
     * @param Request   $request
     * @param Validator $validator
     * @return void
     */
    public function delete(Request $request, Validator $validator): void
    {
        $page  = int($request->input('page', 1));
        $token = check($request->input('token'));
        $del   = intar($request->input('del'));
        $used  = $request->input('used') ? 1 : 0;

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

        if ($validator->isValid()) {
            Invite::query()->whereIn('id', $del)->delete();

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

        redirect('/admin/invitations?used=' . $used . '&page=' . $page);
    }
}