Repo for the search and displace core module including the interface to select files and search and displace operations to run on them. https://searchanddisplace.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

161 lines
4.7 KiB

<?php
namespace App\SearchDisplace\Ingest;
use App\Events\IngestDocumentReceived;
use App\Events\SDAppliedOnOriginalDocument;
use App\SearchDisplace\SearchAndDisplaceOriginalDocument;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
class HandleReceivedDocument
{
protected $id;
protected $content;
protected $fileResultType;
protected $documentFormat;
protected $status;
public function __construct($payload)
{
$this->id = $payload['data']['id'];
$this->content = $payload['data']['content'];
$this->fileResultType = $payload['data']['file_result_type'];
$this->status = $payload['data']['status'];
if (isset($payload['data']['document_format'])) {
$this->documentFormat = $payload['data']['document_format'];
}
}
/**
* @throws \Exception|\GuzzleHttp\Exception\GuzzleException
*/
public function handle()
{
if ($this->fileResultType === 'md') {
$this->handleDocumentMD();
return;
}
if ($this->fileResultType === 'document-recreated') {
$this->downloadDocumentFromIngest();
return;
}
$this->handleDocumentJson();
}
protected function handleDocumentMD()
{
$storage = Storage::disk('local');
$fileName = 'document';
// The .md extension signals the success status, the lack of signals the fail status.
if ($this->status === 'success') {
$fileName = $fileName . '.md';
}
$dir = "contracts/$this->id";
try {
$storage->makeDirectory($dir);
$storage->put("$dir/$fileName", $this->content['document']);
foreach ($this->content['images'] as $image) {
$name = $image['name'];
$type = $image['type'];
$contents = $image['contents'];
$contents = str_replace('data:image/' . $type . ';base64,', '', $contents);
$storage->put("$dir/$name.$type", base64_decode($contents));
}
// Emit event so other sections of the app can work on it.
IngestDocumentReceived::dispatch($this->id);
} catch (\Exception $exception) {
\Illuminate\Support\Facades\Log::info('Exception: ' . $exception->getTraceAsString());
}
}
/**
* @throws \Exception|\GuzzleHttp\Exception\GuzzleException
*/
protected function downloadDocumentFromIngest()
{
$storage = Storage::disk('local');
if ($this->status === 'fail') {
$storage->deleteDirectory("contracts/$this->id");
return;
}
if ( ! $this->documentFormat) {
throw new \Exception('No document format specified.');
}
$filePath = "document.$this->documentFormat";
$storeDocumentAtPath = $storage->path('contracts/' . $this->id . '-' . $filePath);
try {
// Change the path where to store the document if the operation was run from CLI.
$storeAtPathFromJsonFile = (new SearchAndDisplaceOriginalDocument())->getStoreAtPathFromJsonFile($this->id);
if ($storeAtPathFromJsonFile) {
$storeDocumentAtPath = $storeAtPathFromJsonFile .
'/' .
$this->id .
'-displaced.' .
$this->documentFormat;
}
} catch (\Exception $exception) {
\Illuminate\Support\Facades\Log::info('Exception thrown when tried reading the storeDocumentAtPath from JSON file.');
}
$client = new Client();
$url = env('SD_INGEST_URL') . '/recreate-document/' . $this->id . '?file_path=' . $filePath;
try {
$client->request('GET', $url, [
'sink' => $storeDocumentAtPath,
]);
} catch (ClientException $clientException) {
$error = json_decode($clientException->getResponse()->getBody()->getContents(), true);
throw new \Exception($error['message']);
} finally {
$storage->deleteDirectory("contracts/$this->id");
}
SDAppliedOnOriginalDocument::dispatch($this->id);
}
/**
* @throws \Exception|\GuzzleHttp\Exception\GuzzleException
*/
protected function handleDocumentJson()
{
$handler = new SearchAndDisplaceOriginalDocument();
if ($this->status !== 'success') {
$handler->onIngestFail($this->id);
return;
}
if ( ! $this->documentFormat) {
throw new \Exception('No document format specified.');
}
$handler->applySD($this->id, $this->content, $this->documentFormat);
}
}