mirror of
https://github.com/brufdev/many-notes.git
synced 2026-01-23 19:38:46 -06:00
49 lines
1.3 KiB
PHP
49 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Actions;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Vault;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
final readonly class CreateVault
|
|
{
|
|
/**
|
|
* @param array{name: string} $attributes
|
|
*/
|
|
public function handle(User $user, array $attributes): Vault
|
|
{
|
|
// Generate a new vault name if the current one already exists
|
|
$vaultExists = $user->vaults()
|
|
->where('name', 'like', $attributes['name'])
|
|
->exists();
|
|
|
|
if ($vaultExists) {
|
|
/** @var list<string> $vaults */
|
|
$vaults = array_column(
|
|
$user->vaults()
|
|
->select('name')
|
|
->where('name', 'like', $attributes['name'] . '-%')
|
|
->get()
|
|
->toArray(),
|
|
'name',
|
|
);
|
|
natcasesort($vaults);
|
|
$attributes['name'] .= count($vaults) && preg_match('/-(\d+)$/', end($vaults), $matches) === 1 ?
|
|
'-' . ((int) $matches[1] + 1) :
|
|
'-1';
|
|
}
|
|
|
|
// Save vault to database
|
|
$vault = $user->vaults()->create($attributes);
|
|
|
|
// Save vault to disk
|
|
$vaultPath = new GetPathFromVault()->handle($vault);
|
|
Storage::disk('local')->makeDirectory($vaultPath);
|
|
|
|
return $vault;
|
|
}
|
|
}
|