<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Classes\Validator;
use App\Models\Transfer;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Throwable;
class TransferController extends Controller
{
/**
* @var User
*/
public $user;
/**
* Конструктор
*/
public function __construct()
{
$this->middleware('check.user');
$this->middleware(function ($request, $next) {
$login = $request->input('user');
$this->user = getUserByLogin($login);
return $next($request);
});
}
/**
* Главная страница
*
* @return View
*/
public function index(): View
{
return view('transfers/index', ['user' => $this->user]);
}
/**
* Перевод денег
*
* @param Request $request
* @param Validator $validator
*
* @return RedirectResponse
* @throws Throwable
*/
public function send(Request $request, Validator $validator): RedirectResponse
{
$money = int($request->input('money'));
$msg = $request->input('msg');
$validator
->equal($request->input('_token'), csrf_token(), ['msg' => __('validator.token')])
->true($this->user, ['user' => __('validator.user')])
->length($msg, 0, setting('comment_length'), ['msg' => __('validator.comment_long')])
->gte(getUser('point'), setting('sendmoneypoint'), ['money' => __('transfers.transfer_point', ['point' => plural(setting('sendmoneypoint'), setting('scorename'))])])
->gt($money, 0, ['money' => __('transfers.transfer_wrong_amount')])
->lte($money, getUser('money'), ['money' => __('transfers.transfer_not_money')]);
if ($this->user) {
$validator
->notEqual($this->user->id, getUser('id'), ['user' => __('transfers.transfer_yourself')])
->false($this->user->isIgnore(getUser()), ['user' => __('ignores.you_are_ignoring')]);
}
if ($validator->isValid()) {
DB::transaction(function () use ($money, $msg) {
getUser()->decrement('money', $money);
$this->user->increment('money', $money);
$comment = $msg ?? __('ignores.not_specified');
$text = textNotice('transfer', ['login' => getUser('login'), 'money' => plural($money, setting('moneyname')), 'comment' => $comment]);
$this->user->sendMessage(null, $text);
// Запись логов
Transfer::query()->create([
'user_id' => getUser('id'),
'recipient_id' => $this->user->id,
'text' => $comment,
'total' => $money,
'created_at' => SITETIME
]);
});
setFlash('success', __('transfers.transfer_success_completed'));
} else {
setInput($request->all());
setFlash('danger', $validator->getErrors());
}
return redirect('transfers');
}
}