1
0

Basic attachments management

This commit is contained in:
Richard Dern 2024-04-17 15:29:12 +02:00
parent b115d165c3
commit 2100fec73f
3 changed files with 153 additions and 1 deletions

View File

@ -0,0 +1,108 @@
<?php
namespace App\Classes;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Str;
class AttachmentsManager
{
/**
* Original metadata content
*/
private array $originalContent = [];
/**
* Current metadata content
*/
private array $content = [];
public function __construct(protected string $root, protected FilesystemAdapter $disk)
{
}
/**
* Add a file to a named history and return attachment's reference
*/
public function addToHistory(string $name, array $data): string
{
$reference = $this->add($data);
$this->content['history'][$name][] = [
'reference' => $reference,
'date' => now(),
];
return $reference;
}
/**
* Add a single file to the bundle
*/
public function add(array $data): string
{
$reference = $this->generateNewReference();
$filename = $data['filename'];
$contents = $data['contents'];
unset($data['contents']);
$fullPath = sprintf('%s/%s', $this->root, $filename);
$relativePath = Str::remove(dirname($this->root), $fullPath);
$data['filename'] = $relativePath;
$this->disk->put($fullPath, $contents);
$this->content['files'][$reference] = $data;
return $reference;
}
/**
* Return a boolean value indicating if the file actually exists on disk
*/
public function exists()
{
return $this->disk->exists($this->root . '.json');
}
/**
* Return a boolean indicating if the file has changed since it was loaded
*/
public function isDirty(): bool
{
$original = collect($this->originalContent);
$current = collect($this->content);
return !$original->diffAssoc($current)->isEmpty() || !$current->diffAssoc($original)->isEmpty();
}
/**
* Store file on disk
*/
public function save(): bool
{
if (!$this->isDirty()) {
return false;
}
$json = json_encode($this->content, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$this->disk->put($this->root . '.json', $json);
$this->originalContent = $this->content;
return true;
}
/**
* Generate new, random reference for a file
*/
private function generateNewReference(): string
{
return Str::random(6);
}
}

View File

@ -2,6 +2,7 @@
namespace App\Classes;
use App\Classes\Traits\ManagesAttachments;
use App\Classes\Traits\ManagesMarkdown;
use App\Classes\Traits\ManagesMetadata;
use Illuminate\Filesystem\FilesystemAdapter;
@ -9,7 +10,7 @@
class Bundle
{
use ManagesMarkdown, ManagesMetadata;
use ManagesAttachments, ManagesMarkdown, ManagesMetadata;
public function __construct(protected string $path, protected FilesystemAdapter $disk)
{
@ -21,6 +22,7 @@ public function __construct(protected string $path, protected FilesystemAdapter
*/
public function save()
{
$this->saveAttachments();
$this->saveMetadata();
$this->saveMarkdown();
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Classes\Traits;
use App\Classes\AttachmentsManager;
trait ManagesAttachments
{
private array $attachmentsManagers = [];
/**
* Register an attachments manager for specified filename
*/
private function registerAttachmentsManager(string $root): AttachmentsManager
{
$root = $this->getFilenameInBundle($root);
if (!array_key_exists($root, $this->attachmentsManagers)) {
$this->attachmentsManagers[$root] = new AttachmentsManager($root, $this->disk);
}
return $this->attachmentsManagers[$root];
}
/**
* Save all attachments files that needs to be
*/
private function saveAttachments()
{
foreach ($this->attachmentsManagers as $manager) {
$manager->save();
}
}
/**
* Return an instance of attachments manager for specified filename
*/
public function attachments(string $root): AttachmentsManager
{
return $this->registerAttachmentsManager($root);
}
}