Merge remote-tracking branch 'origin/email-verification'

# Conflicts:
#	composer.lock
#	public/mix-manifest.json
#	tests/TestCase.php
This commit is contained in:
Peter Papp
2021-07-15 14:00:43 +02:00
43 changed files with 988 additions and 12292 deletions
+66 -60
View File
@@ -1,6 +1,6 @@
<?php <?php
$finder = PhpCsFixer\Finder::create() $finder = Symfony\Component\Finder\Finder::create()
->in([ ->in([
__DIR__ . '/app', __DIR__ . '/app',
__DIR__ . '/routes', __DIR__ . '/routes',
@@ -11,63 +11,69 @@ $finder = PhpCsFixer\Finder::create()
->ignoreDotFiles(true) ->ignoreDotFiles(true)
->ignoreVCS(true); ->ignoreVCS(true);
$config = new PhpCsFixer\Config(); return PhpCsFixer\Config::create()
return $config->setRules([ ->setRules([
'@PSR2' => true, '@PSR2' => true,
'array_syntax' => [ 'array_syntax' => [
'syntax' => 'short' 'syntax' => 'short'
], ],
'ordered_imports' => [ 'ordered_imports' => [
'sort_algorithm' => 'length' 'sortAlgorithm' => 'length'
], ],
'blank_line_before_statement' => [ 'blank_line_before_statement' => [
'statements' => ['break', 'case', 'continue', 'declare', 'default', 'do', 'exit', 'for', 'foreach', 'goto', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', 'yield_from'], 'statements' => ['break', 'case', 'continue', 'declare', 'default', 'die', 'do', 'exit', 'for', 'foreach', 'goto', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', 'yield_from'],
], ],
'method_argument_space' => [ 'class_attributes_separation' => [
'on_multiline' => 'ensure_fully_multiline', 'elements' => [
'keep_multiple_spaces_after_comma' => true, 'method',
], ],
'no_extra_blank_lines' => [ ],
'tokens' => ['break', 'case', 'continue', 'curly_brace_block', 'default', 'extra', 'parenthesis_brace_block', 'return', 'square_brace_block', 'switch', 'throw', 'use', 'use_trait'], 'method_argument_space' => [
], 'on_multiline' => 'ensure_fully_multiline',
'cast_spaces' => [ 'keep_multiple_spaces_after_comma' => true,
'space' => 'single' ],
], 'no_extra_blank_lines' => [
'phpdoc_single_line_var_spacing' => true, 'break', 'case', 'continue', 'curly_brace_block', 'default', 'extra', 'parenthesis_brace_block', 'return', 'square_brace_block', 'switch', 'throw', 'use', 'useTrait', 'use_trait'
'phpdoc_var_without_name' => true, ],
'single_space_after_construct' => true, 'cast_spaces' => [
'single_line_after_imports' => true, 'space' => 'single'
'no_unused_imports' => true, ],
'not_operator_with_successor_space' => true, 'phpdoc_single_line_var_spacing' => true,
'trailing_comma_in_multiline' => ['elements' => ['arrays']], 'phpdoc_var_without_name' => true,
'phpdoc_scalar' => true, 'single_space_after_construct' => true,
'unary_operator_spaces' => true, 'single_line_after_imports' => true,
'binary_operator_spaces' => true, 'no_unused_imports' => true,
'single_trait_insert_per_statement' => false, 'not_operator_with_successor_space' => true,
'method_chaining_indentation' => true, 'trailing_comma_in_multiline_array' => true,
'array_indentation' => true, 'phpdoc_scalar' => true,
'single_quote' => true, 'unary_operator_spaces' => true,
'no_singleline_whitespace_before_semicolons' => true, 'binary_operator_spaces' => true,
'no_empty_statement' => true, 'single_trait_insert_per_statement' => false,
'standardize_increment' => true, 'no_spaces_around_offset' => true,
'object_operator_without_whitespace' => true, 'method_chaining_indentation' => true,
'ternary_operator_spaces' => true, 'array_indentation' => true,
'no_leading_namespace_whitespace' => true, 'single_quote' => true,
'no_blank_lines_before_namespace' => true, 'no_singleline_whitespace_before_semicolons' => true,
'blank_line_after_namespace' => true, 'no_empty_statement' => true,
'fully_qualified_strict_types' => true, 'standardize_increment' => true,
'single_line_throw' => true, 'object_operator_without_whitespace' => true,
'function_typehint_space' => true, 'ternary_operator_spaces' => true,
'simplified_if_return' => true, 'no_leading_namespace_whitespace' => true,
'no_useless_else' => true, 'no_blank_lines_before_namespace' => true,
'no_unneeded_curly_braces' => true, 'blank_line_after_namespace' => true,
'no_empty_comment' => true, 'fully_qualified_strict_types' => true,
'no_blank_lines_after_class_opening' => true, 'single_line_throw' => true,
'whitespace_after_comma_in_array' => true, 'function_typehint_space' => true,
'trim_array_spaces' => true, 'simplified_if_return' => true,
'no_whitespace_before_comma_in_array' => true, 'no_useless_else' => true,
'constant_case' => true, 'no_unneeded_curly_braces' => true,
'lowercase_keywords' => true, 'no_empty_comment' => true,
'lowercase_static_reference' => true, 'no_blank_lines_after_class_opening' => true,
]) 'whitespace_after_comma_in_array' => true,
'trim_array_spaces' => true,
'no_whitespace_before_comma_in_array' => true,
'constant_case' => true,
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
])
->setFinder($finder); ->setFinder($finder);
+11 -11
View File
@@ -51,7 +51,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -250,7 +250,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -449,7 +449,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -648,7 +648,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -847,7 +847,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1046,7 +1046,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1245,7 +1245,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1444,7 +1444,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1643,7 +1643,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1842,7 +1842,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -2041,7 +2041,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class, 'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class, 'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class, 'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class, 'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class, 'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
-61
View File
@@ -1,61 +0,0 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use App\Models\Setting;
use App\Models\UserSettings;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\CreatesNewUsers;
class CreateNewUser implements CreatesNewUsers
{
use PasswordValidationRules;
/**
* Validate and create a newly registered user.
*
* @param array $input
* @return \App\Models\User
*/
public function create(array $input)
{
$settings = Setting::whereIn('name', ['storage_default', 'registration'])
->pluck('value', 'name');
// Check if account registration is enabled
if (! intval($settings['registration'])) {
abort(401);
}
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(User::class),
],
'password' => $this->passwordRules(),
])->validate();
$user = User::create([
'email' => $input['email'],
'password' => bcrypt($input['password']),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $input['name'],
'storage_capacity' => $settings['storage_default'],
]);
UserSettings::reguard();
return $user;
}
}
@@ -0,0 +1,79 @@
<?php
namespace App\Actions\Fortify;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Setting;
use App\Models\UserSettings;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Validation\Rule;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Auth\StatefulGuard;
class CreateNewUserAction extends Controller
{
use PasswordValidationRules;
public function __construct(
protected StatefulGuard $guard
) {}
/**
* Validate and create a newly registered user.
*/
public function __invoke(Request $request): Response
{
$settings = Setting::whereIn('name', [
'storage_default', 'registration'
])
->pluck('value', 'name');
// Check if account registration is enabled
if (!intval($settings['registration'])) {
abort(401);
}
Validator::make($request->all(), [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(User::class),
],
'password' => $this->passwordRules(),
])->validate();
$user = User::create([
'email' => $request->email,
'password' => bcrypt($request->password),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $request->name,
'storage_capacity' => $settings['storage_default'],
]);
if (!get_setting('user_verification')) {
$user->markEmailAsVerified();
}
UserSettings::reguard();
event(new Registered($user));
if (!get_setting('user_verification')) {
$this->guard->login($user);
}
return response('User registered successfully', 201);
}
}
@@ -90,6 +90,7 @@ class SetupDevEnvironment extends Command
'role' => 'admin', 'role' => 'admin',
'email' => 'howdy@hi5ve.digital', 'email' => 'howdy@hi5ve.digital',
'password' => bcrypt('vuefilemanager'), 'password' => bcrypt('vuefilemanager'),
'email_verified_at' => now(),
]); ]);
$user $user
@@ -130,6 +131,7 @@ class SetupDevEnvironment extends Command
'role' => 'user', 'role' => 'user',
'email' => $this->faker->email, 'email' => $this->faker->email,
'password' => bcrypt('vuefilemanager'), 'password' => bcrypt('vuefilemanager'),
'email_verified_at' => now(),
]); ]);
$newbie $newbie
@@ -791,6 +793,10 @@ class SetupDevEnvironment extends Command
'name' => 'registration', 'name' => 'registration',
'value' => 1, 'value' => 1,
], ],
[
'name' => 'user_verification',
'value' => 1,
],
[ [
'name' => 'payments_active', 'name' => 'payments_active',
'value' => 1, 'value' => 1,
@@ -112,6 +112,10 @@ class SetupProdEnvironment extends Command
'name' => 'registration', 'name' => 'registration',
'value' => 0, 'value' => 0,
], ],
[
'name' => 'user_verification',
'value' => 1,
],
[ [
'name' => 'storage_limitation', 'name' => 'storage_limitation',
'value' => 1, 'value' => 1,
@@ -181,6 +185,8 @@ class SetupProdEnvironment extends Command
'role' => 'admin', 'role' => 'admin',
'email' => 'howdy@hi5ve.digital', 'email' => 'howdy@hi5ve.digital',
'password' => bcrypt('vuefilemanager'), 'password' => bcrypt('vuefilemanager'),
'email_verified_at' => now(),
]); ]);
$user $user
+4
View File
@@ -41,6 +41,10 @@ class Kernel extends ConsoleKernel
} }
})->everySixHours(); })->everySixHours();
$schedule->call(function () use ($scheduler) {
$scheduler->delete_unverified_users();
})->daily();
// Run queue jobs every minute // Run queue jobs every minute
$schedule->command('queue:work --stop-when-empty') $schedule->command('queue:work --stop-when-empty')
->everyMinute() ->everyMinute()
@@ -180,6 +180,7 @@ class UserController extends Controller
'role' => $request->role, 'role' => $request->role,
'email' => $request->email, 'email' => $request->email,
'password' => bcrypt($request->password), 'password' => bcrypt($request->password),
'email_verified_at' => now(),
]); ]);
UserSettings::unguard(); UserSettings::unguard();
@@ -412,6 +412,7 @@ class SetupWizardController extends Controller
'role' => 'admin', 'role' => 'admin',
'email' => $request->email, 'email' => $request->email,
'password' => bcrypt($request->password), 'password' => bcrypt($request->password),
'email_verified_at' => now(),
]); ]);
$user $user
@@ -26,6 +26,7 @@ class AuthController extends Controller
return [ return [
'name' => $user->settings->name, 'name' => $user->settings->name,
'avatar' => $user->settings->avatar, 'avatar' => $user->settings->avatar,
'verified' => $user->email_verified_at ? true : false
]; ];
} }
} }
@@ -1,10 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Lang; use Illuminate\Support\Facades\Lang;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller class ForgotPasswordController extends Controller
{ {
@@ -1,16 +1,23 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\User;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Services\DemoService; use App\Services\DemoService;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource; use App\Http\Resources\UserResource;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use App\Http\Resources\InvoiceCollection; use App\Http\Resources\InvoiceCollection;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use App\Http\Resources\UserStorageResource; use App\Http\Resources\UserStorageResource;
use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\User\UpdateUserPasswordRequest; use App\Http\Requests\User\UpdateUserPasswordRequest;
use App\Http\Requests\User\UserCreateAccessTokenRequest;
use Illuminate\Support\Str;
use Laravel\Sanctum\PersonalAccessToken;
class AccountController extends Controller class AccountController extends Controller
{ {
@@ -70,8 +77,8 @@ class AccountController extends Controller
// TODO: pridat validator do requestu // TODO: pridat validator do requestu
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'avatar' => 'sometimes|file', 'avatar' => 'sometimes|file',
'name' => 'string', 'name' => 'string',
'value' => 'string', 'value' => 'string',
]); ]);
// Return error // Return error
@@ -125,4 +132,75 @@ class AccountController extends Controller
return response('Changed!', 204); return response('Changed!', 204);
} }
/**
* Get all user tokens
*/
public function tokens(): Response
{
return response(
Auth::user()->tokens()->get(),
200
);
}
public function create_token(UserCreateAccessTokenRequest $request): Response
{
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 201, [
"name" => "token",
"token" => Str::random(40),
"abilities" => '["*"]',
"tokenable_id" => Str::uuid(),
"updated_at" => now(),
"created_at" => now(),
"id" => Str::random(40),
]);
$token = Auth::user()->createToken($request->input('name'));
return response($token, 201);
}
public function revoke_token(PersonalAccessToken $token): Response
{
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Deleted!');
if (Auth::id() !== $token->tokenable_id) {
return response('Unauthorized', 401);
}
$token->delete();
return response('Deleted!', 204);
}
public function email_verification(string $id, Request $request): RedirectResponse|Response
{
if (!$request->hasValidSignature()) {
return response("Invalid or expired url provided.", 401);
}
$user = User::find($id);
if (!$user->hasVerifiedEmail()) {
$user->markEmailAsVerified();
}
return redirect()->to('/successfully-verified');
}
public function resend_verification_email(Request $request): Response
{
$user = User::whereEmail($request->input('email'))->first();
if ($user->hasVerifiedEmail()) {
return response("Email was already verified.", 204);
}
$user->sendEmailVerificationNotification();
return response("Email verification link sent to your email", 204);
}
} }
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests\User;
use Illuminate\Foundation\Http\FormRequest;
class UserCreateAccessTokenRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|string|min:3',
];
}
}
+2 -1
View File
@@ -13,8 +13,9 @@ use Illuminate\Support\Facades\Storage;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable class User extends Authenticatable implements MustVerifyEmail
{ {
use Notifiable, Billable, Sortable, HasFactory, HasApiTokens; use Notifiable, Billable, Sortable, HasFactory, HasApiTokens;
+1 -2
View File
@@ -3,7 +3,7 @@ namespace App\Providers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Laravel\Fortify\Fortify; use Laravel\Fortify\Fortify;
use App\Actions\Fortify\CreateNewUser; use App\Actions\Fortify\CreateNewUserAction;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Cache\RateLimiting\Limit;
use App\Actions\Fortify\ResetUserPassword; use App\Actions\Fortify\ResetUserPassword;
@@ -29,7 +29,6 @@ class FortifyServiceProvider extends ServiceProvider
*/ */
public function boot() public function boot()
{ {
Fortify::createUsersUsing(CreateNewUser::class);
Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class); Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
Fortify::updateUserPasswordsUsing(UpdateUserPassword::class); Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
Fortify::resetUserPasswordsUsing(ResetUserPassword::class); Fortify::resetUserPasswordsUsing(ResetUserPassword::class);
+1 -11
View File
@@ -13,7 +13,7 @@ class RouteServiceProvider extends ServiceProvider
* *
* @var string * @var string
*/ */
protected $namespace = 'App\Http\Controllers'; protected $namespace = null;
/** /**
* The path to the "home" route for your application. * The path to the "home" route for your application.
@@ -22,16 +22,6 @@ class RouteServiceProvider extends ServiceProvider
*/ */
public const HOME = '/home'; public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
parent::boot();
}
/** /**
* Define the routes for the application. * Define the routes for the application.
* *
+12
View File
@@ -3,6 +3,7 @@ namespace App\Services;
use Carbon\Carbon; use Carbon\Carbon;
use App\Models\Zip; use App\Models\Zip;
use App\Models\User;
use App\Models\Share; use App\Models\Share;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@@ -74,4 +75,15 @@ class SchedulerService
} }
}); });
} }
/**
* Delete unverified users older than 30 days
*/
public function delete_unverified_users(): void
{
User::where('created_at', '<=', now()->subDays(30)->toDateString())
->where('email_verified_at', null)
->get()
->each(fn ($user) => $user->delete());
}
} }
+19 -19
View File
@@ -10,39 +10,39 @@
"require": { "require": {
"php": "^8.0", "php": "^8.0",
"ext-json": "*", "ext-json": "*",
"brianium/paratest": "^6.2", "brianium/paratest": "^6.3",
"cartalyst/stripe-laravel": "^13.1", "cartalyst/stripe-laravel": "^13.1",
"doctrine/dbal": "^2.12.1", "doctrine/dbal": "^2.13.2",
"fideloper/proxy": "^4.4.1", "fideloper/proxy": "^4.4.1",
"fruitcake/laravel-cors": "^2.0.3", "fruitcake/laravel-cors": "^2.0.4",
"gabrielelana/byte-units": "^0.5.0", "gabrielelana/byte-units": "^0.5.0",
"guzzlehttp/guzzle": "^7.2.0", "guzzlehttp/guzzle": "^7.3.0",
"intervention/image": "^2.5.1", "intervention/image": "^2.6.0",
"jaybizzle/laravel-crawler-detect": "^1.2", "jaybizzle/laravel-crawler-detect": "^1.2",
"kyslik/column-sortable": "^6.4", "kyslik/column-sortable": "^6.4.1",
"laravel/cashier": "^12.9.1", "laravel/cashier": "^12.15.0",
"laravel/fortify": "^1.7.7", "laravel/fortify": "^1.7.14",
"laravel/framework": "^8.30.1", "laravel/framework": "^8.50.0",
"laravel/sanctum": "^2.9", "laravel/sanctum": "^2.11.2",
"laravel/tinker": "^2.6.1", "laravel/tinker": "^2.6.1",
"laravel/ui": "^3.2.0", "laravel/ui": "^3.2.0",
"league/flysystem-aws-s3-v3": "^1.0.29", "league/flysystem-aws-s3-v3": "^1.0.29",
"league/flysystem-cached-adapter": "^1.1.0", "league/flysystem-cached-adapter": "^1.1.0",
"madnest/madzipper": "^1.1.0", "madnest/madzipper": "^1.1.0",
"spatie/laravel-backup": "^6.15", "spatie/laravel-backup": "^6.16.1",
"spatie/laravel-tail": "^4.3", "spatie/laravel-tail": "^4.3.3",
"teamtnt/laravel-scout-tntsearch-driver": "^11.1.0", "teamtnt/laravel-scout-tntsearch-driver": "^11.5.0.0",
"vimeo/psalm": "^4.7" "vimeo/psalm": "^4.8.1"
}, },
"require-dev": { "require-dev": {
"ext-json": "*", "ext-json": "*",
"friendsofphp/php-cs-fixer": "^3.0", "friendsofphp/php-cs-fixer": "^3.0",
"barryvdh/laravel-ide-helper": "^2.9", "barryvdh/laravel-ide-helper": "^2.10",
"facade/ignition": "^2.5.14", "facade/ignition": "^2.11.0",
"fakerphp/faker": "^1.14.1", "fakerphp/faker": "^1.15.0",
"mockery/mockery": "^1.4.3", "mockery/mockery": "^1.4.3",
"nunomaduro/collision": "^5.3.0", "nunomaduro/collision": "^5.5.0",
"phpunit/phpunit": "^9.5.2" "phpunit/phpunit": "^9.5.6"
}, },
"config": { "config": {
"optimize-autoloader": true, "optimize-autoloader": true,
Generated
-11939
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -131,7 +131,7 @@ return [
*/ */
'features' => [ 'features' => [
Features::registration(), // Features::registration(),
//Features::resetPasswords(), //Features::resetPasswords(),
// Features::emailVerification(), // Features::emailVerification(),
Features::updateProfileInformation(), Features::updateProfileInformation(),
+13
View File
@@ -291,6 +291,8 @@ return [
'admin_settings.email.username_plac' => 'Type your mail username', 'admin_settings.email.username_plac' => 'Type your mail username',
'admin_settings.others.allow_registration' => 'Allow User Registration', 'admin_settings.others.allow_registration' => 'Allow User Registration',
'admin_settings.others.allow_registration_help' => 'You can disable public registration for new users. You will still able to <br/>create new users in administration panel.', 'admin_settings.others.allow_registration_help' => 'You can disable public registration for new users. You will still able to <br/>create new users in administration panel.',
'admin_settings.others.allow_user_verification' => 'Allow User Email Verification',
'admin_settings.others.allow_user_verification_help' => 'Turn on, if you want to allow user email verification.',
'admin_settings.others.cache_clear' => 'Clear Cache', 'admin_settings.others.cache_clear' => 'Clear Cache',
'admin_settings.others.cache_disclaimer' => 'Did you change anything in your .env file or change your Stripe credentials? Then clear your cache.', 'admin_settings.others.cache_disclaimer' => 'Did you change anything in your .env file or change your Stripe credentials? Then clear your cache.',
'admin_settings.others.contact_email' => 'Contact Email', 'admin_settings.others.contact_email' => 'Contact Email',
@@ -396,6 +398,7 @@ return [
'menu.latest' => 'Recent Uploads', 'menu.latest' => 'Recent Uploads',
'menu.logout' => 'Log Out', 'menu.logout' => 'Log Out',
'menu.password' => 'Password', 'menu.password' => 'Password',
'menu.token' => 'Access Token',
'menu.profile' => 'Profile Settings', 'menu.profile' => 'Profile Settings',
'menu.settings' => 'Settings', 'menu.settings' => 'Settings',
'menu.shared' => 'Shared Files', 'menu.shared' => 'Shared Files',
@@ -472,6 +475,13 @@ return [
'page_sign_in.placeholder_password' => 'Type your password', 'page_sign_in.placeholder_password' => 'Type your password',
'page_sign_in.subtitle' => 'Confirm you by your password', 'page_sign_in.subtitle' => 'Confirm you by your password',
'page_sign_in.title' => 'Are You {name}?', 'page_sign_in.title' => 'Are You {name}?',
'page_not_verified.subtitle' => 'Your account is not verified. Before login, verify your account please.',
'page_not_verified.resend_text' => 'Do you want resend verification email?',
'page_not_verified.resend_button' => 'Resend verification email.',
'page_email_successfully_verified.title' => 'Your account was successfully verified!',
'page_email_successfully_verified.subtitle' => 'Now you can log in.',
'page_email_successfully_send.title' => 'Verification email was successfully send!',
'page_email_successfully_send.subtitle' => 'Check your email address where the email was send.',
'popup_create_folder.folder_default_name' => 'New Folder', 'popup_create_folder.folder_default_name' => 'New Folder',
'popup_create_folder.label' => 'Type Name', 'popup_create_folder.label' => 'Type Name',
'popup_create_folder.placeholder' => 'Type your name', 'popup_create_folder.placeholder' => 'Type your name',
@@ -539,6 +549,7 @@ return [
'routes_title.profile' => 'My Profile', 'routes_title.profile' => 'My Profile',
'routes_title.settings' => 'Settings', 'routes_title.settings' => 'Settings',
'routes_title.settings_password' => 'Change Password', 'routes_title.settings_password' => 'Change Password',
'routes_title.token' => 'Access Token',
'routes_title.settings_storage' => 'Storage', 'routes_title.settings_storage' => 'Storage',
'routes_title.user_create' => 'Create User', 'routes_title.user_create' => 'Create User',
'routes_title.users_delete' => 'Delete User', 'routes_title.users_delete' => 'Delete User',
@@ -614,6 +625,7 @@ return [
'user_box_role.title' => 'Change User Role', 'user_box_role.title' => 'Change User Role',
'user_box_storage.description' => "Change user storage capacity by input bellow. You have to type only number e.g. value '5' means, user will have 5GB of storage capacity.", 'user_box_storage.description' => "Change user storage capacity by input bellow. You have to type only number e.g. value '5' means, user will have 5GB of storage capacity.",
'user_box_storage.title' => 'Change User Storage Capacity', 'user_box_storage.title' => 'Change User Storage Capacity',
'user_token.title' => 'Access Tokens',
'user_password.title' => 'Change Your Password', 'user_password.title' => 'Change Your Password',
'user_settings.address' => 'Address', 'user_settings.address' => 'Address',
'user_settings.address_plac' => 'Type your billing address', 'user_settings.address_plac' => 'Type your billing address',
@@ -674,5 +686,6 @@ return [
'app_touch_icon' => 'App Touch Icon', 'app_touch_icon' => 'App Touch Icon',
'app_touch_icon_description' => 'If user store bookmark on his phone screen, this icon appear in app thumbnail. Preferred size is 156x156', 'app_touch_icon_description' => 'If user store bookmark on his phone screen, this icon appear in app thumbnail. Preferred size is 156x156',
'select_search_placeholder' => 'Search in list...', 'select_search_placeholder' => 'Search in list...',
'go_home' => 'Go to the homepage',
], ],
]; ];
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePersonalAccessTokensTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('personal_access_tokens', function (Blueprint $table) {
$table->bigIncrements('id');
$table->uuidMorphs('tokenable');
$table->string('name');
$table->string('token', 64)->unique();
$table->text('abilities')->nullable();
$table->timestamp('last_used_at')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('personal_access_tokens');
}
}
+100 -74
View File
@@ -1,76 +1,102 @@
{ {
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js?id=59d8a92b461069b2d8ef", "/js/main.js": "/js/main.js",
"/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~5f8db287.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~5f8db287.js?id=da9787176357b5821f88", "/css/app.css": "/css/app.css",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=dfc34718027ffe49c095", "/chunks/admin.js": "/chunks/admin.js?id=baf8a45b3c1d04f09229",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=78490a539df6de210807", "/chunks/admin-account.js": "/chunks/admin-account.js?id=61bd29aac87199e45174",
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=6db60bf5154ed8946420", "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js?id=d21b5946c88a87e9099d",
"/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js?id=78d379b1b282c3ad5c0c", "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a7b1c983.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a7b1c983.js?id=b80fc9fc5b08a9c60e2e",
"/chunks/files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared/file-browser.js?id=c6362b7ef3e9b06d3af7", "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js": "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js?id=b26eff2899df7f85229d",
"/chunks/not-found.js": "/chunks/not-found.js?id=3278798d98bd131aa379", "/chunks/admin~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=146db62ff2aa25c39386",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=dbfcbb7580f69474cc13", "/chunks/admin~chunks/files~chunks/settings~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared/file-browser.js?id=e23621e57bab3e9e349a",
"/vendors~chunks/platform~chunks/shared.js": "/vendors~chunks/platform~chunks/shared.js?id=16e4937273d68f83c37f", "/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=4da2e03f6f01c274a7cc",
"/js/main.js": "/js/main.js?id=1ced39466ba657ce3e16", "/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=7611512975ed49edb61f",
"/css/app.css": "/css/app.css?id=a8f94d0c5a6f4a1185b1", "/chunks/app-appearance.js": "/chunks/app-appearance.js?id=b709bf1d7c3cd24f9529",
"/chunks/admin.js": "/chunks/admin.js?id=c23b5f524dd386d797e5", "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=075ff381293e1a20d167",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=a73cbe625776f823eb4e", "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=5f27527c258dada4aeb9",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=1542b65e6edae59f17aa", "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js?id=b6c9565875974d8c350c",
"/chunks/app-billings.js": "/chunks/app-billings.js?id=15318dba11818d6ec888", "/chunks/app-billings.js": "/chunks/app-billings.js?id=b23ac97d9e65beff5fc6",
"/chunks/app-email.js": "/chunks/app-email.js?id=b023f73218dda4abd604", "/chunks/app-email.js": "/chunks/app-email.js?id=35afede5ea121718e2cc",
"/chunks/app-index.js": "/chunks/app-index.js?id=08b7878a3fcd087c23b3", "/chunks/app-index.js": "/chunks/app-index.js?id=0d8a74f6041001c36ab3",
"/chunks/app-language.js": "/chunks/app-language.js?id=ad245f54b99ec8979f9e", "/chunks/app-language.js": "/chunks/app-language.js?id=8f77e8eebf32943fdf4b",
"/chunks/app-others.js": "/chunks/app-others.js?id=256f8a571e9535774643", "/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pag~824d674f.js": "/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pag~824d674f.js?id=2551061f37c2a8056921",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=b57048c4667935499d3e", "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~934b6779.js": "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~934b6779.js?id=cecfc7ab2626eb4e988f",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=c6f95c5841c36de9d030", "/chunks/app-others.js": "/chunks/app-others.js?id=a16de82f2298df235166",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=c0898f22c12ee8a56916", "/chunks/app-payments.js": "/chunks/app-payments.js?id=245920077be074208693",
"/chunks/billings-detail.js": "/chunks/billings-detail.js?id=622b5dca6425427f7ea0", "/chunks/app-settings.js": "/chunks/app-settings.js?id=d57e806c59d1aef2eb3a",
"/chunks/contact-us.js": "/chunks/contact-us.js?id=9415844c1627d307d951", "/chunks/app-setup.js": "/chunks/app-setup.js?id=526bb7b757956f6c70c3",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=ad4ac6e1e79602cbb929", "/chunks/billings-detail.js": "/chunks/billings-detail.js?id=3805f23ba0a474ce7b4e",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=db35f7a287b6407fc4af", "/chunks/contact-us.js": "/chunks/contact-us.js?id=67b977184f0744593de9",
"/chunks/database.js": "/chunks/database.js?id=669e7798dcc456197402", "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js": "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js?id=2a8def187ec322eb760e",
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=c53bdc4a88bf3f2e5434", "/chunks/create-new-password.js": "/chunks/create-new-password.js?id=72d02c781aa8e6295069",
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=52cde925b9687de4c29a", "/chunks/dashboard.js": "/chunks/dashboard.js?id=a7aef88def02bf2fec08",
"/chunks/files.js": "/chunks/files.js?id=0fa05841bb3895d2d5e5", "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js": "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js?id=1027aa9c1e090b196d29",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=0708aa3e04e6ed11c91d", "/chunks/database.js": "/chunks/database.js?id=27ab279a8b380da7a0e8",
"/chunks/homepage.js": "/chunks/homepage.js?id=44552c231f6791295903", "/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=1141f8e183483da82e8a",
"/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=922ecf4d086b03abfc04", "/chunks/email-verified.js": "/chunks/email-verified.js?id=60a7eabffc13b2fe48e0",
"/chunks/invoices.js": "/chunks/invoices.js?id=85b17b9371f4df37c00a", "/chunks/environment-setup.js": "/chunks/environment-setup.js?id=3e657a9476a8596396b3",
"/chunks/page-edit.js": "/chunks/page-edit.js?id=7e04b66e4bccb47e7f3f", "/chunks/files.js": "/chunks/files.js?id=54c6dddb471986e202f3",
"/chunks/pages.js": "/chunks/pages.js?id=76341f611821d93f1696", "/chunks/files~chunks/platform~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared/file-browser.js?id=b5e21d1b7386c6551aa2",
"/chunks/plan.js": "/chunks/plan.js?id=d44c79f456ece7ed20ba", "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=3b96cba1e5482e4c33d4",
"/chunks/plan-create.js": "/chunks/plan-create.js?id=f14b6474cc894199f962", "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js?id=48f4f2c0aa3064162ad9",
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=82741fb5261f08150514", "/chunks/files~chunks/settings-subscription~chunks/shared/file-browser~chunks/user-subscription.js": "/chunks/files~chunks/settings-subscription~chunks/shared/file-browser~chunks/user-subscription.js?id=1b96ff16168a192ea787",
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=8e901b7cce8fabec9042", "/chunks/files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared/file-browser.js?id=221f9578098058fc4c4a",
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=700253b16769e8270c73", "/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js?id=a6be7116bbdadfb8b1cc",
"/chunks/plans.js": "/chunks/plans.js?id=dd7e195bb66f245cebbd", "/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=96019e230f0c5b59478a",
"/chunks/platform.js": "/chunks/platform.js?id=f7073145d3e27be2c880", "/chunks/homepage.js": "/chunks/homepage.js?id=5a299216398f59a4947b",
"/chunks/profile.js": "/chunks/profile.js?id=bd661b08717158c5af9e", "/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=12cbea54eb6f5b94606c",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=333af0b6deb880990f39", "/chunks/invoices.js": "/chunks/invoices.js?id=35179ba2b74cdaf74492",
"/chunks/settings.js": "/chunks/settings.js?id=7726657c717fa7650d10", "/chunks/not-found.js": "/chunks/not-found.js?id=3f0c127b00d113541acc",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=08cc16a560d5cc9b25b7", "/chunks/page-edit.js": "/chunks/page-edit.js?id=761c916a5efdee5ffddd",
"/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=5ef85da047b11e2f1a21", "/chunks/pages.js": "/chunks/pages.js?id=7b3c7ee8c586e73fe65a",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=19b5f0850ba9d6aa049a", "/chunks/plan.js": "/chunks/plan.js?id=c4cc3da1bedaa9139087",
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=7cfbeae7706827cd858e", "/chunks/plan-create.js": "/chunks/plan-create.js?id=2a672b390de82eb8cef6",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=c4210c768fddec3ccf9f", "/chunks/plan-delete.js": "/chunks/plan-delete.js?id=f00946b7df419813f099",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=a7c2580bf4280ca3c76b", "/chunks/plan-settings.js": "/chunks/plan-settings.js?id=dbc08f8cdc23900ef40a",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=d60972a2216523642850", "/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=8c4b655b9286e06894c5",
"/chunks/shared.js": "/chunks/shared.js?id=e72e37ffad23a1ea2a8e", "/chunks/plans.js": "/chunks/plans.js?id=2b26173a02ed9f86e875",
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=86820a408438c3513b20", "/chunks/platform.js": "/chunks/platform.js?id=5d4ed2751b809310e23b",
"/chunks/shared/file-browser.js": "/chunks/shared/file-browser.js?id=74d47dd07002086ba1de", "/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=be3d7cf51585313cf53b",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=03fb36b0d38a3218221f", "/chunks/profile.js": "/chunks/profile.js?id=41b536880e846017d2d0",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=6a401ac37ac49a729e04", "/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=93ffe6eca4dcafbe8234",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=f26bca8e48b5cfb69f30", "/chunks/purchase-code.js": "/chunks/purchase-code.js?id=b35e751cdc1946a4fb60",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=cd44b6cf8631f690a75d", "/chunks/settings.js": "/chunks/settings.js?id=84f0716dc70fb1ab5de5",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=4cdc01a909e277284b1d", "/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=7404a1125aee6014b72a",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=418145ac6ba4a4ba2e4a", "/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=094eb70eb2fa6b7c8dd2",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=98181a3cdcc9cc6e55c2", "/chunks/settings-password.js": "/chunks/settings-password.js?id=31e3562551bfc4907b5b",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=2eee581bb1d2586b9249", "/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=47ad97b554fcc1564685",
"/chunks/user.js": "/chunks/user.js?id=290b4b63ed5a10a5ca3c", "/chunks/settings-storage.js": "/chunks/settings-storage.js?id=b06d4a1d504b2a6cbeed",
"/chunks/user-create.js": "/chunks/user-create.js?id=2bfca881534622e3aa5f", "/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=1bffa4ae7d545af08355",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=dc708437ba1e5ebc0a0d", "/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=41d3478184ec24644a1c",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=70bac25962505a1eb468", "/chunks/shared.js": "/chunks/shared.js?id=7524b7a783d4aed23794",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=5f5cee4fbc2d5f122114", "/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=bfdf9bb904d354bdcbd1",
"/chunks/user-password.js": "/chunks/user-password.js?id=3214eb9dadcbeb1e685f", "/chunks/shared/file-browser.js": "/chunks/shared/file-browser.js?id=0f6c34512740fca7e007",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=bfecceeadc0a2a0faf64", "/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=7886247bb35deada28a2",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=724f2551c1945e1071e2", "/chunks/sign-in.js": "/chunks/sign-in.js?id=fb2de6069de0669b0e02",
"/chunks/users.js": "/chunks/users.js?id=bb902543025cdf7a79f2" "/chunks/sign-up.js": "/chunks/sign-up.js?id=b30b10ca09b115efc6ca",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=b2bc73016f0811f6838d",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=e12081daec0f6ea047ab",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=a09dc140a3914fb64a1a",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=3fe276a31a66ba244d10",
"/chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/upgrade-billing~chunks/upgrade-plan.js?id=43888143d0a6afe67d7a",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=5979a154f760a992e617",
"/chunks/user.js": "/chunks/user.js?id=41076be9126702330159",
"/chunks/user-create.js": "/chunks/user-create.js?id=c65b1718b207ae7b678e",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=ecebc7e50b64744420c3",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=7ae038f6b4a4683c5bdb",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=1395c30e08946026fbc4",
"/chunks/user-password.js": "/chunks/user-password.js?id=f5fa3532fb7f4f5f2707",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=e19c7dee4ef5eb38a075",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=c6ec1b7215530cfdbceb",
"/chunks/users.js": "/chunks/users.js?id=71de2e012c4c566a8ec3",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js?id=5007f400f6b506ab23f4",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5e36d91.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5e36d91.js?id=2b11dd8f37c3c2421f2f",
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js?id=9d10953d3b088324dfe3",
"/vendors~chunks/platform~chunks/shared.js": "/vendors~chunks/platform~chunks/shared.js?id=7d09e0b0658e140a7ffa",
"/chunks/sign-up.975b48abd4874d2d4701.hot-update.js": "/chunks/sign-up.975b48abd4874d2d4701.hot-update.js",
"/chunks/email-verified.51f60246090cc58fa13c.hot-update.js": "/chunks/email-verified.51f60246090cc58fa13c.hot-update.js",
"/chunks/email-verified.793fadba4eec7baa97de.hot-update.js": "/chunks/email-verified.793fadba4eec7baa97de.hot-update.js",
"/chunks/email-verified.e34f4263892542caa617.hot-update.js": "/chunks/email-verified.e34f4263892542caa617.hot-update.js",
"/chunks/email-verified.b1f4240b7eb52aea68c7.hot-update.js": "/chunks/email-verified.b1f4240b7eb52aea68c7.hot-update.js",
"/chunks/app-others.a134296fc107b0a807e3.hot-update.js": "/chunks/app-others.a134296fc107b0a807e3.hot-update.js",
"/chunks/sign-up.e3dc2f848ca66fd4b8ea.hot-update.js": "/chunks/sign-up.e3dc2f848ca66fd4b8ea.hot-update.js"
} }
@@ -0,0 +1,44 @@
<template>
<div class="select-box" :class="[isClicked ? 'bg-theme' : 'is-deactive'] ">
<CheckIcon v-if="isClicked" class="icon" size="17" />
</div>
</template>
<script>
import { CheckIcon } from 'vue-feather-icons'
export default {
name: 'CheckBox',
props: [ 'isClicked' ],
components: { CheckIcon }
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
.select-box {
min-width: 20px;
min-height: 20px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
.icon {
stroke: white;
}
}
.is-deactive {
background-color: darken($light_background, 5%);
}
@media (prefers-color-scheme: dark) {
.is-deactive {
background-color: lighten($dark_mode_foreground, 10%);
}
}
</style>
@@ -7,11 +7,7 @@
<div class="icon-item"> <div class="icon-item">
<!-- MultiSelecting for the mobile version --> <!-- MultiSelecting for the mobile version -->
<div :class="{'check-select-folder' : this.item.type === 'folder', 'check-select' : this.item.type !== 'folder'}" v-if="mobileMultiSelect"> <CheckBox v-if="mobileMultiSelect" :is-clicked="isClicked" class="check-box"/>
<div class="select-box" :class="{'select-box-active' : isClicked } ">
<CheckIcon v-if="isClicked" class="icon" size="17" />
</div>
</div>
<!--If is file or image, then link item--> <!--If is file or image, then link item-->
<span v-if="isFile || (isImage && !item.thumbnail)" class="file-icon-text text-theme"> <span v-if="isFile || (isImage && !item.thumbnail)" class="file-icon-text text-theme">
@@ -65,8 +61,9 @@
</template> </template>
<script> <script>
import {LinkIcon, UserPlusIcon, CheckIcon, MoreHorizontalIcon} from 'vue-feather-icons' import {LinkIcon, UserPlusIcon, MoreHorizontalIcon} from 'vue-feather-icons'
import FolderIcon from '@/components/FilesView/FolderIcon' import FolderIcon from '@/components/FilesView/FolderIcon'
import CheckBox from '@/components/FilesView/CheckBox'
import {debounce} from 'lodash' import {debounce} from 'lodash'
import {mapGetters} from 'vuex' import {mapGetters} from 'vuex'
import {events} from '@/bus' import {events} from '@/bus'
@@ -77,9 +74,9 @@ export default {
components: { components: {
MoreHorizontalIcon, MoreHorizontalIcon,
UserPlusIcon, UserPlusIcon,
CheckIcon,
LinkIcon,
FolderIcon, FolderIcon,
CheckBox,
LinkIcon,
}, },
computed: { computed: {
...mapGetters([ ...mapGetters([
@@ -308,7 +305,7 @@ export default {
@import '@assets/vuefilemanager/_variables'; @import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins'; @import '@assets/vuefilemanager/_mixins';
.check-select { .check-box {
margin-right: 10px; margin-right: 10px;
margin-left: 3px; margin-left: 3px;
position: absolute; position: absolute;
@@ -317,35 +314,6 @@ export default {
left: 0px; left: 0px;
} }
.check-select-folder {
margin-right: 10px;
margin-left: 3px;
position: absolute;
top: 8px;
z-index: 5;
left: 10px;
}
.select-box {
width: 20px;
height: 20px;
background-color: $light_background;
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
box-shadow: 0 3px 15px 2px hsla(220, 36%, 16%, 0.05);
}
.select-box-active {
background-color: $theme;
.icon {
stroke: white;
}
}
.show-actions { .show-actions {
cursor: pointer; cursor: pointer;
padding: 4px 26px; padding: 4px 26px;
@@ -582,18 +550,6 @@ export default {
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.select-box {
background-color: lighten($dark_mode_foreground, 10%);
}
.select-box-active {
background-color: lighten($theme, 5%);
.icon {
stroke: white;
}
}
.file-wrapper { .file-wrapper {
.icon-item { .icon-item {
@@ -10,11 +10,7 @@
> >
<!-- MultiSelecting for the mobile version --> <!-- MultiSelecting for the mobile version -->
<transition name="slide-from-left"> <transition name="slide-from-left">
<div class="check-select" v-if="mobileMultiSelect"> <CheckBox v-if="mobileMultiSelect" :is-clicked="isClicked" class="check-box"/>
<div class="select-box" :class="{'select-box-active' : isClicked } ">
<CheckIcon v-if="isClicked" class="icon" size="17" />
</div>
</div>
</transition> </transition>
<!--Thumbnail for item--> <!--Thumbnail for item-->
@@ -72,8 +68,9 @@
</template> </template>
<script> <script>
import {LinkIcon, UserPlusIcon, CheckIcon, MoreVerticalIcon} from 'vue-feather-icons' import {LinkIcon, UserPlusIcon, MoreVerticalIcon} from 'vue-feather-icons'
import FolderIcon from '@/components/FilesView/FolderIcon' import FolderIcon from '@/components/FilesView/FolderIcon'
import CheckBox from '@/components/FilesView/CheckBox'
import {debounce} from 'lodash' import {debounce} from 'lodash'
import {mapGetters} from 'vuex' import {mapGetters} from 'vuex'
import {events} from '@/bus' import {events} from '@/bus'
@@ -87,7 +84,7 @@ export default {
MoreVerticalIcon, MoreVerticalIcon,
UserPlusIcon, UserPlusIcon,
FolderIcon, FolderIcon,
CheckIcon, CheckBox,
LinkIcon, LinkIcon,
}, },
computed: { computed: {
@@ -335,28 +332,9 @@ export default {
transform: translateX(100%); transform: translateX(100%);
} }
.check-box {
.check-select {
margin-right: 15px; margin-right: 15px;
margin-left: 6px; margin-left: 6px;
.select-box {
width: 20px;
height: 20px;
background-color: darken($light_background, 5%);
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
}
.select-box-active {
background-color: $theme;
.icon {
stroke: white;
}
}
} }
.file-wrapper { .file-wrapper {
@@ -543,20 +521,6 @@ export default {
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.check-select {
.select-box {
background-color: lighten($dark_mode_foreground, 10%);
}
.select-box-active {
background-color: $theme;
.icon {
stroke: white;
}
}
}
.file-wrapper { .file-wrapper {
.icon-item { .icon-item {
+28
View File
@@ -334,6 +334,24 @@ const routesShared = [
}, },
] ]
const routesAuth = [ const routesAuth = [
{
name: 'SuccessfullyVerified',
path: '/successfully-verified',
component: () =>
import(/* webpackChunkName: "chunks/email-verified" */ './views/Auth/SuccessfullyEmailVerified'),
meta: {
requiresAuth: false
},
},
{
name: 'SuccessfullySend',
path: '/successfully-send',
component: () =>
import(/* webpackChunkName: "chunks/email-verified" */ './views/Auth/SuccessfullySendEmail'),
meta: {
requiresAuth: false
},
},
{ {
name: 'SignIn', name: 'SignIn',
path: '/sign-in', path: '/sign-in',
@@ -416,6 +434,16 @@ const routesUser = [
title: 'routes_title.settings_password' title: 'routes_title.settings_password'
}, },
}, },
{
name: 'Token',
path: '/platform/token',
component: () =>
import(/* webpackChunkName: "chunks/settings-password" */ './views/User/AccessToken'),
meta: {
requiresAuth: true,
title: 'routes_title.token'
},
},
{ {
name: 'Storage', name: 'Storage',
path: '/platform/settings/storage', path: '/platform/settings/storage',
@@ -58,6 +58,24 @@
</div> </div>
</div> </div>
<div class="block-wrapper">
<div class="input-wrapper">
<div class="inline-wrapper">
<div class="switch-label">
<label class="input-label">
{{ $t('admin_settings.others.allow_user_verification') }}:
</label>
<small class="input-help" v-html="$t('admin_settings.others.allow_user_verification_help')"></small>
</div>
<SwitchInput @input="$updateText('/admin/settings', 'user_verification', app.userVerification)"
v-model="app.userVerification"
class="switch"
:state="app.userVerification"
/>
</div>
</div>
</div>
<FormLabel class="mt-70"> <FormLabel class="mt-70">
{{ $t('admin_settings.others.section_others') }} {{ $t('admin_settings.others.section_others') }}
</FormLabel> </FormLabel>
@@ -173,7 +191,7 @@
mounted() { mounted() {
axios.get('/api/admin/settings', { axios.get('/api/admin/settings', {
params: { params: {
column: 'contact_email|google_analytics|storage_default|registration|storage_limitation|mimetypes_blacklist|upload_limit' column: 'contact_email|google_analytics|storage_default|registration|storage_limitation|mimetypes_blacklist|upload_limit|user_verification'
} }
}) })
.then(response => { .then(response => {
@@ -186,7 +204,8 @@
userRegistration: parseInt(response.data.registration), userRegistration: parseInt(response.data.registration),
storageLimitation: parseInt(response.data.storage_limitation), storageLimitation: parseInt(response.data.storage_limitation),
mimetypesBlacklist : response.data.mimetypes_blacklist, mimetypesBlacklist : response.data.mimetypes_blacklist,
uploadLimit: response.data.upload_limit uploadLimit: response.data.upload_limit,
userVerification: parseInt(response.data.user_verification)
} }
}) })
} }
+32
View File
@@ -61,6 +61,19 @@
</router-link> </router-link>
</span> </span>
</AuthContent> </AuthContent>
<AuthContent name="not-verified" :visible="false">
<div class="user" v-if="checkedAccount">
<img class="user-avatar" :src="checkedAccount.avatar" :alt="checkedAccount.name">
<h1>{{ checkedAccount.name }}</h1>
<h2>{{ $t('page_not_verified.subtitle') }}</h2>
</div>
<span class="additional-link"> {{ $t('page_not_verified.resend_text') }}
<a @click="resendEmail" class="text-theme">{{ $t('page_not_verified.resend_button') }} </a>
</span>
</AuthContent>
</AuthContentWrapper> </AuthContentWrapper>
</template> </template>
@@ -110,6 +123,18 @@
} }
}) })
}, },
resendEmail() {
axios.
post('/api/user/email/resend/verify', {
email: this.loginEmail
})
.then(
this.$router.push({name: 'SuccessfullySend'})
)
.catch(() => {
this.$isSomethingWrong()
})
},
async logIn() { async logIn() {
// Validate fields // Validate fields
@@ -164,6 +189,13 @@
if (!isValid) return; if (!isValid) return;
if(!this.checkedAccount.verified) {
this.goToAuthPage('not-verified')
return
}
// Start loading // Start loading
this.isLoading = true this.isLoading = true
+11 -5
View File
@@ -132,17 +132,23 @@
// Send request to get user token // Send request to get user token
axios axios
.post('/register', this.register) .post('/api/register', this.register)
.then(() => { .then(() => {
// End loading // End loading
this.isLoading = false this.isLoading = false
// Set login state if(! this.config.userVerification) {
this.$store.commit('SET_AUTHORIZED', true) // Set login state
this.$store.commit('SET_AUTHORIZED', true)
// Go to files page
this.$router.push({name: 'Files'})
} else {
// Go to SuccessfullySend page
this.$router.push({name: 'SuccessfullySend'})
}
// Go to files page
this.$router.push({name: 'Files'})
}) })
.catch(error => { .catch(error => {
@@ -0,0 +1,40 @@
<template>
<AuthContentWrapper>
<AuthContent :visible="true">
<img v-if="config.app_logo" class="logo" :src="$getImage(config.app_logo)" :alt="config.app_name">
<b v-if="! config.app_logo" class="auth-logo-text">{{ config.app_name }}</b>
<h1>{{ $t('page_email_successfully_verified.title') }}</h1>
<h2>{{ $t('page_email_successfully_verified.subtitle') }}</h2>
<a href="/sign-in">
<AuthButton icon="chevron-right" :text="$t('page_sign_in.button_log_in')"/>
</a>
</AuthContent>
</AuthContentWrapper>
</template>
<script>
import AuthContentWrapper from '@/components/Auth/AuthContentWrapper'
import AuthContent from '@/components/Auth/AuthContent'
import AuthButton from '@/components/Auth/AuthButton'
import {mapGetters} from 'vuex'
export default {
name: 'SuccessfullyEmailVerified',
components: {
AuthContentWrapper,
AuthContent,
AuthButton,
},
computed: {
...mapGetters(['config']),
},
}
</script>
<style scoped lang="scss">
@import '@assets/vuefilemanager/_auth-form';
@import '@assets/vuefilemanager/_auth';
</style>
@@ -0,0 +1,42 @@
<template>
<AuthContentWrapper>
<AuthContent :visible="true">
<img v-if="config.app_logo" class="logo" :src="$getImage(config.app_logo)" :alt="config.app_name">
<b v-if="! config.app_logo" class="auth-logo-text">{{ config.app_name }}</b>
<h1>{{ $t('page_email_successfully_send.title') }}</h1>
<h2>{{ $t('page_email_successfully_send.subtitle') }}</h2>
<span class="additional-link">
<router-link :to="{name: 'Homepage'}" class="text-theme">
{{ $t('go_home') }}
</router-link>
</span>
</AuthContent>
</AuthContentWrapper>
</template>
<script>
import AuthContentWrapper from '@/components/Auth/AuthContentWrapper'
import AuthContent from '@/components/Auth/AuthContent'
import AuthButton from '@/components/Auth/AuthButton'
import {mapGetters} from 'vuex'
export default {
name: 'SuccessfullySendEmail',
components: {
AuthContentWrapper,
AuthContent,
AuthButton,
},
computed: {
...mapGetters(['config']),
},
}
</script>
<style scoped lang="scss">
@import '@assets/vuefilemanager/_auth-form';
@import '@assets/vuefilemanager/_auth';
</style>
+11
View File
@@ -32,6 +32,15 @@
{{ $t('menu.password') }} {{ $t('menu.password') }}
</div> </div>
</router-link> </router-link>
<router-link replace :to="{name: 'Token'}" class="menu-list-item link">
<div class="icon text-theme">
<key-icon size="17"></key-icon>
</div>
<div class="label text-theme">
{{ $t('menu.token') }}
</div>
</router-link>
</div> </div>
</ContentGroup> </ContentGroup>
<ContentGroup title="Subscription" class="navigator" v-if="canShowSubscriptionSettings"> <ContentGroup title="Subscription" class="navigator" v-if="canShowSubscriptionSettings">
@@ -142,6 +151,7 @@
CloudIcon, CloudIcon,
UserIcon, UserIcon,
LockIcon, LockIcon,
KeyIcon,
} from 'vue-feather-icons' } from 'vue-feather-icons'
export default { export default {
@@ -162,6 +172,7 @@
LockIcon, LockIcon,
Spinner, Spinner,
InfoBox, InfoBox,
KeyIcon,
}, },
computed: { computed: {
...mapGetters(['user', 'config']), ...mapGetters(['user', 'config']),
+41
View File
@@ -0,0 +1,41 @@
<template>
<PageTab>
<PageTabGroup>
<FormLabel>{{ $t('user_token.title') }}</FormLabel>
</PageTabGroup>
</PageTab>
</template>
<script>
import PageTabGroup from '@/components/Others/Layout/PageTabGroup'
import FormLabel from '@/components/Others/Forms/FormLabel'
import PageTab from '@/components/Others/Layout/PageTab'
export default {
name: 'AccessToken',
components: {
PageTabGroup,
FormLabel,
PageTab
},
data () {
return {
tokens: undefined
}
},
created () {
axios.
get('/api/user/tokens')
.then(response => {
this.tokens = response.data
})
}
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
</style>
+1
View File
@@ -54,6 +54,7 @@
allowHomepage: {{ $settings->allow_homepage ?? 1 }}, allowHomepage: {{ $settings->allow_homepage ?? 1 }},
userRegistration: {{ $settings->registration ?? 1 }}, userRegistration: {{ $settings->registration ?? 1 }},
userVerification: {{ $settings->user_verification ?? 0 }},
storageLimit: {{ $settings->storage_limitation ?? 1 }}, storageLimit: {{ $settings->storage_limitation ?? 1 }},
storageDefaultSpace: {{ $settings->storage_default ?? 5 }}, storageDefaultSpace: {{ $settings->storage_default ?? 5 }},
storageDefaultSpaceFormatted: '{{ isset($settings->storage_default) ? format_gigabytes($settings->storage_default) : format_gigabytes(5) }}', storageDefaultSpaceFormatted: '{{ isset($settings->storage_default) ? format_gigabytes($settings->storage_default) : format_gigabytes(5) }}',
+4
View File
@@ -1,5 +1,6 @@
<?php <?php
use App\Actions\Fortify\CreateNewUserAction;
use App\Http\Controllers\App\AppFunctionsController; use App\Http\Controllers\App\AppFunctionsController;
use App\Http\Controllers\FileManager\ShareController; use App\Http\Controllers\FileManager\ShareController;
use App\Http\Controllers\FileManager\TrashController; use App\Http\Controllers\FileManager\TrashController;
@@ -21,6 +22,9 @@ Route::group(['prefix' => 'password'], function () {
Route::post('/reset', [ResetPasswordController::class, 'reset']); Route::post('/reset', [ResetPasswordController::class, 'reset']);
}); });
// Register user
Route::post('/register', CreateNewUserAction::class);
// User master Routes // User master Routes
Route::group(['middleware' => ['auth:sanctum']], function () { Route::group(['middleware' => ['auth:sanctum']], function () {
// Browse // Browse
+7
View File
@@ -7,11 +7,18 @@ use App\Http\Controllers\User\PaymentMethodsController;
Route::post('/check', [AuthController::class, 'check_account']); Route::post('/check', [AuthController::class, 'check_account']);
// Email verification
Route::get('/email/verify/{id}', [AccountController::class, 'email_verification'])->name('verification.verify');
Route::post('/email/resend/verify', [AccountController::class, 'resend_verification_email'])->name('verification.send');
Route::group(['middleware' => ['auth:sanctum']], function () { Route::group(['middleware' => ['auth:sanctum']], function () {
// Account // Account
Route::patch('/relationships/settings', [AccountController::class, 'update_user_settings']); Route::patch('/relationships/settings', [AccountController::class, 'update_user_settings']);
Route::delete('/token/revoke/{token}', [AccountController::class, 'revoke_token']);
Route::post('/token/create', [AccountController::class, 'create_token']);
Route::post('/password', [AccountController::class, 'change_password']); Route::post('/password', [AccountController::class, 'change_password']);
Route::get('/subscription', [SubscriptionController::class, 'show']); Route::get('/subscription', [SubscriptionController::class, 'show']);
Route::get('/tokens', [AccountController::class, 'tokens']);
Route::get('/invoices', [AccountController::class, 'invoices']); Route::get('/invoices', [AccountController::class, 'invoices']);
Route::get('/storage', [AccountController::class, 'storage']); Route::get('/storage', [AccountController::class, 'storage']);
Route::get('/', [AccountController::class, 'user']); Route::get('/', [AccountController::class, 'user']);
+11 -1
View File
@@ -5,6 +5,7 @@ namespace Tests\Feature\Accounts;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use App\Notifications\ResetPassword; use App\Notifications\ResetPassword;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Password;
use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\Sanctum;
@@ -42,6 +43,8 @@ class AuthTest extends TestCase
*/ */
public function it_register_user() public function it_register_user()
{ {
Notification::fake();
collect([ collect([
[ [
'name' => 'storage_default', 'name' => 'storage_default',
@@ -51,6 +54,10 @@ class AuthTest extends TestCase
'name' => 'registration', 'name' => 'registration',
'value' => 1, 'value' => 1,
], ],
[
'name' => 'user_verification',
'value' => 1,
]
])->each(function ($setting) { ])->each(function ($setting) {
Setting::create([ Setting::create([
'name' => $setting['name'], 'name' => $setting['name'],
@@ -58,7 +65,7 @@ class AuthTest extends TestCase
]); ]);
}); });
$this->postJson('/register', [ $this->postJson('api/register', [
'email' => 'john@doe.com', 'email' => 'john@doe.com',
'password' => 'SecretPassword', 'password' => 'SecretPassword',
'password_confirmation' => 'SecretPassword', 'password_confirmation' => 'SecretPassword',
@@ -67,6 +74,7 @@ class AuthTest extends TestCase
$this->assertDatabaseHas('users', [ $this->assertDatabaseHas('users', [
'email' => 'john@doe.com', 'email' => 'john@doe.com',
'email_verified_at' => null,
]); ]);
$this->assertDatabaseHas('user_settings', [ $this->assertDatabaseHas('user_settings', [
@@ -76,6 +84,8 @@ class AuthTest extends TestCase
Storage::disk('local') Storage::disk('local')
->assertExists('files/' . User::first()->id); ->assertExists('files/' . User::first()->id);
Notification::assertTimesSent(1, VerifyEmail::class);
} }
/** /**
+154
View File
@@ -6,11 +6,15 @@ use App\Models\User;
use App\Services\SetupService; use App\Services\SetupService;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\Sanctum;
use Storage; use Storage;
use Notification;
use Tests\TestCase; use Tests\TestCase;
use App\Models\Folder;
use Illuminate\Support\Facades\URL;
class UserAccountTest extends TestCase class UserAccountTest extends TestCase
{ {
@@ -151,4 +155,154 @@ class UserAccountTest extends TestCase
], ],
]); ]);
} }
/**
* @test
*/
public function it_create_user_token()
{
$user = User::factory(User::class)
->create();
Sanctum::actingAs($user);
$this->postJson('/api/user/token/create', [
'name' => 'token'
])->assertStatus(201);
$this->assertDatabaseHas('personal_access_tokens', [
'tokenable_id' => $user->id,
'name' => 'token'
]);
}
/**
* @test
*/
public function it_revoke_user_token()
{
$user = User::factory(User::class)
->create();
Sanctum::actingAs($user);
$user->createToken('token');
$token_id = $user->tokens()->first()->id;
$this->deleteJson("/api/user/token/revoke/$token_id")
->assertStatus(204);
$this->assertDatabaseMissing('personal_access_tokens', [
'id' => $token_id
]);
}
/**
* @test
*/
public function it_get_user_tokens()
{
$user = User::factory(User::class)
->create();
Sanctum::actingAs($user);
$user->createToken('token');
$token = $user->tokens()->first();
$this->getJson('/api/user/tokens')
->assertStatus(200)
->assertJsonFragment([
"id" => $token->id,
"tokenable_type" => $token->tokenable_type,
"tokenable_id" => $user->id,
"name" => $token->name,
"abilities" => $token->abilities
]);
}
/**
* @test
*/
public function it_use_user_token_to_request()
{
$user = User::factory(User::class)
->create();
$folder = Folder::factory(Folder::class)
->create([
'user_id' => $user->id,
]);
$token = $user->createToken('token')->plainTextToken;
$this->assertDatabaseHas('personal_access_tokens', [
'tokenable_id' => $user->id
]);
$this->assertDatabaseHas('folders', [
'id' => $folder->id,
'user_id' => $user->id
]);
$response = $this->call('GET', "api/browse/folders/$folder->id",
[], [], [], [
'Content-type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer ' .$token,
]);
// $response->assertJsonFragment([
// 'id' => $folder->id,
// 'user_id' => $user->id,
// ]);
// dd($response);
}
/**
* @test
*/
public function it_verify_user_email()
{
$user = User::factory(User::class)
->create([
'email_verified_at' => null
]);
$verificationUrl = URL::temporarySignedRoute(
'verification.verify',
now()->addMinutes(60),
['id' => $user->id, 'hash' => sha1($user->email)]
);
$this
->getJson($verificationUrl)
->assertRedirect('successfully-verified');
$this->assertNotNull(User::find($user->id)->get('email_verified_at'));
}
/**
* @test
*/
public function it_resend_user_verify_email()
{
Notification::fake();
$user = User::factory(User::class)
->create([
'email_verified_at' => null
]);
$this->postJson('/api/user/email/resend/verify', [
'email' => $user->email,
])
->assertStatus(200);
Notification::assertTimesSent(1, VerifyEmail::class);
}
} }
+3
View File
@@ -308,6 +308,9 @@ class AdminTest extends TestCase
'email' => 'john@doe.com' 'email' => 'john@doe.com'
]); ]);
$this->assertNotNull(User::whereEmail('john@doe.com')
->get('email_verified_at'));
$this->assertDatabaseHas('user_settings', [ $this->assertDatabaseHas('user_settings', [
'name' => 'John Doe' 'name' => 'John Doe'
]); ]);
+41 -4
View File
@@ -2,12 +2,11 @@
namespace Tests\Feature\App; namespace Tests\Feature\App;
use App\Models\File;
use App\Models\Share; use App\Models\Share;
use App\Models\User;
use App\Models\Zip; use App\Models\Zip;
use App\Services\SchedulerService; use App\Services\SchedulerService;
use App\Services\SetupService; use App\Services\SetupService;
use Carbon\Carbon;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
use Storage; use Storage;
@@ -20,8 +19,8 @@ class SchedulerTest extends TestCase
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->setup = app()->make(SetupService::class); $this->setup = resolve(SetupService::class);
$this->scheduler = app()->make(SchedulerService::class); $this->scheduler = resolve(SchedulerService::class);
} }
/** /**
@@ -99,4 +98,42 @@ class SchedulerTest extends TestCase
}); });
} }
/**
* @test
*/
public function it_delete_non_verified_users_after_30_days()
{
$expiredUser = User::factory(User::class)
->create([
'email_verified_at' => null,
'created_at' => now()->subDays(31)
]);
$nonExpiredUser = User::factory(User::class)
->create([
'email_verified_at' => null,
'created_at' => now()->subDays(14)
]);
$verifiedUser = User::factory(User::class)
->create([
'email_verified_at' => now()->subDays(15),
'created_at' => now()->subDays(31)
]);
$this->scheduler->delete_unverified_users();
$this->assertDatabaseMissing('users', [
'id' => $expiredUser->id,
]);
$this->assertDatabaseHas('users', [
'id' => $nonExpiredUser->id,
]);
$this->assertDatabaseHas('users', [
'id' => $verifiedUser->id,
]);
}
} }
+8
View File
@@ -2,7 +2,9 @@
namespace Tests; namespace Tests;
use Carbon\Carbon;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase; use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Notification;
abstract class TestCase extends BaseTestCase abstract class TestCase extends BaseTestCase
{ {
@@ -11,5 +13,11 @@ abstract class TestCase extends BaseTestCase
public function setUp(): void public function setUp(): void
{ {
parent::setUp(); parent::setUp();
Carbon::setTestNow('1. January 2021');
Notification::fake();
$this->withoutExceptionHandling();
} }
} }
+6 -6
View File
@@ -34,12 +34,12 @@ mix.js('resources/js/main.js', 'public/js')
clientLogLevel: 'none' clientLogLevel: 'none'
} }
}) })
.options({ // .options({
hmrOptions: { // hmrOptions: {
host: '192.168.1.198', // host: 'vuefilemanager.test',
port: '8080' // port: '80'
}, // },
}) // })
.disableNotifications(); .disableNotifications();
if (mix.inProduction()) { if (mix.inProduction()) {