mirror of
https://github.com/brufdev/many-notes.git
synced 2026-04-25 03:08:28 -05:00
Refactor with Pint
This commit is contained in:
@@ -1,16 +1,18 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Enums\OAuthProviders;
|
||||
|
||||
class GetAvailableOAuthProviders
|
||||
final class GetAvailableOAuthProviders
|
||||
{
|
||||
public function handle(): array
|
||||
{
|
||||
return array_filter(
|
||||
OAuthProviders::cases(),
|
||||
fn($provider) => env(mb_strtoupper($provider->value) . '_CLIENT_ID'),
|
||||
fn ($provider) => env(mb_strtoupper($provider->value).'_CLIENT_ID'),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
class GetPathFromUser
|
||||
final class GetPathFromUser
|
||||
{
|
||||
public function handle(): string
|
||||
{
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Models\Vault;
|
||||
|
||||
class GetPathFromVault
|
||||
final class GetPathFromVault
|
||||
{
|
||||
public function handle(Vault $vault): string
|
||||
{
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Models\VaultNode;
|
||||
|
||||
class GetPathFromVaultNode
|
||||
final class GetPathFromVaultNode
|
||||
{
|
||||
public function handle(VaultNode $node, bool $includeSelf = true): string
|
||||
{
|
||||
$relativePath = $node->parent ?
|
||||
$node->parent->ancestorsAndSelf->last()->full_path . '/' :
|
||||
$node->parent->ancestorsAndSelf->last()->full_path.'/' :
|
||||
'';
|
||||
|
||||
$path = sprintf(
|
||||
@@ -20,7 +22,7 @@ class GetPathFromVaultNode
|
||||
);
|
||||
|
||||
if ($includeSelf) {
|
||||
$path .= $node->name . ($node->is_file ? '.' . $node->extension : '');
|
||||
$path .= $node->name.($node->is_file ? '.'.$node->extension : '');
|
||||
}
|
||||
|
||||
return $path;
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Models\VaultNode;
|
||||
|
||||
class GetUrlFromVaultNode
|
||||
final class GetUrlFromVaultNode
|
||||
{
|
||||
public function handle(VaultNode $node): string
|
||||
{
|
||||
$path = $node->ancestorsAndSelf()->get()->last()->full_path;
|
||||
|
||||
return '/files/' . $node->vault_id . '?path=' . $path . '.' . $node->extension;
|
||||
return '/files/'.$node->vault_id.'?path='.$path.'.'.$node->extension;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Models\VaultNode;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class GetVaultNodeFromPath
|
||||
final class GetVaultNodeFromPath
|
||||
{
|
||||
public function handle(int $vaultId, string $path, ?int $parentId = null): VaultNode | null
|
||||
public function handle(int $vaultId, string $path, ?int $parentId = null): ?VaultNode
|
||||
{
|
||||
$path = Str::ltrim(str_replace('%20', ' ', $path), '/');
|
||||
$pieces = explode('/', $path);
|
||||
|
||||
if (count($pieces) == 1) {
|
||||
if (count($pieces) === 1) {
|
||||
$pathParts = pathinfo($pieces[0]);
|
||||
|
||||
return VaultNode::query()
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Illuminate\Http\File;
|
||||
use App\Services\VaultFile;
|
||||
use App\Services\VaultFiles\Note;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use Illuminate\Http\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class ProcessImportedFile
|
||||
final class ProcessImportedFile
|
||||
{
|
||||
public function handle(Vault $vault, VaultNode $parent, string $fileName, string $filePath): void
|
||||
{
|
||||
['filename' => $name, 'extension' => $extension] = pathinfo($fileName);
|
||||
|
||||
if (!in_array($extension, VaultFile::extensions())) {
|
||||
if (! in_array($extension, VaultFile::extensions())) {
|
||||
abort(400);
|
||||
}
|
||||
|
||||
@@ -47,7 +48,7 @@ class ProcessImportedFile
|
||||
);
|
||||
natcasesort($nodes);
|
||||
$name .= count($nodes) && preg_match('/-(\d+)$/', (string) end($nodes), $matches) === 1 ?
|
||||
'-' . ((int) $matches[1] + 1) :
|
||||
'-'.((int) $matches[1] + 1) :
|
||||
'-1';
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use ZipArchive;
|
||||
use App\Services\VaultFile;
|
||||
use App\Services\VaultFiles\Note;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use ZipArchive;
|
||||
|
||||
class ProcessImportedVault
|
||||
final class ProcessImportedVault
|
||||
{
|
||||
public function handle(string $fileName, string $filePath): void
|
||||
{
|
||||
@@ -35,7 +36,7 @@ class ProcessImportedVault
|
||||
);
|
||||
natcasesort($vaults);
|
||||
$vaultName .= count($vaults) && preg_match('/-(\d+)$/', (string) end($vaults), $matches) === 1 ?
|
||||
'-' . ((int) $matches[1] + 1) :
|
||||
'-'.((int) $matches[1] + 1) :
|
||||
'-1';
|
||||
}
|
||||
|
||||
@@ -49,23 +50,23 @@ class ProcessImportedVault
|
||||
for ($i = 0, $zipCount = $zip->count(); $i < $zipCount; $i++) {
|
||||
$entryName = $zip->getNameIndex($i);
|
||||
|
||||
$isFile = !str_ends_with($entryName, '/');
|
||||
$isFile = ! str_ends_with($entryName, '/');
|
||||
$flags = $isFile ? PATHINFO_FILENAME : PATHINFO_BASENAME;
|
||||
$name = pathinfo($entryName, $flags);
|
||||
$extension = null;
|
||||
$content = null;
|
||||
|
||||
if (!$isFile) {
|
||||
if (! $isFile) {
|
||||
// ZipArchive folder paths end with a / that should
|
||||
// be removed in order for pathinfo() return the correct dirname
|
||||
$entryDirName = rtrim($entryName, '/');
|
||||
$entryDirName = mb_rtrim($entryName, '/');
|
||||
$entryParentDirName = pathinfo($entryDirName, PATHINFO_DIRNAME);
|
||||
$parentId = $nodeIds[$entryParentDirName];
|
||||
} else {
|
||||
['dirname' => $entryDirName, 'extension' => $extension] = pathinfo($entryName);
|
||||
$parentId = $nodeIds[$entryDirName];
|
||||
|
||||
if (!in_array($extension, VaultFile::extensions())) {
|
||||
if (! in_array($extension, VaultFile::extensions())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -90,7 +91,7 @@ class ProcessImportedVault
|
||||
Storage::disk('local')->makeDirectory($relativePath);
|
||||
}
|
||||
|
||||
if (!array_key_exists($entryDirName, $nodeIds)) {
|
||||
if (! array_key_exists($entryDirName, $nodeIds)) {
|
||||
$nodeIds[$entryDirName] = $node->id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use GuzzleHttp\Psr7\UriResolver;
|
||||
use GuzzleHttp\Psr7\Utils;
|
||||
use Illuminate\Support\Str;
|
||||
use GuzzleHttp\Psr7\UriResolver;
|
||||
|
||||
class ResolveTwoPaths
|
||||
final class ResolveTwoPaths
|
||||
{
|
||||
public function handle(string $currentPath, string $path): string
|
||||
{
|
||||
$uri = Utils::uriFor(trim($path));
|
||||
$resolvedUri = UriResolver::resolve(Utils::uriFor(trim($currentPath)), $uri);
|
||||
$uri = Utils::uriFor(mb_trim($path));
|
||||
$resolvedUri = UriResolver::resolve(Utils::uriFor(mb_trim($currentPath)), $uri);
|
||||
|
||||
return Str::ltrim($resolvedUri, '/');
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
Enum OAuthProviders: string
|
||||
enum OAuthProviders: string
|
||||
{
|
||||
case Authentik = 'authentik';
|
||||
case Bitbucket = 'bitbucket';
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
abstract class Controller
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Vault;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Actions\ResolveTwoPaths;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use App\Actions\GetVaultNodeFromPath;
|
||||
use App\Actions\ResolveTwoPaths;
|
||||
use App\Models\Vault;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class FileController extends Controller
|
||||
final class FileController extends Controller
|
||||
{
|
||||
/**
|
||||
* Show the file for a given user.
|
||||
@@ -20,16 +22,16 @@ class FileController extends Controller
|
||||
{
|
||||
Gate::authorize('view', $request->vault);
|
||||
|
||||
if (!$request->has('path')) {
|
||||
if (! $request->has('path')) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$path = $request->path;
|
||||
|
||||
if (!Str::of($request->path)->startsWith('/') && $request->has('node')) {
|
||||
if (! Str::of($request->path)->startsWith('/') && $request->has('node')) {
|
||||
$node = $vault->nodes()->findOrFail($request->node);
|
||||
|
||||
if ($node->vault_id != $vault->id) {
|
||||
if ($node->vault_id !== $vault->id) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
@@ -42,6 +44,7 @@ class FileController extends Controller
|
||||
$absolutePath = Storage::disk('local')->path($relativePath);
|
||||
|
||||
ob_end_clean();
|
||||
|
||||
return response()->file($absolutePath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Auth;
|
||||
|
||||
use Livewire\Component;
|
||||
use App\Livewire\Forms\ForgotPasswordForm;
|
||||
use Livewire\Component;
|
||||
|
||||
class ForgotPassword extends Component
|
||||
final class ForgotPassword extends Component
|
||||
{
|
||||
public ForgotPasswordForm $form;
|
||||
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Auth;
|
||||
|
||||
use Livewire\Component;
|
||||
use App\Actions\GetAvailableOAuthProviders;
|
||||
use App\Livewire\Forms\LoginForm;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use App\Actions\GetAvailableOAuthProviders;
|
||||
use Livewire\Component;
|
||||
|
||||
class Login extends Component
|
||||
final class Login extends Component
|
||||
{
|
||||
public LoginForm $form;
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Auth;
|
||||
|
||||
use Livewire\Component;
|
||||
use Laravel\Socialite\Facades\Socialite;
|
||||
use Livewire\Component;
|
||||
|
||||
class OAuthLogin extends Component
|
||||
final class OAuthLogin extends Component
|
||||
{
|
||||
public function mount($provider): void
|
||||
{
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Auth;
|
||||
|
||||
use Exception;
|
||||
use App\Models\User;
|
||||
use Livewire\Component;
|
||||
use Illuminate\Support\Str;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Str;
|
||||
use Laravel\Socialite\Facades\Socialite;
|
||||
use Livewire\Component;
|
||||
|
||||
class OAuthLoginCallback extends Component
|
||||
final class OAuthLoginCallback extends Component
|
||||
{
|
||||
public function mount($provider): void
|
||||
{
|
||||
@@ -19,12 +21,14 @@ class OAuthLoginCallback extends Component
|
||||
} catch (Exception) {
|
||||
session()->flash('error', __('An error occurred while authenticating.'));
|
||||
$this->redirect('/login', true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!filter_var($providerUser->getEmail(), FILTER_VALIDATE_EMAIL)) {
|
||||
if (! filter_var($providerUser->getEmail(), FILTER_VALIDATE_EMAIL)) {
|
||||
session()->flash('error', __('No email address found.'));
|
||||
$this->redirect('/login', true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Auth;
|
||||
|
||||
use Livewire\Component;
|
||||
use App\Livewire\Forms\RegisterForm;
|
||||
use Livewire\Component;
|
||||
|
||||
class Register extends Component
|
||||
final class Register extends Component
|
||||
{
|
||||
public RegisterForm $form;
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Auth;
|
||||
|
||||
use Livewire\Component;
|
||||
use App\Livewire\Forms\ResetPasswordForm;
|
||||
use Livewire\Component;
|
||||
|
||||
class ResetPassword extends Component
|
||||
final class ResetPassword extends Component
|
||||
{
|
||||
public ResetPasswordForm $form;
|
||||
|
||||
@@ -20,7 +22,7 @@ class ResetPassword extends Component
|
||||
|
||||
public function send(): void
|
||||
{
|
||||
if (!$this->form->resetPassword()) {
|
||||
if (! $this->form->resetPassword()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Dashboard;
|
||||
|
||||
use Livewire\Component;
|
||||
|
||||
class Index extends Component
|
||||
final class Index extends Component
|
||||
{
|
||||
public function boot(): void
|
||||
{
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use Illuminate\Support\Arr;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Form;
|
||||
|
||||
class EditPasswordForm extends Form
|
||||
final class EditPasswordForm extends Form
|
||||
{
|
||||
#[Validate]
|
||||
public string $current_password = '';
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Form;
|
||||
|
||||
class EditProfileForm extends Form
|
||||
final class EditProfileForm extends Form
|
||||
{
|
||||
#[Validate]
|
||||
public string $name;
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Illuminate\Support\Facades\Password;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Form;
|
||||
|
||||
class ForgotPasswordForm extends Form
|
||||
final class ForgotPasswordForm extends Form
|
||||
{
|
||||
#[Validate('required|string|email')]
|
||||
public string $email = '';
|
||||
@@ -25,7 +27,7 @@ class ForgotPasswordForm extends Form
|
||||
$this->only('email')
|
||||
);
|
||||
|
||||
if ($status != Password::RESET_LINK_SENT) {
|
||||
if ($status !== Password::RESET_LINK_SENT) {
|
||||
$this->addError('email', __($status));
|
||||
|
||||
return;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Illuminate\Auth\Events\Lockout;
|
||||
@@ -10,7 +12,7 @@ use Illuminate\Validation\ValidationException;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Form;
|
||||
|
||||
class LoginForm extends Form
|
||||
final class LoginForm extends Form
|
||||
{
|
||||
#[Validate('required|string|email')]
|
||||
public string $email = '';
|
||||
@@ -24,7 +26,7 @@ class LoginForm extends Form
|
||||
/**
|
||||
* Attempt to authenticate the request's credentials.
|
||||
*
|
||||
* @throws \Illuminate\Validation\ValidationException
|
||||
* @throws ValidationException
|
||||
*/
|
||||
public function authenticate(): void
|
||||
{
|
||||
@@ -69,6 +71,6 @@ class LoginForm extends Form
|
||||
*/
|
||||
protected function throttleKey(): string
|
||||
{
|
||||
return Str::transliterate(Str::lower($this->email) . '|' . request()->ip());
|
||||
return Str::transliterate(Str::lower($this->email).'|'.request()->ip());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use App\Models\User;
|
||||
use Illuminate\Validation\Rules;
|
||||
use Illuminate\Auth\Events\Registered;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Auth\Events\Registered;
|
||||
use Illuminate\Validation\Rules;
|
||||
use Livewire\Form;
|
||||
|
||||
class RegisterForm extends Form
|
||||
final class RegisterForm extends Form
|
||||
{
|
||||
public string $name = '';
|
||||
|
||||
@@ -23,7 +25,7 @@ class RegisterForm extends Form
|
||||
{
|
||||
return [
|
||||
'name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:' . User::class],
|
||||
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
|
||||
'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Attributes\Locked;
|
||||
use Illuminate\Validation\Rules;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Facades\Password;
|
||||
use Illuminate\Auth\Events\PasswordReset;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Password;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rules;
|
||||
use Livewire\Attributes\Locked;
|
||||
use Livewire\Form;
|
||||
|
||||
class ResetPasswordForm extends Form
|
||||
final class ResetPasswordForm extends Form
|
||||
{
|
||||
#[Locked]
|
||||
public string $token = '';
|
||||
@@ -66,7 +68,7 @@ class ResetPasswordForm extends Form
|
||||
// If the password was successfully reset, we will redirect the user back to
|
||||
// the application's home authenticated view. If there is an error we can
|
||||
// redirect them back to where they came from with their error message.
|
||||
if ($status != Password::PASSWORD_RESET) {
|
||||
if ($status !== Password::PASSWORD_RESET) {
|
||||
$this->addError('email', __($status));
|
||||
|
||||
return false;
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use App\Models\Vault;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Form;
|
||||
|
||||
class VaultForm extends Form
|
||||
final class VaultForm extends Form
|
||||
{
|
||||
public ?Vault $vault = null;
|
||||
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Forms;
|
||||
|
||||
use Livewire\Form;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Form;
|
||||
|
||||
class VaultNodeForm extends Form
|
||||
final class VaultNodeForm extends Form
|
||||
{
|
||||
public Vault $vault;
|
||||
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Layout;
|
||||
|
||||
use Livewire\Component;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\Livewire\Forms\EditProfileForm;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use App\Livewire\Forms\EditPasswordForm;
|
||||
use App\Livewire\Forms\EditProfileForm;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Livewire\Component;
|
||||
|
||||
class UserMenu extends Component
|
||||
final class UserMenu extends Component
|
||||
{
|
||||
public EditProfileForm $profileForm;
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Livewire\Attributes\On;
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
|
||||
class AddNode extends Modal
|
||||
{
|
||||
@@ -22,7 +24,7 @@ class AddNode extends Modal
|
||||
#[On('open-modal')]
|
||||
public function open(?VaultNode $parent = null, bool $isFile = true): void
|
||||
{
|
||||
if (!is_null($parent->vault)) {
|
||||
if (! is_null($parent->vault)) {
|
||||
$this->authorize('update', $parent->vault);
|
||||
}
|
||||
|
||||
@@ -37,7 +39,7 @@ class AddNode extends Modal
|
||||
$node = $this->form->create();
|
||||
$this->closeModal();
|
||||
$this->dispatch('node-updated');
|
||||
if ($node->parent_id == $this->form->vault->templates_node_id) {
|
||||
if ($node->parent_id === $this->form->vault->templates_node_id) {
|
||||
$this->dispatch('templates-refresh');
|
||||
}
|
||||
$message = $this->form->is_file ? __('File created') : __('Folder created');
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Livewire\Attributes\On;
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
|
||||
class EditNode extends Modal
|
||||
{
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use App\Actions\ProcessImportedFile;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use App\Services\VaultFile;
|
||||
use Illuminate\Support\Arr;
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\WithFileUploads;
|
||||
use Livewire\Attributes\Validate;
|
||||
use App\Actions\ProcessImportedFile;
|
||||
use Livewire\WithFileUploads;
|
||||
|
||||
class ImportFile extends Modal
|
||||
{
|
||||
@@ -31,7 +33,7 @@ class ImportFile extends Modal
|
||||
return [
|
||||
'file' => [
|
||||
'required',
|
||||
'mimes:' . Arr::join(VaultFile::extensions(), ','),
|
||||
'mimes:'.Arr::join(VaultFile::extensions(), ','),
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\WithFileUploads;
|
||||
use Livewire\Attributes\Validate;
|
||||
use App\Actions\ProcessImportedVault;
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\WithFileUploads;
|
||||
|
||||
class ImportVault extends Modal
|
||||
{
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Livewire\Attributes\On;
|
||||
use App\Services\VaultFiles\Image;
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use Livewire\Attributes\On;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\Builder;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\Collection;
|
||||
|
||||
@@ -48,8 +50,8 @@ class MarkdownEditorSearch extends Modal
|
||||
->when($this->searchType === 'image', function (Builder $query): void {
|
||||
$query->whereIn('extension', Image::extensions());
|
||||
})
|
||||
->when(strlen($this->search), function (Builder $query): void {
|
||||
$query->where('name', 'like', '%' . $this->search . '%');
|
||||
->when(mb_strlen($this->search), function (Builder $query): void {
|
||||
$query->where('name', 'like', '%'.$this->search.'%');
|
||||
})
|
||||
->orderByDesc('updated_at')
|
||||
->limit(5)
|
||||
@@ -58,8 +60,8 @@ class MarkdownEditorSearch extends Modal
|
||||
$this->nodes->transform(function (VaultNode $item): VaultNode {
|
||||
$item->full_path = $item->ancestorsAndSelf()->get()->last()->full_path;
|
||||
$item->full_path_encoded = preg_replace('/\s/', '%20', (string) $item->full_path);
|
||||
$item->dir_name = preg_replace('/' . $item->name . '$/', '', (string)$item->full_path);
|
||||
if (strlen((string) $item->dir_name) == 1) {
|
||||
$item->dir_name = preg_replace('/'.$item->name.'$/', '', (string) $item->full_path);
|
||||
if (mb_strlen((string) $item->dir_name) === 1) {
|
||||
$item->dir_name = '';
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use Livewire\Component;
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Modals;
|
||||
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Livewire\Attributes\On;
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\Builder;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\Collection;
|
||||
|
||||
@@ -40,8 +42,8 @@ class SearchNode extends Modal
|
||||
->select('id', 'name', 'extension')
|
||||
->where('vault_id', $this->vault->id)
|
||||
->where('is_file', true)
|
||||
->when(strlen($this->search), function (Builder $query): void {
|
||||
$query->where('name', 'like', '%' . $this->search . '%');
|
||||
->when(mb_strlen($this->search), function (Builder $query): void {
|
||||
$query->where('name', 'like', '%'.$this->search.'%');
|
||||
})
|
||||
->orderByDesc('updated_at')
|
||||
->limit(5)
|
||||
@@ -49,8 +51,8 @@ class SearchNode extends Modal
|
||||
|
||||
$this->nodes->transform(function (VaultNode $item): VaultNode {
|
||||
$item->full_path = $item->ancestorsAndSelf()->get()->last()->full_path;
|
||||
$item->dir_name = preg_replace('/' . $item->name . '$/', '', (string) $item->full_path);
|
||||
if (strlen((string) $item->dir_name) == 1) {
|
||||
$item->dir_name = preg_replace('/'.$item->name.'$/', '', (string) $item->full_path);
|
||||
if (mb_strlen((string) $item->dir_name) === 1) {
|
||||
$item->dir_name = '';
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Vault;
|
||||
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use App\Livewire\Forms\VaultForm;
|
||||
use App\Models\Vault;
|
||||
use App\Models\VaultNode;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Component;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\Collection;
|
||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||
use Throwable;
|
||||
use ZipArchive;
|
||||
use App\Models\Vault;
|
||||
use Livewire\Component;
|
||||
use App\Models\VaultNode;
|
||||
use Illuminate\Support\Str;
|
||||
use App\Livewire\Forms\VaultForm;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\Collection;
|
||||
|
||||
class Index extends Component
|
||||
final class Index extends Component
|
||||
{
|
||||
public VaultForm $form;
|
||||
|
||||
@@ -32,17 +34,44 @@ class Index extends Component
|
||||
{
|
||||
$this->authorize('view', $vault);
|
||||
$zip = new ZipArchive;
|
||||
$zipFileName = $vault->id . '.zip';
|
||||
$zipFileName = $vault->id.'.zip';
|
||||
$nodes = $vault->nodes()->whereNull('parent_id')->get();
|
||||
|
||||
if ($zip->open(public_path($zipFileName), ZipArchive::CREATE) === false) {
|
||||
$this->dispatch('toast', message: __('Something went wrong'), type: 'error');
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
$this->exportNodes($zip, $nodes);
|
||||
$zip->close();
|
||||
return response()->download(public_path($zipFileName), $vault->name . '.zip')->deleteFileAfterSend(true);
|
||||
|
||||
return response()->download(public_path($zipFileName), $vault->name.'.zip')->deleteFileAfterSend(true);
|
||||
}
|
||||
|
||||
public function delete(Vault $vault): void
|
||||
{
|
||||
$this->authorize('delete', $vault);
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
$rootNodes = $vault->nodes()->whereNull('parent_id')->get();
|
||||
foreach ($rootNodes as $node) {
|
||||
$this->deleteNode($node);
|
||||
}
|
||||
$vault->delete();
|
||||
DB::commit();
|
||||
$this->dispatch('toast', message: __('Vault deleted'), type: 'success');
|
||||
} catch (Throwable) {
|
||||
DB::rollBack();
|
||||
$this->dispatch('toast', message: __('Something went wrong'), type: 'error');
|
||||
}
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.vault.index', [
|
||||
'vaults' => auth()->user()->vaults()->orderBy('updated_at', 'DESC')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
private function exportNodes(ZipArchive &$zip, Collection $nodes, string $path = ''): void
|
||||
@@ -68,24 +97,6 @@ class Index extends Component
|
||||
}
|
||||
}
|
||||
|
||||
public function delete(Vault $vault): void
|
||||
{
|
||||
$this->authorize('delete', $vault);
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
$rootNodes = $vault->nodes()->whereNull('parent_id')->get();
|
||||
foreach ($rootNodes as $node) {
|
||||
$this->deleteNode($node);
|
||||
}
|
||||
$vault->delete();
|
||||
DB::commit();
|
||||
$this->dispatch('toast', message: __('Vault deleted'), type: 'success');
|
||||
} catch (Throwable) {
|
||||
DB::rollBack();
|
||||
$this->dispatch('toast', message: __('Something went wrong'), type: 'error');
|
||||
}
|
||||
}
|
||||
|
||||
private function deleteNode(VaultNode $node): void
|
||||
{
|
||||
foreach ($node->childs as $child) {
|
||||
@@ -93,11 +104,4 @@ class Index extends Component
|
||||
}
|
||||
$node->delete();
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.vault.index', [
|
||||
'vaults' => auth()->user()->vaults()->orderBy('updated_at', 'DESC')->get(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Vault;
|
||||
|
||||
use Livewire\Component;
|
||||
|
||||
class Last extends Component
|
||||
final class Last extends Component
|
||||
{
|
||||
public function mount(): void
|
||||
{
|
||||
$lastVault = auth()->user()->vaults()->orderBy('opened_at', 'desc')->first();
|
||||
|
||||
if (!$lastVault) {
|
||||
if (! $lastVault) {
|
||||
$this->redirect(route('vaults.index'), navigate: true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Vault;
|
||||
|
||||
use App\Livewire\Forms\VaultForm;
|
||||
use App\Models\Vault;
|
||||
use Livewire\Component;
|
||||
|
||||
class Row extends Component
|
||||
final class Row extends Component
|
||||
{
|
||||
public Vault $vault;
|
||||
|
||||
|
||||
+35
-30
@@ -1,25 +1,27 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Vault;
|
||||
|
||||
use Throwable;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use App\Actions\GetUrlFromVaultNode;
|
||||
use App\Actions\GetVaultNodeFromPath;
|
||||
use App\Actions\ResolveTwoPaths;
|
||||
use App\Livewire\Forms\VaultForm;
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use App\Models\Vault;
|
||||
use Livewire\Component;
|
||||
use App\Models\VaultNode;
|
||||
use App\Services\VaultFiles\Note;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\Attributes\Url;
|
||||
use App\Actions\ResolveTwoPaths;
|
||||
use App\Livewire\Forms\VaultForm;
|
||||
use App\Services\VaultFiles\Note;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Actions\GetUrlFromVaultNode;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use App\Actions\GetVaultNodeFromPath;
|
||||
use App\Livewire\Forms\VaultNodeForm;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Livewire\Component;
|
||||
use Throwable;
|
||||
|
||||
class Show extends Component
|
||||
final class Show extends Component
|
||||
{
|
||||
public Vault $vault;
|
||||
|
||||
@@ -49,8 +51,9 @@ class Show extends Component
|
||||
if ((int) $this->selectedFile > 0) {
|
||||
$selectedFile = $vault->nodes()->where('id', $this->selectedFile)->first();
|
||||
|
||||
if (!$selectedFile) {
|
||||
if (! $selectedFile) {
|
||||
$this->selectedFile = null;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -62,7 +65,7 @@ class Show extends Component
|
||||
{
|
||||
$this->authorize('view', $node->vault);
|
||||
|
||||
if (!$node->vault->is($this->vault) || !$node->is_file) {
|
||||
if (! $node->vault->is($this->vault) || ! $node->is_file) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -70,7 +73,7 @@ class Show extends Component
|
||||
$this->selectedFilePath = new GetUrlFromVaultNode()->handle($node);
|
||||
$this->nodeForm->setNode($node);
|
||||
|
||||
if ($node->extension == 'md') {
|
||||
if ($node->extension === 'md') {
|
||||
$this->dispatch('file-render-markup');
|
||||
} else {
|
||||
$this->reset('isEditMode');
|
||||
@@ -95,7 +98,7 @@ class Show extends Component
|
||||
{
|
||||
$this->authorize('view', $node->vault);
|
||||
|
||||
if ($node->id != $this->selectedFile) {
|
||||
if ($node->id !== $this->selectedFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -121,7 +124,7 @@ class Show extends Component
|
||||
|
||||
public function updated($name): void
|
||||
{
|
||||
if (!Str::of($name)->startsWith('nodeForm')) {
|
||||
if (! Str::of($name)->startsWith('nodeForm')) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -130,7 +133,7 @@ class Show extends Component
|
||||
if ($this->nodeForm->node->wasChanged(['parent_id', 'name'])) {
|
||||
$this->dispatch('node-updated');
|
||||
|
||||
if ($this->nodeForm->node->parent_id == $this->vault->templates_node_id) {
|
||||
if ($this->nodeForm->node->parent_id === $this->vault->templates_node_id) {
|
||||
$this->getTemplates();
|
||||
}
|
||||
}
|
||||
@@ -142,6 +145,7 @@ class Show extends Component
|
||||
|
||||
if ($this->vault->id !== $node->vault->id || $node->is_file) {
|
||||
$this->dispatch('toast', message: __('Something went wrong'), type: 'error');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -155,11 +159,12 @@ class Show extends Component
|
||||
$this->authorize('update', $this->vault);
|
||||
$sameVault = $this->vault->id === $node->vault->id;
|
||||
$isNote = $node->is_file && in_array($node->extension, Note::extensions());
|
||||
$isTemplate = $node->parent_id == $this->vault->templates_node_id;
|
||||
$isTemplate = $node->parent_id === $this->vault->templates_node_id;
|
||||
$fileSelected = (int) $this->selectedFile > 0;
|
||||
|
||||
if (!$sameVault || !$isNote || !$isTemplate || !$fileSelected || !$this->isEditMode) {
|
||||
if (! $sameVault || ! $isNote || ! $isTemplate || ! $fileSelected || ! $this->isEditMode) {
|
||||
$this->dispatch('toast', message: __('Something went wrong'), type: 'error');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -175,7 +180,7 @@ class Show extends Component
|
||||
|
||||
$content = str_contains($content, '{{content}}')
|
||||
? str_replace('{{content}}', $selectedNode->content, $content)
|
||||
: $content . PHP_EOL . $selectedNode->content;
|
||||
: $content.PHP_EOL.$selectedNode->content;
|
||||
$selectedNode->update(['content' => $content]);
|
||||
$this->nodeForm->setNode($selectedNode);
|
||||
$this->dispatch('toast', message: __('Template inserted'), type: 'success');
|
||||
@@ -184,7 +189,7 @@ class Show extends Component
|
||||
#[On('templates-refresh')]
|
||||
public function getTemplates(): void
|
||||
{
|
||||
if (!$this->vault->templatesNode) {
|
||||
if (! $this->vault->templatesNode) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -211,10 +216,10 @@ class Show extends Component
|
||||
|
||||
DB::commit();
|
||||
$this->dispatch('node-updated');
|
||||
$templateDeleted = !is_null(
|
||||
$templateDeleted = ! is_null(
|
||||
array_find(
|
||||
$this->deletedNodes,
|
||||
fn($node): bool => $node->parent_id == $this->vault->templates_node_id
|
||||
fn ($node): bool => $node->parent_id === $this->vault->templates_node_id
|
||||
)
|
||||
);
|
||||
if ($templateDeleted) {
|
||||
@@ -228,9 +233,14 @@ class Show extends Component
|
||||
}
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.vault.show');
|
||||
}
|
||||
|
||||
private function deleteFile(VaultNode $node): void
|
||||
{
|
||||
if ($this->selectedFile == $node->id) {
|
||||
if ($this->selectedFile === $node->id) {
|
||||
$this->closeFile();
|
||||
}
|
||||
|
||||
@@ -251,9 +261,4 @@ class Show extends Component
|
||||
$this->deletedNodes[] = $node;
|
||||
$node->delete();
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.vault.show');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Livewire\Vault;
|
||||
|
||||
use App\Models\Vault;
|
||||
use Livewire\Component;
|
||||
use App\Models\VaultNode;
|
||||
use Livewire\Attributes\On;
|
||||
use Livewire\Component;
|
||||
|
||||
#[On('node-updated')]
|
||||
class TreeView extends Component
|
||||
final class TreeView extends Component
|
||||
{
|
||||
public Vault $vault;
|
||||
|
||||
|
||||
+13
-12
@@ -1,15 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use App\Models\Vault;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
|
||||
class User extends Authenticatable
|
||||
final class User extends Authenticatable
|
||||
{
|
||||
use HasFactory, Notifiable;
|
||||
|
||||
@@ -34,6 +35,14 @@ class User extends Authenticatable
|
||||
'remember_token',
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the associated vaults.
|
||||
*/
|
||||
public function vaults(): HasMany
|
||||
{
|
||||
return $this->hasMany(Vault::class, 'created_by');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attributes that should be cast.
|
||||
*
|
||||
@@ -46,12 +55,4 @@ class User extends Authenticatable
|
||||
'password' => 'hashed',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the associated vaults.
|
||||
*/
|
||||
public function vaults(): HasMany
|
||||
{
|
||||
return $this->hasMany(Vault::class, 'created_by');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Observers\VaultObserver;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
|
||||
#[ObservedBy([VaultObserver::class])]
|
||||
class Vault extends Model
|
||||
final class Vault extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
|
||||
+20
-18
@@ -1,33 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Observers\VaultNodeObserver;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Staudenmeir\LaravelAdjacencyList\Eloquent\HasRecursiveRelationships;
|
||||
|
||||
#[ObservedBy([VaultNodeObserver::class])]
|
||||
class VaultNode extends Model
|
||||
final class VaultNode extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use HasRecursiveRelationships;
|
||||
|
||||
/**
|
||||
* Get the attributes that should be cast.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'is_file' => 'boolean',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
@@ -54,7 +44,7 @@ class VaultNode extends Model
|
||||
*/
|
||||
public function childs(): HasMany
|
||||
{
|
||||
return $this->hasMany(VaultNode::class, 'parent_id');
|
||||
return $this->hasMany(self::class, 'parent_id');
|
||||
}
|
||||
|
||||
public function getCustomPaths(): array
|
||||
@@ -68,4 +58,16 @@ class VaultNode extends Model
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attributes that should be cast.
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'is_file' => 'boolean',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Observers;
|
||||
|
||||
use App\Models\VaultNode;
|
||||
use App\Actions\GetPathFromVault;
|
||||
use App\Actions\GetPathFromVaultNode;
|
||||
use App\Models\VaultNode;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class VaultNodeObserver
|
||||
final class VaultNodeObserver
|
||||
{
|
||||
/**
|
||||
* Handle the VaultNode "creating" event.
|
||||
@@ -34,25 +35,25 @@ class VaultNodeObserver
|
||||
{
|
||||
$relativePath = new GetPathFromVaultNode()->handle($node, false);
|
||||
|
||||
if (Storage::disk('local')->exists($relativePath . $node->name)) {
|
||||
if (Storage::disk('local')->exists($relativePath.$node->name)) {
|
||||
abort(500);
|
||||
}
|
||||
|
||||
if ($node->isDirty('name')) {
|
||||
$paths = [
|
||||
$relativePath . $node->getOriginal('name'),
|
||||
$relativePath . $node->name,
|
||||
$relativePath.$node->getOriginal('name'),
|
||||
$relativePath.$node->name,
|
||||
];
|
||||
if ($node->is_file) {
|
||||
$paths[0] .= '.' . $node->extension;
|
||||
$paths[1] .= '.' . $node->extension;
|
||||
$paths[0] .= '.'.$node->extension;
|
||||
$paths[1] .= '.'.$node->extension;
|
||||
}
|
||||
Storage::disk('local')->move(...$paths);
|
||||
}
|
||||
|
||||
if ($node->is_file) {
|
||||
Storage::disk('local')->put(
|
||||
$relativePath . $node->name . '.' . $node->extension,
|
||||
$relativePath.$node->name.'.'.$node->extension,
|
||||
$node->content ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Observers;
|
||||
|
||||
use App\Models\Vault;
|
||||
use App\Actions\GetPathFromUser;
|
||||
use App\Models\Vault;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class VaultObserver
|
||||
final class VaultObserver
|
||||
{
|
||||
/**
|
||||
* Handle the Vault "creating" event.
|
||||
@@ -15,11 +17,11 @@ class VaultObserver
|
||||
{
|
||||
$relativePath = new GetPathFromUser()->handle();
|
||||
|
||||
if (Storage::disk('local')->exists($relativePath . $vault->name)) {
|
||||
if (Storage::disk('local')->exists($relativePath.$vault->name)) {
|
||||
abort(500);
|
||||
}
|
||||
|
||||
Storage::disk('local')->makeDirectory($relativePath . $vault->name);
|
||||
Storage::disk('local')->makeDirectory($relativePath.$vault->name);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -27,19 +29,19 @@ class VaultObserver
|
||||
*/
|
||||
public function updating(Vault $vault): void
|
||||
{
|
||||
if (!$vault->isDirty('name')) {
|
||||
if (! $vault->isDirty('name')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$relativePath = new GetPathFromUser()->handle();
|
||||
|
||||
if (Storage::disk('local')->exists($relativePath . $vault->name)) {
|
||||
if (Storage::disk('local')->exists($relativePath.$vault->name)) {
|
||||
abort(500);
|
||||
}
|
||||
|
||||
Storage::disk('local')->move(
|
||||
$relativePath . $vault->getOriginal('name'),
|
||||
$relativePath . $vault->name,
|
||||
$relativePath.$vault->getOriginal('name'),
|
||||
$relativePath.$vault->name,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -49,6 +51,6 @@ class VaultObserver
|
||||
public function deleting(Vault $vault): void
|
||||
{
|
||||
$relativePath = new GetPathFromUser()->handle();
|
||||
Storage::disk('local')->deleteDirectory($relativePath . $vault->name);
|
||||
Storage::disk('local')->deleteDirectory($relativePath.$vault->name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\Vault;
|
||||
use Illuminate\Auth\Access\Response;
|
||||
|
||||
class VaultPolicy
|
||||
final class VaultPolicy
|
||||
{
|
||||
/**
|
||||
* Determine whether the user can view the model.
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Override;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Override;
|
||||
use SocialiteProviders\Authentik\Provider;
|
||||
use SocialiteProviders\Manager\SocialiteWasCalled;
|
||||
|
||||
class AppServiceProvider extends ServiceProvider
|
||||
final class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register any application services.
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Services\VaultFiles\Pdf;
|
||||
use App\Services\VaultFiles\Note;
|
||||
use App\Services\VaultFiles\Audio;
|
||||
use App\Services\VaultFiles\Image;
|
||||
use App\Services\VaultFiles\Note;
|
||||
use App\Services\VaultFiles\Pdf;
|
||||
use App\Services\VaultFiles\Video;
|
||||
|
||||
class VaultFile
|
||||
final class VaultFile
|
||||
{
|
||||
public static function extensions(bool $withDots = false): array
|
||||
{
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\VaultFiles;
|
||||
|
||||
class Audio extends File
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\VaultFiles;
|
||||
|
||||
class File
|
||||
{
|
||||
public static function extensionsWithDots(array $extensions): array
|
||||
{
|
||||
return array_map(fn(string $value): string => '.' . $value, $extensions);
|
||||
return array_map(fn (string $value): string => '.'.$value, $extensions);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\VaultFiles;
|
||||
|
||||
class Image extends File
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\VaultFiles;
|
||||
|
||||
class Note extends File
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\VaultFiles;
|
||||
|
||||
class Pdf extends File
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\VaultFiles;
|
||||
|
||||
class Video extends File
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Foundation\Configuration\Exceptions;
|
||||
use Illuminate\Foundation\Configuration\Middleware;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
App\Providers\AppServiceProvider::class,
|
||||
];
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|
||||
+3
-1
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
@@ -67,7 +69,7 @@ return [
|
||||
'disk' => null, // Example: 'local', 's3' | Default: 'default'
|
||||
'rules' => [
|
||||
'file',
|
||||
'max:' . Monolog\Utils::expandIniShorthandBytes(ini_get('upload_max_filesize')),
|
||||
'max:'.Monolog\Utils::expandIniShorthandBytes(ini_get('upload_max_filesize')),
|
||||
], // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
|
||||
'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
|
||||
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Monolog\Handler\NullHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Handler\SyslogUdpHandler;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
@@ -9,7 +11,7 @@ use Illuminate\Support\Str;
|
||||
/**
|
||||
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
|
||||
*/
|
||||
class UserFactory extends Factory
|
||||
final class UserFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The current password being used by the factory.
|
||||
@@ -27,7 +29,7 @@ class UserFactory extends Factory
|
||||
'name' => fake()->name(),
|
||||
'email' => fake()->unique()->safeEmail(),
|
||||
'email_verified_at' => now(),
|
||||
'password' => static::$password ??= Hash::make('password'),
|
||||
'password' => self::$password ??= Hash::make('password'),
|
||||
'remember_token' => Str::random(10),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\User;
|
||||
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DatabaseSeeder extends Seeder
|
||||
final class DatabaseSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Seed the application's database.
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
define('LARAVEL_START', microtime(true));
|
||||
|
||||
+7
-7
@@ -6,13 +6,13 @@ use Rector\Config\RectorConfig;
|
||||
|
||||
return RectorConfig::configure()
|
||||
->withPaths([
|
||||
__DIR__ . '/app',
|
||||
__DIR__ . '/bootstrap/app.php',
|
||||
__DIR__ . '/bootstrap/providers.php',
|
||||
__DIR__ . '/database',
|
||||
__DIR__ . '/public',
|
||||
__DIR__ . '/routes',
|
||||
__DIR__ . '/tests',
|
||||
__DIR__.'/app',
|
||||
__DIR__.'/bootstrap/app.php',
|
||||
__DIR__.'/bootstrap/providers.php',
|
||||
__DIR__.'/database',
|
||||
__DIR__.'/public',
|
||||
__DIR__.'/routes',
|
||||
__DIR__.'/tests',
|
||||
])
|
||||
->withPreparedSets(
|
||||
deadCode: true,
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Foundation\Inspiring;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
|
||||
|
||||
+11
-11
@@ -1,20 +1,20 @@
|
||||
<?php
|
||||
|
||||
use App\Livewire\Auth\Login;
|
||||
use App\Enums\OAuthProviders;
|
||||
use App\Livewire\Auth\Register;
|
||||
use App\Livewire\Auth\OAuthLogin;
|
||||
use Illuminate\Container\Container;
|
||||
use App\Livewire\Auth\ResetPassword;
|
||||
use App\Livewire\Auth\ForgotPassword;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
declare(strict_types=1);
|
||||
|
||||
use App\Actions\GetAvailableOAuthProviders;
|
||||
use App\Http\Controllers\FileController;
|
||||
use App\Livewire\Auth\ForgotPassword;
|
||||
use App\Livewire\Auth\Login;
|
||||
use App\Livewire\Auth\OAuthLogin;
|
||||
use App\Livewire\Auth\OAuthLoginCallback;
|
||||
use App\Livewire\Auth\Register;
|
||||
use App\Livewire\Auth\ResetPassword;
|
||||
use App\Livewire\Dashboard\Index as DashboardIndex;
|
||||
use App\Livewire\Vault\Index as VaultIndex;
|
||||
use App\Livewire\Vault\Last as VaultLast;
|
||||
use App\Livewire\Vault\Show as VaultShow;
|
||||
use App\Actions\GetAvailableOAuthProviders;
|
||||
use App\Livewire\Vault\Index as VaultIndex;
|
||||
use App\Livewire\Dashboard\Index as DashboardIndex;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::middleware('auth')->group(function (): void {
|
||||
Route::get('/', DashboardIndex::class)->name('dashboard.index');
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
// use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ExampleTest extends TestCase
|
||||
final class ExampleTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* A basic test example.
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests;
|
||||
|
||||
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ExampleTest extends TestCase
|
||||
final class ExampleTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* A basic test example.
|
||||
|
||||
Reference in New Issue
Block a user