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,
]);
}
}