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/AdAudienceController.php
<?php

namespace App\Http\Controllers\Refactor\Ads;

use App\Http\Controllers\Controller;
use App\Http\Requests\Refactor\Ads\StoreAdAudienceRequest;
use App\Model\AdAudience;
use App\Model\AdPlatform;
use App\Services\Ads\AdAudienceService;
use Illuminate\Http\Request;

class AdAudienceController extends Controller
{
    protected AdAudienceService $service;

    public function __construct(AdAudienceService $service)
    {
        $this->service = $service;
    }

    /**
     * Audience listing page.
     */
    public function index(Request $request)
    {
        $customer = $request->user()->customer;

        $counts = [
            'total' => $customer->local()->adAudiences()->count(),
            'custom' => $customer->local()->adAudiences()->ofType(AdAudience::TYPE_CUSTOM)->count(),
            'lookalike' => $customer->local()->adAudiences()->ofType(AdAudience::TYPE_LOOKALIKE)->count(),
            'synced' => $customer->local()->adAudiences()->synced()->count(),
        ];

        return view('refactor.pages.ads.audiences.index', [
            'counts' => $counts,
        ]);
    }

    /**
     * AJAX listing partial.
     */
    public function listing(Request $request)
    {
        $customer = $request->user()->customer;

        $audiences = $customer->local()->adAudiences()
            ->search($request->keyword)
            ->ofType($request->type)
            ->ofPlatform($request->platform)
            ->orderBy('created_at', 'desc')
            ->paginate($request->per_page ?? 15);

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

    /**
     * Create audience form.
     */
    public function create(Request $request)
    {
        $customer = $request->user()->customer;

        return view('refactor.pages.ads.audiences.create', [
            'mailLists' => $customer->local()->mailLists()->orderBy('name')->get(),
            'platforms' => $customer->local()->adPlatforms()->active()->get(),
        ]);
    }

    /**
     * Store new audience.
     */
    public function store(StoreAdAudienceRequest $request)
    {
        $customer = $request->user()->customer;

        // Plan quota gate — canAccept() encapsulates the 4-state limit semantic.
        $quotas = app(\App\Services\Plans\Quotas\QuotasService::class);
        $qKey   = \App\Services\Plans\Quotas\QuotaKey::MAX_ADS_AUDIENCES;
        if (! $quotas->canAccept($customer, $qKey, 1)) {
            $errKey = $quotas->limit($customer, $qKey) === false
                ? 'refactor/ads_audiences.not_on_plan'
                : 'refactor/ads_audiences.quota_exceeded';
            return response()->json([
                'status'  => 'error',
                'message' => trans($errKey),
            ], 422);
        }

        $data = $request->validated();

        if ($data['type'] === AdAudience::TYPE_LOOKALIKE) {
            $audience = $this->service->createLookalike($customer->local(), $data);
        } else {
            $audience = $this->service->createFromList($customer->local(), $data);
        }

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/ads_audiences.audience_created'),
            'redirect' => route('refactor.ads.audiences.index'),
        ]);
    }

    /**
     * Sync audience to platform.
     */
    public function sync(Request $request, string $uid)
    {
        $customer = $request->user()->customer;
        $audience = $customer->local()->adAudiences()->where('uid', $uid)->firstOrFail();

        $this->service->syncToPlatform($audience);

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

    /**
     * Delete audiences (bulk).
     */
    public function delete(Request $request)
    {
        $customer = $request->user()->customer;
        $uids = is_array($request->uids) ? $request->uids : explode(',', $request->uids);

        $audiences = $customer->local()->adAudiences()->whereIn('uid', $uids)->get();

        foreach ($audiences as $audience) {
            $this->service->delete($audience);
        }

        return response()->json([
            'status' => 'success',
            'message' => trans('refactor/ads_audiences.audiences_deleted', ['count' => $audiences->count()]),
        ]);
    }
}