80 lines
2.7 KiB
PHP
80 lines
2.7 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Services;
|
||
|
|
|
||
|
|
use Illuminate\Support\Facades\Log;
|
||
|
|
use Illuminate\Support\Facades\Process;
|
||
|
|
use Symfony\Component\Console\Exception\RuntimeException;
|
||
|
|
|
||
|
|
class ProcessUpdateService
|
||
|
|
{
|
||
|
|
public function processUpdate(int $entryId, string $action, string $type = 'entry_update_'): void
|
||
|
|
{
|
||
|
|
$subject = env('NATS_SUBJECT', 'entry_update');
|
||
|
|
$appUrl = env('APP_URL', 'http://localhost');
|
||
|
|
|
||
|
|
$incoming = [
|
||
|
|
'id' => $entryId,
|
||
|
|
'action' => $action,
|
||
|
|
'subject' => $subject,
|
||
|
|
'app_url' => $appUrl,
|
||
|
|
'type' => $type,
|
||
|
|
];
|
||
|
|
|
||
|
|
$jsonData = json_encode($incoming, JSON_THROW_ON_ERROR);
|
||
|
|
$tempFile = tempnam(sys_get_temp_dir(), $type);
|
||
|
|
file_put_contents($tempFile, $jsonData);
|
||
|
|
|
||
|
|
$scriptPath = env('HANDLE_ENTRY_UPDATES_SCRIPT', base_path('cmd/handle_cms_updates.sh'));
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Log what we're about to execute
|
||
|
|
Log::info("Executing script: {$scriptPath} with action: {$action}", [
|
||
|
|
'entry_id' => $entryId,
|
||
|
|
'temp_file' => $tempFile,
|
||
|
|
'script_exists' => file_exists($scriptPath),
|
||
|
|
'script_executable' => is_executable($scriptPath),
|
||
|
|
]);
|
||
|
|
|
||
|
|
$result = Process::run([
|
||
|
|
'bash',
|
||
|
|
$scriptPath,
|
||
|
|
$action,
|
||
|
|
$tempFile,
|
||
|
|
]);
|
||
|
|
|
||
|
|
if ($result->failed()) {
|
||
|
|
$errorDetails = [
|
||
|
|
'exit_code' => $result->exitCode(),
|
||
|
|
'stdout' => $result->output(),
|
||
|
|
'stderr' => $result->errorOutput(),
|
||
|
|
'command' => ['bash', $scriptPath, $action, $tempFile],
|
||
|
|
'script_path' => $scriptPath,
|
||
|
|
'script_exists' => file_exists($scriptPath),
|
||
|
|
'temp_file_exists' => file_exists($tempFile),
|
||
|
|
'temp_file_contents' => file_exists($tempFile) ? file_get_contents($tempFile) : 'N/A',
|
||
|
|
];
|
||
|
|
|
||
|
|
Log::error('Script execution failed', $errorDetails);
|
||
|
|
|
||
|
|
throw new RuntimeException(
|
||
|
|
"Script execution failed with exit code {$result->exitCode()}. " .
|
||
|
|
'STDOUT: ' . ($result->output() ?: 'empty') . ' ' .
|
||
|
|
'STDERR: ' . ($result->errorOutput() ?: 'empty')
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
Log::info('Script executed successfully', [
|
||
|
|
'stdout' => $result->output(),
|
||
|
|
'entry_id' => $entryId,
|
||
|
|
'action' => $action,
|
||
|
|
]);
|
||
|
|
} finally {
|
||
|
|
// Clean up temp file
|
||
|
|
if (file_exists($tempFile)) {
|
||
|
|
unlink($tempFile);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|