@@ -61,7 +59,8 @@ class="text-black appearance-none rounded-none relative block w-full px-3 py-2 b
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