<?php
namespace App\Jobs;
use App\Library\Tool;
use App\Models\Campaigns;
use App\Models\ImportJobHistory;
use Illuminate\Bus\Batch;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Bus;
use Throwable;
class ScheduleBatchJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $collection;
protected $campaign_id;
protected $user_id;
protected $db_fields;
protected $campaign_fields;
/**
* Create a new job instance.
*
* @param $user_id
* @param $campaign_id
* @param $collection
* @param $db_fields
* @param $campaign_fields
*/
public function __construct($user_id, $campaign_id, $collection, $db_fields, $campaign_fields)
{
$this->user_id = $user_id;
$this->campaign_id = $campaign_id;
$this->collection = $collection;
$this->db_fields = $db_fields;
$this->campaign_fields = $campaign_fields;
}
/**
* Execute the job.
*
* @return void
* @throws Throwable
*/
public function handle()
{
$campaign = Campaigns::find($this->campaign_id);
$db_fields = $this->db_fields;
$user_id = $this->user_id;
$campaign_fields = $this->campaign_fields;
$batch_list = [];
Tool::resetMaxExecutionTime();
$this->collection->chunk(5000)
->each(function ($lines) use ($campaign, &$batch_list, $db_fields, $user_id, $campaign_fields) {
$batch_list[] = new ImportCampaign($user_id, $campaign->id, $lines, $db_fields, $campaign_fields);
});
$import_name = 'ImportCampaign_'.date('Ymdhms');
$import_job = ImportJobHistory::create([
'name' => $import_name,
'import_id' => $campaign->uid,
'type' => 'import_campaign',
'status' => 'processing',
'options' => json_encode(['status' => 'processing', 'message' => 'Import campaign are running']),
'batch_id' => null,
]);
$batch = Bus::batch($batch_list)
->then(function (Batch $batch) use ($campaign, $import_name, $import_job) {
$campaign->processing();
$campaign->update([
'batch_id' => $batch->id,
]);
$import_job->update(['batch_id' => $batch->id]);
})
->catch(function (Batch $batch, Throwable $e) {
$import_history = ImportJobHistory::where('batch_id', $batch->id)->first();
if ($import_history) {
$import_history->status = 'failed';
$import_history->options = json_encode(['status' => 'failed', 'message' => $e->getMessage()]);
$import_history->save();
}
})
->finally(function (Batch $batch) use ($campaign) {
$import_history = ImportJobHistory::where('batch_id', $batch->id)->first();
if ($import_history) {
$import_history->status = 'finished';
$import_history->options = json_encode(['status' => 'finished', 'message' => 'Import campaign was successfully imported.']);
$import_history->save();
Campaigns::find($campaign->id)->delivered();
}
//send event notification remaining
})
->name($import_name)
->allowFailures(false)
->dispatch();
$campaign->update(['batch_id' => $batch->id]);
}
}