diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 57c4bdf46..c44a9d464 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -35,10 +35,8 @@ @endif -
- {{ csrf_field() }} - - + + @csrf
@@ -61,7 +59,8 @@ class="text-black appearance-none rounded-none relative block w-full px-3 py-2 b
- + + diff --git a/resources/views/shared/header.blade.php b/resources/views/shared/header.blade.php index 6c85f7f1b..b6d92940f 100644 --- a/resources/views/shared/header.blade.php +++ b/resources/views/shared/header.blade.php @@ -31,7 +31,7 @@ @@ -39,7 +39,7 @@ class="relative block h-8 w-8 rounded-full overflow-hidden shadow focus:outline-
diff --git a/src/Fields/Json.php b/src/Fields/Json.php index 37b7b1a45..34c0b9d6f 100644 --- a/src/Fields/Json.php +++ b/src/Fields/Json.php @@ -19,6 +19,10 @@ public function indexViewValue(Model $item, bool $container = false): string $columns = []; $values = $item->{$this->field()}; + if(!$this->hasFields()) { + return json_encode($values); + } + if($this->isKeyValue()) { $values = collect($item->{$this->field()}) ->map(fn($value, $key) => ['key' => $key, 'value' => $value]); diff --git a/src/Http/Controllers/MoonShineAuthController.php b/src/Http/Controllers/MoonShineAuthController.php index 434757ce2..1a61089fb 100644 --- a/src/Http/Controllers/MoonShineAuthController.php +++ b/src/Http/Controllers/MoonShineAuthController.php @@ -6,9 +6,9 @@ use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; -use Illuminate\Http\Request; use Illuminate\Routing\Controller as BaseController; use Illuminate\Routing\Redirector; +use Leeto\MoonShine\Http\Requests\LoginFormRequest; use function auth; use function back; @@ -18,28 +18,29 @@ class MoonShineAuthController extends BaseController { - public function login(Request $request): Factory|View|Redirector|Application|RedirectResponse + public function login(): Factory|View|Redirector|Application|RedirectResponse { if (auth(config('moonshine.auth.guard'))->check()) { return redirect(route(config('moonshine.route.prefix') . '.index')); } - if ($request->isMethod('post')) { - $credentials = $request->only(['email', 'password']); - $remember = $request->get('remember', false); + return view('moonshine::auth.login'); + } + + public function authenticate(LoginFormRequest $request): RedirectResponse + { + $credentials = $request->only(['email', 'password']); + $remember = $request->boolean('remember', false); - if (auth(config('moonshine.auth.guard'))->attempt($credentials, $remember)) { - return redirect(url()->previous()); - } else { - $request->session()->flash('alert', trans('moonshine::auth.failed')); + if (auth(config('moonshine.auth.guard'))->attempt($credentials, $remember)) { + return redirect(url()->previous()); + } else { + $request->session()->flash('alert', trans('moonshine::auth.failed')); - return back() - ->withInput() - ->withErrors(['login' => trans('moonshine::auth.failed')]); - } + return back() + ->withInput() + ->withErrors(['login' => trans('moonshine::auth.failed')]); } - - return view('moonshine::auth.login'); } public function logout(): Redirector|Application|RedirectResponse diff --git a/src/Http/Middleware/Authenticate.php b/src/Http/Middleware/Authenticate.php index e4c185c27..b15e9f2c1 100644 --- a/src/Http/Middleware/Authenticate.php +++ b/src/Http/Middleware/Authenticate.php @@ -32,6 +32,7 @@ protected function except(Request $request): bool { return $request->is([ config('moonshine.route.prefix') . '/login', + config('moonshine.route.prefix') . '/authenticate', config('moonshine.route.prefix') . '/logout', ]); } diff --git a/src/Http/Requests/LoginFormRequest.php b/src/Http/Requests/LoginFormRequest.php new file mode 100644 index 000000000..d58f836fb --- /dev/null +++ b/src/Http/Requests/LoginFormRequest.php @@ -0,0 +1,40 @@ +guest(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + 'email' => ['required', 'email'], + 'password' => ['required'], + ]; + } + + protected function prepareForValidation() + { + $this->merge([ + 'email' => (string)str(request('email')) + ->lower() + ->trim(), + ]); + } +} diff --git a/src/MoonShine.php b/src/MoonShine.php index c521f3c18..7a71636db 100644 --- a/src/MoonShine.php +++ b/src/MoonShine.php @@ -95,7 +95,8 @@ protected function addRoutes(): void Route::get('/', [MoonShineDashboardController::class, 'index'])->name('index'); Route::post('/attachments', [MoonShineDashboardController::class, 'attachments'])->name('attachments'); - Route::any('/login', [MoonShineAuthController::class, 'login'])->name('login'); + Route::get('/login', [MoonShineAuthController::class, 'login'])->name('login'); + Route::post('/authenticate', [MoonShineAuthController::class, 'authenticate'])->name('authenticate'); Route::get('/logout', [MoonShineAuthController::class, 'logout'])->name('logout'); $this->resources->each(function ($resource) { diff --git a/src/Resources/MoonShineUserResource.php b/src/Resources/MoonShineUserResource.php index c6c018764..aff674521 100644 --- a/src/Resources/MoonShineUserResource.php +++ b/src/Resources/MoonShineUserResource.php @@ -43,8 +43,8 @@ public function fields(): array Image::make('Аватар', 'avatar') ->removable() ->showOnExport() - ->disk('public') - ->dir('images') + ->disk(config('filesystems.default')) + ->dir('moonshine_users') ->allowedExtensions(['jpg', 'png', 'jpeg', 'gif']), Date::make('Дата создания', 'created_at') @@ -67,7 +67,7 @@ public function fields(): array public function rules($item): array { return [ - 'name' => 'required|min:5', + 'name' => 'required', 'moonshine_user_role_id' => 'required', 'email' => 'sometimes|bail|required|email|unique:moonshine_users,email' . ($item->exists ? ",$item->id" : ''), 'password' => !$item->exists @@ -78,7 +78,7 @@ public function rules($item): array public function search(): array { - return ["id", "name"]; + return ['id', 'name']; } public function filters(): array diff --git a/tests/Controllers/MoonShineAuthControllerTest.php b/tests/Controllers/MoonShineAuthControllerTest.php new file mode 100644 index 000000000..909b70fa1 --- /dev/null +++ b/tests/Controllers/MoonShineAuthControllerTest.php @@ -0,0 +1,56 @@ +get(route(config('moonshine.route.prefix') . '.login')); + + $response->assertOk(); + $response->assertViewIs('moonshine::auth.login'); + } + + public function test_login_redirect_to_dashboard() + { + $response = $this->actingAs($this->user, config('moonshine.auth.guard')) + ->get(route(config('moonshine.route.prefix') . '.login')); + + $response->assertRedirect(route(config('moonshine.route.prefix') . '.index')); + } + + public function test_authenticate() + { + $response = $this->post( + route(config('moonshine.route.prefix') . '.authenticate'), + ['email' => $this->user->email, 'password' => 'invalid'] + ); + + $response->assertInvalid(['login']); + + $response = $this->post( + route(config('moonshine.route.prefix') . '.authenticate'), + ['email' => $this->user->email, 'password' => 'test'] + ); + + $response->assertValid(); + } + + public function test_logout() + { + $response = $this->actingAs($this->user, config('moonshine.auth.guard')) + ->get(route(config('moonshine.route.prefix') . '.logout')); + + $response->assertRedirect(route(config('moonshine.route.prefix') . '.login')); + } + +} \ No newline at end of file