Files
radicall/app/Http/Controllers/Client/WalletController.php
T

104 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers\Client;
use App\Enums\PaymentPurposeEnum;
use App\Http\Controllers\Controller;
use App\Http\Requests\Client\BankCardStoreRequest;
use App\Http\Requests\Client\WalletDepositRequest;
use App\Http\Requests\Client\WithdrawRequestStoreRequest;
use App\Http\Resources\Client\BankCardResource;
use App\Http\Resources\Client\PaymentResource;
use App\Http\Resources\Client\WalletTransactionResource;
use App\Http\Resources\Client\WithdrawRequestResource;
use App\Models\BankCard;
use App\Services\Payment\ZibalPaymentService;
use App\Services\Wallet\WalletService;
use App\Services\Wallet\WithdrawRequestService;
use Illuminate\Support\Facades\Auth;
use Inertia\Inertia;
class WalletController extends Controller
{
protected WalletService $walletService;
protected ZibalPaymentService $zibalPaymentService;
protected WithdrawRequestService $withdrawRequestService;
public function __construct(WalletService $walletService, ZibalPaymentService $zibalPaymentService, WithdrawRequestService $withdrawRequestService)
{
$this->walletService = $walletService;
$this->zibalPaymentService = $zibalPaymentService;
$this->withdrawRequestService = $withdrawRequestService;
}
public function index()
{
$wallet = $this->walletService->forUser(Auth::user());
$transactions = $wallet->transactions()
->with('invoice')
->latest()
->paginate(10)
->withQueryString()
->onEachSide(1);
$withdrawRequests = Auth::user()->withdrawRequests()
->with('bankCard')
->latest()
->take(10)
->get();
return Inertia::client('Dashboard/Wallet/Index', [
'transactions' => WalletTransactionResource::collection($transactions),
'withdrawRequests' => WithdrawRequestResource::collection($withdrawRequests)->resolve(),
'bankCards' => BankCardResource::collection(Auth::user()->bankCards()->latest()->get())->resolve(),
]);
}
public function deposit(WalletDepositRequest $request)
{
$payment = $this->zibalPaymentService->request(
Auth::user(),
$request->validated('amount'),
'wallet-' . Auth::id() . '-' . now()->timestamp,
['purpose' => PaymentPurposeEnum::WalletTopUp->value]
);
return response()->json([
'payment' => new PaymentResource($payment),
'url' => $this->zibalPaymentService->paymentUrl($payment),
]);
}
public function storeWithdrawRequest(WithdrawRequestStoreRequest $request)
{
$bankCard = BankCard::findOrFail($request->validated('bank_card_id'));
$this->withdrawRequestService->request(Auth::user(), $request->validated('amount'), $bankCard);
session()->flash('success', 'درخواست برداشت شما ثبت شد و در انتظار بررسی است.');
return redirect()->route('dashboard.wallet.index');
}
public function storeBankCard(BankCardStoreRequest $request)
{
Auth::user()->bankCards()->create($request->validated());
session()->flash('success', 'کارت بانکی با موفقیت ثبت شد.');
return redirect()->route('dashboard.wallet.index');
}
public function destroyBankCard(BankCard $bankCard)
{
abort_unless($bankCard->user_id === Auth::id(), 403);
$bankCard->delete();
return redirect()->route('dashboard.wallet.index');
}
}