1
0

Better metadata and attachments management

Allows for dot notation, merging and deep-replacing
This commit is contained in:
Richard Dern 2024-04-18 11:41:29 +02:00
parent 26df25a5e7
commit 59ac3b9b93
2 changed files with 54 additions and 23 deletions

View File

@ -4,6 +4,7 @@
use App\Classes\Traits\ManagesMetadata;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class AttachmentsManager
@ -47,10 +48,14 @@ public function addToHistory(string $name, array $data): string
{
$reference = $this->add($data);
$this->manager['history'][$name][] = [
'reference' => $reference,
'date' => now(),
];
$this->manager->merge([
'history' => [
$name => [
'reference' => $reference,
'date' => now(),
],
],
]);
return $reference;
}
@ -63,15 +68,6 @@ public function manager(): MetadataManager
return $this->manager;
}
/**
* Add or replace attachment with specified reference. Will replace existing
* data
*/
public function upsert(string $reference, array $data)
{
$this->manager['files'][$reference] = $data;
}
/**
* Add a single file to the bundle
*/
@ -79,11 +75,22 @@ public function add(array $data): string
{
$reference = $this->generateNewReference();
$filename = $data['filename'];
$contents = $data['contents'];
if (!empty($data['contents'])) {
// Adding from an image resource of which $data['contents'] is a
// representation
$contents = $data['contents'];
unset($data['contents']);
unset($data['contents']);
} elseif (!empty($data['url'])) {
// Adding from a URL which implies downloading the resource
$contents = Http::throw()->get($data['url'])->body();
$data['filename'] = basename($data['url']);
unset($data['url']);
}
$filename = $this->getFormatedFilename($data['filename']);
$fullPath = sprintf('%s/%s', $this->targetForFiles, $filename);
$relativePath = sprintf('%s/%s/%s', $this->attachmentsDir, $this->kind, $filename);
@ -91,11 +98,20 @@ public function add(array $data): string
$this->disk->put($fullPath, $contents);
$this->manager['files'][$reference] = $data;
$this->manager->set(sprintf('files.%s', $reference), $data);
return $reference;
}
private function getFormatedFilename(string $path): string
{
$filename = pathinfo($path, PATHINFO_FILENAME);
$extension = pathinfo($path, PATHINFO_EXTENSION);
$slug = Str::slug($filename);
return sprintf('%s.%s', $slug, $extension);
}
/**
* Return a boolean value indicating if the file actually exists on disk
*/

View File

@ -100,17 +100,32 @@ protected function writeToDisk(array $data)
*/
public function set($key, $value)
{
$this->setMany(collect([$key => $value])->undot());
$content = $this->content->dot();
$newValue = collect([$key => $value])->dot();
$newContent = collect($content)->replaceRecursive($newValue)->undot();
$this->content = $newContent;
}
/**
* Sets multiple metadata at once.
* Set many values at once
*/
public function setMany($array)
public function setMany(array $array)
{
foreach ($array as $key => $value) {
$this->content->put($key, $value);
}
$content = $this->content->dot();
$newValue = collect($array)->dot();
$newContent = collect($content)->replaceRecursive($newValue)->undot();
$this->content = $newContent;
}
public function merge(array $array)
{
$content = $this->content->dot();
$newValue = collect($array)->dot();
$newContent = collect($content)->mergeRecursive($newValue)->undot();
$this->content = $newContent;
}
/**