Skip to content

Commit d3ce175

Browse files
committed
chore: migrate apply template to Vue
1 parent aba70b6 commit d3ce175

5 files changed

Lines changed: 117 additions & 1 deletion

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Actions;
6+
7+
use App\Events\VaultNodeUpdatedEvent;
8+
use App\Models\VaultNode;
9+
10+
final readonly class ApplyTemplateToVaultNode
11+
{
12+
public function handle(VaultNode $template, VaultNode $node): void
13+
{
14+
$now = now();
15+
16+
$content = str_replace(
17+
['{{date}}', '{{time}}'],
18+
[$now->format('Y-m-d'), $now->format('H:i')],
19+
(string) $template->content,
20+
);
21+
22+
$content = str_contains($content, '{{content}}')
23+
? str_replace('{{content}}', (string) $node->content, $content)
24+
: $content . PHP_EOL . $node->content;
25+
26+
$node->update(['content' => $content]);
27+
28+
broadcast(new VaultNodeUpdatedEvent($node));
29+
}
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Controllers;
6+
7+
use App\Actions\ApplyTemplateToVaultNode;
8+
use App\Http\Requests\ApplyTemplateToVaultNodeRequest;
9+
use App\Models\User;
10+
use App\Models\Vault;
11+
use App\Models\VaultNode;
12+
use Illuminate\Container\Attributes\CurrentUser;
13+
14+
final readonly class VaultEditorApplyTemplateController
15+
{
16+
public function __invoke(
17+
ApplyTemplateToVaultNodeRequest $request,
18+
Vault $vault,
19+
VaultNode $template,
20+
#[CurrentUser] User $user,
21+
ApplyTemplateToVaultNode $applyTemplateToVaultNode,
22+
): void {
23+
abort_unless($user->can('view', $vault), 403);
24+
25+
/** @var array{ node_id: int } */
26+
$data = $request->validated();
27+
28+
/** @var VaultNode $node */
29+
$node = $vault->nodes()->findOrFail($data['node_id']);
30+
31+
$applyTemplateToVaultNode->handle($template, $node);
32+
}
33+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Requests;
6+
7+
use App\Models\Vault;
8+
use App\Models\VaultNode;
9+
use Illuminate\Foundation\Http\FormRequest;
10+
use Illuminate\Validation\Rule;
11+
12+
final class ApplyTemplateToVaultNodeRequest extends FormRequest
13+
{
14+
public function authorize(): bool
15+
{
16+
/** @var Vault $vault */
17+
$vault = $this->route('vault');
18+
19+
/** @var VaultNode $template */
20+
$template = $this->route('template');
21+
22+
return $template->vault_id === $vault->id && $template->isTemplate();
23+
}
24+
25+
/** @return array<string, array<int, mixed>> */
26+
public function rules(): array
27+
{
28+
/** @var Vault $vault */
29+
$vault = $this->route('vault');
30+
31+
return [
32+
'node_id' => [
33+
'integer',
34+
Rule::exists('vault_nodes', 'id')
35+
->where('vault_id', $vault->id)
36+
->where('is_file', 1)
37+
->where('extension', 'md'),
38+
],
39+
];
40+
}
41+
}

app/Models/VaultNode.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
/**
2626
* @property-read int $id
2727
* @property-read int $vault_id
28-
* @property-read int $parent_id
28+
* @property-read int|null $parent_id
2929
* @property-read bool $is_file
3030
* @property-read string $name
3131
* @property-read string $extension
@@ -77,6 +77,16 @@ public function tags(): BelongsToMany
7777
return $this->belongsToMany(Tag::class, null, 'vault_node_id', 'tag_id');
7878
}
7979

80+
public function isTemplate(): bool
81+
{
82+
return $this->vault->templates_node_id !== null
83+
&& $this->parent_id !== null
84+
&& $this->is_file === true
85+
&& $this->extension === 'md'
86+
/** @phpstan-ignore-next-line larastan.noUnnecessaryCollectionCall */
87+
&& $this->ancestors()->get()->contains($this->vault->templates_node_id);
88+
}
89+
8090
public function type(): VaultNodeType
8191
{
8292
return match (true) {

routes/web.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use App\Http\Controllers\VaultCollaborationController;
1818
use App\Http\Controllers\VaultCollaborationDeclineController;
1919
use App\Http\Controllers\VaultController;
20+
use App\Http\Controllers\VaultEditorApplyTemplateController;
2021
use App\Http\Controllers\VaultEditorSearchController;
2122
use App\Http\Controllers\VaultExportController;
2223
use App\Http\Controllers\VaultImportController;
@@ -71,6 +72,7 @@
7172

7273
Route::prefix('vaults/{vault}/editor')->name('vaults.editor.')->group(function (): void {
7374
Route::get('search', VaultEditorSearchController::class)->name('search');
75+
Route::post('templates/{template}/apply', VaultEditorApplyTemplateController::class)->name('templates.apply');
7476
});
7577

7678
Route::get('files/{vault}', [FileController::class, 'show'])->name('files.show');

0 commit comments

Comments
 (0)