File: /home/xedaptot/be.naniguide.com/app/Http/Controllers/Refactor/Ads/AdAbTestController.php
<?php
namespace App\Http\Controllers\Refactor\Ads;
use App\Http\Controllers\Controller;
use App\Http\Requests\Refactor\Ads\StoreAdAbTestRequest;
use App\Model\AdAbTest;
use App\Model\AdAbVariant;
use App\Model\AdCampaign;
use App\Services\Ads\AdAbTestService;
use Illuminate\Http\Request;
class AdAbTestController extends Controller
{
protected AdAbTestService $service;
public function __construct(AdAbTestService $service)
{
$this->service = $service;
}
public function index(Request $request)
{
$customer = $request->user()->customer;
$customerId = $customer->local()->id;
$counts = [
'total' => AdAbTest::ofCustomer($customerId)->count(),
'running' => AdAbTest::ofCustomer($customerId)->where('status', AdAbTest::STATUS_RUNNING)->count(),
'completed' => AdAbTest::ofCustomer($customerId)->where('status', AdAbTest::STATUS_COMPLETED)->count(),
'draft' => AdAbTest::ofCustomer($customerId)->where('status', AdAbTest::STATUS_DRAFT)->count(),
];
return view('refactor.pages.ads.ab_tests.index', [
'counts' => $counts,
]);
}
public function listing(Request $request)
{
$customer = $request->user()->customer;
$customerId = $customer->local()->id;
$abTests = AdAbTest::ofCustomer($customerId)
->search($request->keyword)
->with(['campaign', 'variants', 'winner'])
->orderBy('created_at', 'desc')
->paginate($request->per_page ?? 15);
return view('refactor.pages.ads.ab_tests._list', [
'abTests' => $abTests,
]);
}
public function create(Request $request)
{
$customer = $request->user()->customer;
$campaigns = $customer->local()->adCampaigns()->orderBy('name')->get();
return view('refactor.pages.ads.ab_tests.create', [
'campaigns' => $campaigns,
]);
}
public function store(StoreAdAbTestRequest $request)
{
$customer = $request->user()->customer;
$campaign = $customer->local()->adCampaigns()->where('uid', $request->ad_campaign_uid)->firstOrFail();
$abTest = $this->service->create($campaign, $request->validated());
return response()->json([
'status' => 'success',
'message' => trans('refactor/ads_ab_tests.test_created'),
'redirect' => route('refactor.ads.ab_tests.index'),
]);
}
public function start(Request $request, string $uid)
{
$customer = $request->user()->customer;
$abTest = AdAbTest::ofCustomer($customer->local()->id)->where('uid', $uid)->firstOrFail();
$this->service->start($abTest);
return response()->json([
'status' => 'success',
'message' => trans('refactor/ads_ab_tests.test_started'),
]);
}
public function declareWinner(Request $request, string $uid, string $variantUid)
{
$customer = $request->user()->customer;
$abTest = AdAbTest::ofCustomer($customer->local()->id)->where('uid', $uid)->firstOrFail();
$winner = AdAbVariant::where('ad_ab_test_id', $abTest->id)->where('uid', $variantUid)->firstOrFail();
$this->service->declareWinner($abTest, $winner);
return response()->json([
'status' => 'success',
'message' => trans('refactor/ads_ab_tests.winner_declared', ['name' => $winner->name]),
]);
}
public function delete(Request $request)
{
$customer = $request->user()->customer;
$uids = is_array($request->uids) ? $request->uids : explode(',', $request->uids);
$abTests = AdAbTest::ofCustomer($customer->local()->id)->whereIn('uid', $uids)->get();
foreach ($abTests as $abTest) {
$this->service->delete($abTest);
}
return response()->json([
'status' => 'success',
'message' => trans('refactor/ads_ab_tests.tests_deleted', ['count' => $abTests->count()]),
]);
}
}