File: /home/xedaptot/be.naniguide.com/app/Http/Controllers/Refactor/CustomerPaymentGatewayController.php
<?php
namespace App\Http\Controllers\Refactor;
use App\Http\Controllers\Controller;
use App\Library\Facades\Billing;
use App\Model\PaymentGateway;
use Illuminate\Http\Request;
class CustomerPaymentGatewayController extends Controller
{
public function index(Request $request)
{
$customer = $request->user()->customer;
$query = PaymentGateway::ofCustomer($customer);
$stats = [
'total' => (clone $query)->count(),
'active' => (clone $query)->where('status', PaymentGateway::STATUS_ACTIVE)->count(),
'inactive' => (clone $query)->where('status', PaymentGateway::STATUS_INACTIVE)->count(),
];
return view('refactor.pages.payment-gateways.index', compact('stats'));
}
public function listing(Request $request)
{
$customer = $request->user()->customer;
$query = PaymentGateway::ofCustomer($customer);
if ($request->keyword) {
$keyword = '%' . strtolower(trim($request->keyword)) . '%';
$query->where(function ($q) use ($keyword) {
$q->whereRaw('LOWER(name) LIKE ?', [$keyword])
->orWhereRaw('LOWER(description) LIKE ?', [$keyword]);
});
}
if ($request->type && $request->type !== 'all') {
$query->where('type', $request->type);
}
if ($request->status && $request->status !== 'all') {
$query->where('status', $request->status);
}
$sortBy = $request->sort_by ?? 'payment_gateways.created_at';
$sortDir = $request->sort_direction ?? 'desc';
$query->orderBy($sortBy, $sortDir);
$items = $query->paginate($request->per_page ?? 15);
return view('refactor.pages.payment-gateways._list', compact('items'));
}
public function selectType(Request $request)
{
$gatewayServices = Billing::getGateways();
return view('refactor.pages.payment-gateways.select-type', compact('gatewayServices'));
}
public function create(Request $request, $type)
{
$paymentGateway = PaymentGateway::newDefault($type);
$gatewayServices = Billing::getGateways();
$gatewayService = $gatewayServices[$type] ?? null;
if (!$gatewayService) {
abort(404);
}
return view('refactor.pages.payment-gateways.create', compact('paymentGateway', 'gatewayService'));
}
public function store(Request $request, $type)
{
$customer = $request->user()->customer;
$paymentGateway = PaymentGateway::newDefault($type);
$paymentGateway->customer_id = $customer->id;
$validator = $paymentGateway->savePaymentGateway(
$request->name,
$request->description,
$request->gateway_data ?? []
);
if ($validator->fails()) {
$gatewayServices = Billing::getGateways();
$gatewayService = $gatewayServices[$type];
return response()->view('refactor.pages.payment-gateways.create', [
'paymentGateway' => $paymentGateway,
'gatewayService' => $gatewayService,
'errors' => $validator->errors(),
], 400);
}
$request->session()->flash('alert-success', trans('refactor/payment_gateways.flash.created'));
return redirect()->route('refactor.payment_gateways.index');
}
public function edit(Request $request, $uid)
{
$paymentGateway = $this->findOwnedOrFail($request, $uid);
$gatewayServices = Billing::getGateways();
$gatewayService = $gatewayServices[$paymentGateway->type] ?? null;
return view('refactor.pages.payment-gateways.edit', compact('paymentGateway', 'gatewayService'));
}
public function update(Request $request, $uid)
{
$paymentGateway = $this->findOwnedOrFail($request, $uid);
$validator = $paymentGateway->savePaymentGateway(
$request->name,
$request->description,
$request->gateway_data ?? []
);
if ($validator->fails()) {
$gatewayServices = Billing::getGateways();
$gatewayService = $gatewayServices[$paymentGateway->type];
return response()->view('refactor.pages.payment-gateways.edit', [
'paymentGateway' => $paymentGateway,
'gatewayService' => $gatewayService,
'errors' => $validator->errors(),
], 400);
}
$request->session()->flash('alert-success', trans('refactor/payment_gateways.flash.updated'));
return redirect()->route('refactor.payment_gateways.index');
}
public function enable(Request $request)
{
$customer = $request->user()->customer;
$uids = is_array($request->uids) ? $request->uids : explode(',', $request->uids);
foreach (PaymentGateway::ofCustomer($customer)->whereIn('uid', $uids)->get() as $item) {
$item->enable();
}
echo trans('refactor/payment_gateways.flash.enabled');
}
public function disable(Request $request)
{
$customer = $request->user()->customer;
$uids = is_array($request->uids) ? $request->uids : explode(',', $request->uids);
foreach (PaymentGateway::ofCustomer($customer)->whereIn('uid', $uids)->get() as $item) {
$item->disable();
}
echo trans('refactor/payment_gateways.flash.disabled');
}
public function delete(Request $request)
{
$customer = $request->user()->customer;
$uids = is_array($request->uids) ? $request->uids : explode(',', $request->uids);
foreach (PaymentGateway::ofCustomer($customer)->whereIn('uid', $uids)->get() as $item) {
$item->delete();
}
echo trans('refactor/payment_gateways.flash.deleted');
}
public function testConnection(Request $request, $uid)
{
$paymentGateway = $this->findOwnedOrFail($request, $uid);
try {
$service = Billing::resolveService($paymentGateway);
if (method_exists($service, 'isActive') && $service->isActive()) {
return response()->json([
'status' => 'success',
'message' => trans('refactor/payment_gateways.test_connection.success'),
]);
}
return response()->json([
'status' => 'error',
'message' => trans('refactor/payment_gateways.test_connection.not_active'),
], 400);
} catch (\Throwable $e) {
return response()->json([
'status' => 'error',
'message' => trans('refactor/payment_gateways.test_connection.failed', ['error' => $e->getMessage()]),
], 400);
}
}
protected function findOwnedOrFail(Request $request, string $uid): PaymentGateway
{
$customer = $request->user()->customer;
$paymentGateway = PaymentGateway::ofCustomer($customer)->where('uid', $uid)->first();
if (!$paymentGateway) {
abort(404);
}
return $paymentGateway;
}
}