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.
 
 
 
 
 
 

117 lines
3.3 KiB

<?php
namespace App\Http\Controllers;
use App\SearchDisplace\Ingest\SendDocument;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\UploadedFile;
use GuzzleHttp\Exception\BadResponseException;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
class FileController extends Controller
{
/**
*
* @return JsonResponse
*/
public function create(): JsonResponse
{
request()->validate([
'file' => [
'required',
'file',
'max:10000',
'mimes:doc,dot,docx,dotx,docm,dotm,odt,rtf,pdf,txt',
],
]);
try {
/** @var UploadedFile $file */
$file = request()->file('file');
$time = time();
$fileId = $time . '_' . pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$sendDocument = new SendDocument();
$sendDocument->execute($fileId, [
'path' => $file->getRealPath(),
'type' => $file->getMimeType(),
'name' => $file->getClientOriginalName()
]);
return response()->json([
'id' => $fileId,
'file_name' => $file->getClientOriginalName(),
]);
} catch (BadResponseException $e) {
return response()->json([
'message' => $e->getMessage(),
'response' => $e->getResponse()
], 400);
} catch (\Exception $e) {
return response()->json([
'message' => $e->getMessage(),
], 400);
}
}
/**
*
*/
public function convert(): JsonResponse
{
$mdFileContent = request()->input('content');
$fileId = request()->input('file_id');
Storage::disk('local')->put('tmp/' . $fileId . '.md', $mdFileContent);
$tmpFilePath = Storage::path('tmp/' . $fileId);
$process = new Process(['pandoc', '-f', 'markdown_strict', $tmpFilePath . '.md', '-t', 'html']);
$process->run();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
$output = str_replace('./contracts-images', config('app.url') . '/contracts-images', $process->getOutput());
Storage::disk('local')->put('tmp/' . $fileId . '.html', $output);
$process = new Process([ 'pandoc', '-f', 'html', $tmpFilePath . '.html', '-t', 'odt', '-o', $tmpFilePath . '.odt']);
$process->run();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
return response()->json([
'path' => 'tmp/' . $fileId . '.odt'
]);
}
/**
*
* @param string $path
* @return mixed
*/
public function download(string $path)
{
return Storage::download($path);
}
/**
* Delete a file currently in progress
*
* @param string $id
* @return JsonResponse
*/
public function delete(string $id): JsonResponse
{
$success = Storage::delete([
"tmp/{$id}.md",
"tmp/{$id}.odt",
"tmp/{$id}.html",
"contracts/{$id}.md",
]);
return response()->json(['success' => $success]);
}
}