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