HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/ai.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;
    }
}