File: /home/xedaptot/ai.naniguide.com/app/Jobs/PopulateAbTestAssignments.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Model\AbTest;
/**
* Assign eligible subscribers to A/B test variants.
*
* Safe to re-run: skips already-assigned subscribers, so calling this again
* after new subscribers are added will assign only the newcomers while
* preserving the existing split ratio.
*
* The split algorithm is injected via AssignmentStrategy — swap to
* HashSplitStrategy for approximate (CRC32-based) assignment if needed.
*/
class PopulateAbTestAssignments implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $timeout = 600;
public $tries = 1;
public function __construct(protected int $abTestId) {}
public function handle(): void
{
$abTest = AbTest::with('variants', 'campaign')->findOrFail($this->abTestId);
$campaign = $abTest->campaign;
$listIds = $campaign->listsSegments->pluck('mail_list_id')->unique()->toArray();
if (empty($listIds)) {
return;
}
$abTest->resolveStrategy()->assign($abTest, $listIds, $campaign->id);
}
}