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