WIP: Semi-complete authentication including several writer view stubs

This commit is contained in:
Jonathan Nielson 2024-08-04 16:38:41 -05:00
parent e7c08e989a
commit d2d75d2efb
9 changed files with 127 additions and 18 deletions

View File

@ -0,0 +1,50 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\RedirectResponse;
class WriterController extends Controller
{
public function authenticate(Request $request): RedirectResponse
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('writer');
}
return back()->withErrors([
'email' => 'The provided credentials do not match our records.',
])->onlyInput('email');
}
public function logout(Request $request): RedirectResponse
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect(route('login'));
}
public function dashboard(Request $request): View
{
return view('writer.dashboard');
}
public function newArticle(Request $request): View
{
return view('writer.new-article');
}
}

View File

@ -6,6 +6,7 @@ use App\Models\User;
use App\Models\Author; use App\Models\Author;
use App\Models\Article; use App\Models\Article;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class DatabaseSeeder extends Seeder class DatabaseSeeder extends Seeder
{ {
@ -17,6 +18,7 @@ class DatabaseSeeder extends Seeder
$test_user = User::factory()->create([ $test_user = User::factory()->create([
'name' => 'Test User', 'name' => 'Test User',
'email' => 'test@example.com', 'email' => 'test@example.com',
'password' => Hash::make('password'),
]); ]);
$test_author = Author::factory()->user($test_user)->create(); $test_author = Author::factory()->user($test_user)->create();

View File

@ -0,0 +1,3 @@
.is-invalid {
border: red 4px solid;
}

View File

@ -22,6 +22,7 @@ a {
justify-content: center; justify-content: center;
} }
.bubble-panel { .bubble-panel {
border-radius: 50px; border-radius: 50px;
background: #813d9c; background: #813d9c;

View File

@ -4,26 +4,22 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Include our local version of HTMX --> <link href="/word-salad.css" rel="stylesheet" />
<link href="/word-salad-writer.css" rel="stylesheet" />
{{-- Include HTMX on the writer-side to enchance our interactivity --}}
<script src="/htmx.1.9.12.js"></script> <script src="/htmx.1.9.12.js"></script>
<link href="/word-salad.css" rel="stylesheet" /> <title>{{ config('blog.publishing_name') }} | @yield('title')</title>
<title>{{ config('blog.publishing_name') }} | Home</title>
</head> </head>
<body> <body>
<section id="error-bag">
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
</section>
<main> <main>
<h2>Hey guys, check back soon for some word-based #content</h2> @yield('content', 'Nothing to see here.')
<div id="button-container">
<button hx-get="{{ route('surprise') }}"
hx-trigger="click"
hx-target="#button-container"
hx-swap="outerHTML"
>
Click Me!
</button>
</div>
</main> </main>
</body> </body>
</html> </html>

View File

@ -0,0 +1,14 @@
@extends('layouts.writer')
@section('title', 'Writer Dashboard')
@section('content')
<div>
<h1>Writer's Dashboard</h1>
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit">Logout</button>
</form>
<a href="{{ route('new_article') }}"><button>New Article</button></a>
</div>
@endsection

View File

@ -0,0 +1,21 @@
@extends('layouts.writer')
@section('title', 'Writer Login')
@section('content')
<section class="bubble-panel">
<h2>Writer Login</h2>
<form action="{{ route('authenticate') }}" method="POST">
@csrf
<label for="email">Email</label>
<input class="@error('email') is-invalid @enderror" type="text" name="email" />
<label for="password">Password</label>
<input class="@error('password') is-invalid @enderror" type="password" name="password" />
<button type="submit">Login</button>
</form>
</section>
@endsection

View File

@ -0,0 +1,9 @@
@extends('layouts.writer')
@section('title', 'Write New Article')
@section('content')
<div>
New Article
</div>
@endsection

View File

@ -1,5 +1,6 @@
<?php <?php
use App\Http\Controllers\WriterController;
use App\Models\Article; use App\Models\Article;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -38,3 +39,15 @@ Route::get('/post/{article_slug}', function ($article_slug) {
} }
return view('guest.article', ['article' => $active_article]); return view('guest.article', ['article' => $active_article]);
})->name('article'); })->name('article');
Route::get('/writer/login', function () {
return view('writer.login');
})->name('login');
Route::post('/writer/authenticate', [WriterController::class, 'authenticate'])->name('authenticate');
Route::middleware('auth')->group(function () {
Route::get('/writer', [WriterController::class, 'dashboard'])->name('dashboard');
Route::post('/logout', [WriterController::class, 'logout'])->name('logout');
Route::get('writer/new-article', [WriterController::class, 'newArticle'])->name('new_article');
});