Files
lucent-laravel/src/Http/Controller/FileController.php
T
2023-10-17 18:30:41 +03:00

79 lines
2.1 KiB
PHP

<?php
namespace Lucent\Http\Controller;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Lucent\Channel\ChannelService;
use Lucent\File\FileUploadResult;
use Lucent\Query\Query;
use Lucent\Record\RecordService;
use function Lucent\File\loadDisk;
use function Lucent\File\uploadFile;
use function Lucent\Response\fail;
use function Lucent\Response\ok;
class FileController extends Controller
{
public function __construct(
private readonly ChannelService $channelService,
private readonly RecordService $recordService,
private readonly Query $query
)
{
}
public function download(Request $request)
{
$disk = loadDisk();
return $disk->download($request->input("path"));
}
public function upload(Request $request)
{
$validator = Validator::make($request->all(), [
'files.*' => 'required|file|max:100000',
]);
if ($validator->fails()) {
return fail($validator->errors()->first());
}
$schema = $this->channelService->channel->schemas->firstWhere("name", $request->input("schema"));
$files = $request->file('files');
$uploadResults = collect($files)->map(fn($file) => uploadFile($schema, $file))->toArray();
collect($uploadResults)
->filter(fn(FileUploadResult $res) => !$res->isDuplicate)
->values()
->map(function (FileUploadResult $uploadResult) use ($schema) {
return $this->recordService->create(
schemaName: $schema->name,
data: [],
file: (array)$uploadResult->recordFile,
edges: [],
status: "published",
uploadFromUrl: ""
);
})->toArray();
$graph = $this->query
->filter([
"schema" => $schema->name
])
->limit(15)
->skip(0)
->sort("-_sys.updatedAt")
->run();
return ok($graph->records->toArray());
}
}