mirror of
https://github.com/HDInnovations/UNIT3D-Community-Edition.git
synced 2026-04-22 01:38:49 -05:00
Merge pull request #2942 from Roardom/add-bon-store-transaction
(Fix) Wrap bon store purchases within a transaction
This commit is contained in:
@@ -23,6 +23,7 @@ use App\Models\User;
|
||||
use App\Services\Unit3dAnnounce;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
/**
|
||||
* @see \Tests\Feature\Http\Controllers\BonusControllerTest
|
||||
@@ -59,51 +60,70 @@ class TransactionController extends Controller
|
||||
abort_unless($request->user()->is($user), 403);
|
||||
|
||||
$request = (object) $request->validated();
|
||||
$bonExchange = BonExchange::findOrFail($request->exchange);
|
||||
|
||||
switch (true) {
|
||||
case $bonExchange->upload:
|
||||
$user->increment('uploaded', $bonExchange->value);
|
||||
return DB::transaction(function () use ($request, $user) {
|
||||
$user->refresh();
|
||||
$bonExchange = BonExchange::findOrFail($request->exchange);
|
||||
|
||||
break;
|
||||
case $bonExchange->download:
|
||||
$user->decrement('downloaded', $bonExchange->value);
|
||||
if ($bonExchange->cost > $user->seedbonus) {
|
||||
return back()->withErrors('Not enough BON.');
|
||||
}
|
||||
|
||||
break;
|
||||
case $bonExchange->personal_freeleech:
|
||||
PersonalFreeleech::create(['user_id' => $user->id]);
|
||||
switch (true) {
|
||||
case $bonExchange->upload:
|
||||
$user->increment('uploaded', $bonExchange->value);
|
||||
|
||||
cache()->put('personal_freeleech:'.$user->id, true);
|
||||
break;
|
||||
case $bonExchange->download:
|
||||
if ($user->downloaded < $bonExchange->value) {
|
||||
return back()->withErrors('Not enough download.');
|
||||
}
|
||||
|
||||
Unit3dAnnounce::addPersonalFreeleech($user->id);
|
||||
$user->decrement('downloaded', $bonExchange->value);
|
||||
|
||||
PrivateMessage::create([
|
||||
'sender_id' => 1,
|
||||
'receiver_id' => $user->id,
|
||||
'subject' => trans('bon.pm-subject'),
|
||||
'message' => sprintf(trans('bon.pm-message'), Carbon::now()->addDays(1)->toDayDateTimeString()).config('app.timezone').'[/b]!
|
||||
break;
|
||||
case $bonExchange->personal_freeleech:
|
||||
if (cache()->get('personal_freeleech:'.$user->id)) {
|
||||
return back()->withErrors('Your previous personal freeleech is still active.');
|
||||
}
|
||||
|
||||
PersonalFreeleech::create(['user_id' => $user->id]);
|
||||
|
||||
cache()->put('personal_freeleech:'.$user->id, true);
|
||||
|
||||
Unit3dAnnounce::addPersonalFreeleech($user->id);
|
||||
|
||||
PrivateMessage::create([
|
||||
'sender_id' => 1,
|
||||
'receiver_id' => $user->id,
|
||||
'subject' => trans('bon.pm-subject'),
|
||||
'message' => sprintf(trans('bon.pm-message'), Carbon::now()->addDays(1)->toDayDateTimeString()).config('app.timezone').'[/b]!
|
||||
[color=red][b]'.trans('common.system-message').'[/b][/color]',
|
||||
]);
|
||||
]);
|
||||
|
||||
break;
|
||||
case $bonExchange->invite:
|
||||
$user->increment('invites', $bonExchange->value);
|
||||
break;
|
||||
case $bonExchange->invite:
|
||||
if ($user->invites >= config('other.max_unused_user_invites', 1)) {
|
||||
return back()->withErrors('You already have the maximum amount of unused invites allowed per user.');
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
$user->increment('invites', $bonExchange->value);
|
||||
|
||||
BonTransactions::create([
|
||||
'bon_exchange_id' => $bonExchange->id,
|
||||
'name' => $bonExchange->description,
|
||||
'cost' => $bonExchange->value,
|
||||
'sender_id' => $user->id,
|
||||
'comment' => $bonExchange->description,
|
||||
'torrent_id' => null,
|
||||
]);
|
||||
break;
|
||||
}
|
||||
|
||||
$user->decrement('seedbonus', $bonExchange->cost);
|
||||
BonTransactions::create([
|
||||
'bon_exchange_id' => $bonExchange->id,
|
||||
'name' => $bonExchange->description,
|
||||
'cost' => $bonExchange->value,
|
||||
'sender_id' => $user->id,
|
||||
'comment' => $bonExchange->description,
|
||||
'torrent_id' => null,
|
||||
]);
|
||||
|
||||
return to_route('users.transactions.create', ['user' => $user])
|
||||
->withSuccess(trans('bon.success'));
|
||||
$user->decrement('seedbonus', $bonExchange->cost);
|
||||
|
||||
return back()->withSuccess(trans('bon.success'));
|
||||
}, 5);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Models\BonExchange;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
@@ -37,32 +36,8 @@ class StoreTransactionRequest extends FormRequest
|
||||
{
|
||||
return [
|
||||
'exchange' => [
|
||||
'bail',
|
||||
'required',
|
||||
'exists:bon_exchange,id',
|
||||
function ($attribute, $value, $fail) use ($request): void {
|
||||
$user = $request->user();
|
||||
$item = BonExchange::findOrFail($value);
|
||||
|
||||
switch (true) {
|
||||
case $item->cost > $user->seedbonus:
|
||||
$fail('Not enough BON.');
|
||||
|
||||
break;
|
||||
case $item->download && $user->downloaded < $item->value:
|
||||
$fail('Not enough download.');
|
||||
|
||||
break;
|
||||
case $item->personal_freeleech && cache()->get('personal_freeleech:'.$user->id):
|
||||
$fail('Your previous personal freeleech is still active.');
|
||||
|
||||
break;
|
||||
case $item->invite && $user->invites >= config('other.max_unused_user_invites', 1):
|
||||
$fail('You already have the maximum amount of unused invites allowed per user.');
|
||||
|
||||
break;
|
||||
}
|
||||
},
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user