nhance/app/Libraries/JobStatusService.php
2026-05-18 12:28:19 +05:30

160 lines
4.6 KiB
PHP

<?php
namespace App\Libraries;
use App\Models\JobModel;
class JobStatusService
{
protected JobModel $jobModel;
public function __construct(?JobModel $jobModel = null)
{
$this->jobModel = $jobModel ?? new JobModel();
}
public function getJobStatusByName(string $jobName): array
{
$jobName = trim($jobName);
if ($jobName === '') {
return $this->buildResponse(false, $jobName, 'Job name is required.');
}
try {
$job = $this->jobModel
->where('name', $jobName)
->orderBy('id', 'DESC')
->first();
if (!$job) {
return $this->buildResponse(false, $jobName, 'No job record found for given name.');
}
return $this->formatJobResponse($job, 'Job status fetched successfully.');
} catch (\Throwable $e) {
log_message('error', 'JobStatusService failed for job "{job}": {message}', [
'job' => $jobName,
'message' => $e->getMessage(),
]);
return $this->buildResponse(false, $jobName, 'Unable to fetch job status right now.');
}
}
public function getJobStatusById(int $jobId): array
{
if ($jobId <= 0) {
return $this->buildResponse(false, '', 'Valid job id is required.');
}
try {
$job = $this->jobModel
->where('id', $jobId)
->first();
if (!$job) {
return $this->buildResponse(false, '', 'No job record found for given id.');
}
return $this->formatJobResponse($job, 'Job status fetched successfully.');
} catch (\Throwable $e) {
log_message('error', 'JobStatusService failed for job id "{id}": {message}', [
'id' => $jobId,
'message' => $e->getMessage(),
]);
return $this->buildResponse(false, '', 'Unable to fetch job status right now.');
}
}
public function getJobStatusByUuid(string $uuid): array
{
$uuid = trim($uuid);
if ($uuid === '') {
return $this->buildResponse(false, '', 'Job uuid is required.');
}
try {
$job = $this->jobModel
->where('uuid', $uuid)
->first();
if (!$job) {
return $this->buildResponse(false, '', 'No job record found for given uuid.');
}
return $this->formatJobResponse($job, 'Job status fetched successfully.');
} catch (\Throwable $e) {
log_message('error', 'JobStatusService failed for job uuid "{uuid}": {message}', [
'uuid' => $uuid,
'message' => $e->getMessage(),
]);
return $this->buildResponse(false, '', 'Unable to fetch job status right now.');
}
}
protected function formatJobResponse(array $job, string $message): array
{
return [
'success' => true,
'job_name' => $job['name'] ?? '',
'status' => $job['status'] ?? null,
'response' => $this->normalizeResponse($job['response'] ?? null),
'job_id' => isset($job['id']) ? (int) $job['id'] : null,
'uuid' => $job['uuid'] ?? null,
'run_time' => $this->normalizeRunTime($job['run_time'] ?? null),
'message' => $message,
];
}
protected function normalizeResponse($rawResponse)
{
// dd($rawResponse);
if ($rawResponse === null) {
return null;
}
if (is_string($rawResponse)) {
$trimmed = trim($rawResponse);
if ($trimmed === '') {
return null;
}
$decoded = json_decode($trimmed, true);
if (json_last_error() === JSON_ERROR_NONE) {
return $decoded;
}
return $rawResponse;
}
return $rawResponse;
}
protected function normalizeRunTime($runTime)
{
if ($runTime === null || $runTime === '') {
return null;
}
return is_numeric($runTime) ? (float) $runTime : null;
}
protected function buildResponse(bool $success, string $jobName, string $message): array
{
return [
'success' => $success,
'job_name' => $jobName,
'status' => null,
'response' => null,
'job_id' => null,
'uuid' => null,
'run_time' => null,
'message' => $message,
];
}
}