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/be.naniguide.com/app/Http/Controllers/Refactor/FunnelProductController.php
<?php

namespace App\Http\Controllers\Refactor;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Model\Funnel;
use App\Model\FunnelProduct;
use Validator;

class FunnelProductController extends Controller
{
    public function index(Request $request)
    {
        $customer = $request->user()->customer;
        $total = FunnelProduct::ofCustomer($customer)->count();
        $active = FunnelProduct::ofCustomer($customer)->active()->count();

        return view('refactor.pages.funnel_products.index', [
            'total' => $total,
            'active' => $active,
        ]);
    }

    public function listing(Request $request)
    {
        $query = FunnelProduct::ofCustomer($request->user()->customer)
            ->search($request->keyword);

        if ($request->status) {
            $query->where('status', $request->status);
        }

        $products = $query
            ->orderBy($request->sort_order ?? 'created_at', $request->sort_direction ?? 'desc')
            ->paginate($request->per_page ?? 25);

        // JSON format for product picker (e.g. funnel edit page)
        if ($request->format === 'json') {
            return response()->json([
                'products' => $products->map(function ($p) {
                    return ['uid' => $p->uid, 'name' => $p->name, 'price' => number_format($p->price, 2), 'currency' => $p->currency];
                }),
            ]);
        }

        return view('refactor.pages.funnel_products._list', [
            'products' => $products,
        ]);
    }

    public function create(Request $request)
    {
        return view('refactor.pages.funnel_products.create');
    }

    public function store(Request $request)
    {
        $customer = $request->user()->customer;

        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
            'price' => 'required|numeric|min:0',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status' => 'error',
                'errors' => $validator->errors()->toArray(),
            ], 422);
        }

        $product = new FunnelProduct();
        $product->customer_id = $customer->id;
        $product->name = $request->name;
        $product->description = $request->description;
        $product->price = $request->price;
        $product->compare_at_price = $request->compare_at_price;
        $product->currency = $request->currency ?? 'USD';
        $product->sku = $request->sku;
        $product->is_digital = (bool) $request->is_digital;
        $product->save();

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/funnels.flash.product_created'),
        ]);
    }

    public function edit(Request $request, $uid)
    {
        $product = FunnelProduct::ofCustomer($request->user()->customer)->where('uid', $uid)->first();

        if (!$product) {
            return $this->notAuthorized();
        }

        return view('refactor.pages.funnel_products.edit', [
            'product' => $product,
        ]);
    }

    public function update(Request $request, $uid)
    {
        $product = FunnelProduct::ofCustomer($request->user()->customer)->where('uid', $uid)->first();

        if (!$product) {
            return response()->json(['status' => 'error', 'message' => 'Not found'], 404);
        }

        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
            'price' => 'required|numeric|min:0',
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status' => 'error',
                'errors' => $validator->errors()->toArray(),
            ], 422);
        }

        $product->name = $request->name;
        $product->description = $request->description;
        $product->price = $request->price;
        $product->compare_at_price = $request->compare_at_price;
        $product->currency = $request->currency ?? $product->currency;
        $product->sku = $request->sku;
        $product->is_digital = (bool) $request->is_digital;
        $product->status = $request->status ?? $product->status;
        $product->save();

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/funnels.flash.product_updated'),
        ]);
    }

    public function duplicate(Request $request, $uid)
    {
        $product = FunnelProduct::ofCustomer($request->user()->customer)->where('uid', $uid)->first();

        if (!$product) {
            return response()->json(['status' => 'error', 'message' => 'Not found'], 404);
        }

        $copy = $product->replicate(['uid']);
        $copy->name = $product->name . ' (Copy)';
        $copy->save();

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/funnels.flash.product_duplicated'),
        ]);
    }

    public function delete(Request $request)
    {
        $uids = $request->uids;
        if (is_string($uids)) {
            $uids = [$uids];
        }

        $customer = $request->user()->customer;

        foreach ($uids as $uid) {
            $product = FunnelProduct::ofCustomer($customer)->where('uid', $uid)->first();
            if ($product) {
                $product->delete();
            }
        }

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/funnels.flash.product_deleted'),
        ]);
    }

    public function associate(Request $request, $funnelUid)
    {
        $funnel = Funnel::ofCustomer($request->user()->customer)
            ->notTemplate()
            ->where('uid', $funnelUid)->first();

        if (!$funnel) {
            return response()->json(['status' => 'error', 'message' => 'Not found'], 404);
        }

        $product = FunnelProduct::ofCustomer($request->user()->customer)
            ->where('uid', $request->product_uid)->first();

        if (!$product) {
            return response()->json(['status' => 'error', 'message' => 'Product not found'], 404);
        }

        // Check if already associated
        if (!$funnel->products()->where('funnel_products.id', $product->id)->exists()) {
            $funnel->products()->attach($product->id, [
                'sort_order' => $funnel->products()->count(),
            ]);
        }

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/funnels.flash.product_associated'),
        ]);
    }

    public function dissociate(Request $request, $funnelUid, $productUid)
    {
        $funnel = Funnel::ofCustomer($request->user()->customer)
            ->notTemplate()
            ->where('uid', $funnelUid)->first();

        if (!$funnel) {
            return response()->json(['status' => 'error', 'message' => 'Not found'], 404);
        }

        $product = FunnelProduct::ofCustomer($request->user()->customer)
            ->where('uid', $productUid)->first();

        if ($product) {
            $funnel->products()->detach($product->id);
        }

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/funnels.flash.product_dissociated'),
        ]);
    }

    public function funnelProducts(Request $request, $funnelUid)
    {
        $funnel = Funnel::ofCustomer($request->user()->customer)
            ->notTemplate()
            ->where('uid', $funnelUid)->first();

        if (!$funnel) {
            return response()->json(['status' => 'error', 'message' => 'Not found'], 404);
        }

        return view('refactor.pages.funnels._products', [
            'funnel' => $funnel,
            'products' => $funnel->products,
        ]);
    }
}