The .htaccess file was restored to solve the redirection problem, migrations were created with more information about the user and good defaults, and an accept header was added because of the annoyance of not getting a JSON response after a validation error.tags/v0.1.0
@@ -13,18 +13,18 @@ use Illuminate\Support\Facades\Auth; | |||||
class UserController extends Controller | class UserController extends Controller | ||||
{ | { | ||||
public function create(Request $request) { | public function create(Request $request) { | ||||
Log::("it works") | |||||
$validated = $request->validate([ | $validated = $request->validate([ | ||||
'name' => 'required', | 'name' => 'required', | ||||
'email' => 'required|email|unique:users', | 'email' => 'required|email|unique:users,email', | ||||
'password' => 'required' | /* 'password' => 'required' */ | ||||
/* 'password' => 'required|confirmed|min:8|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/' */ | 'password' => 'required|confirmed|min:8|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/' | ||||
]); | ]); | ||||
$user = new User; | $user = new User; | ||||
$user->name = $request->name; | $user->name = $request->name; | ||||
$user->email = $request->email; | $user->email = $request->email; | ||||
$user->role = "client"; | $user->role = "client"; | ||||
$user->active = true; | |||||
$user->password = Hash::make($request->password); | $user->password = Hash::make($request->password); | ||||
$user->save(); | $user->save(); | ||||
@@ -20,8 +20,8 @@ class CreateUsersTable extends Migration | |||||
$table->timestamp('email_verified_at')->nullable(); | $table->timestamp('email_verified_at')->nullable(); | ||||
$table->string('password'); | $table->string('password'); | ||||
$table->string('role'); | $table->string('role'); | ||||
$table->boolean('active'); | $table->boolean('active')->default(true); | ||||
$table->bigInteger('credits'); | $table->bigInteger('credits')->default(0); | ||||
$table->rememberToken(); | $table->rememberToken(); | ||||
$table->timestamps(); | $table->timestamps(); | ||||
}); | }); | ||||
@@ -0,0 +1,33 @@ | |||||
<?php | |||||
use Illuminate\Database\Migrations\Migration; | |||||
use Illuminate\Database\Schema\Blueprint; | |||||
use Illuminate\Support\Facades\Schema; | |||||
class CreateOrdersTable extends Migration | |||||
{ | |||||
/** | |||||
* Run the migrations. | |||||
* | |||||
* @return void | |||||
*/ | |||||
public function up() | |||||
{ | |||||
Schema::create('orders', function (Blueprint $table) { | |||||
$table->id(); | |||||
$table->timestamps(); | |||||
$table->string('product'); | |||||
$table->bigInteger('quantity'); | |||||
}); | |||||
} | |||||
/** | |||||
* Reverse the migrations. | |||||
* | |||||
* @return void | |||||
*/ | |||||
public function down() | |||||
{ | |||||
Schema::dropIfExists('orders'); | |||||
} | |||||
} |
@@ -0,0 +1,21 @@ | |||||
<IfModule mod_rewrite.c> | |||||
<IfModule mod_negotiation.c> | |||||
Options -MultiViews -Indexes | |||||
</IfModule> | |||||
RewriteEngine On | |||||
# Handle Authorization Header | |||||
RewriteCond %{HTTP:Authorization} . | |||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] | |||||
# Redirect Trailing Slashes If Not A Folder... | |||||
RewriteCond %{REQUEST_FILENAME} !-d | |||||
RewriteCond %{REQUEST_URI} (.+)/$ | |||||
RewriteRule ^ %1 [L,R=301] | |||||
# Send Requests To Front Controller... | |||||
RewriteCond %{REQUEST_FILENAME} !-d | |||||
RewriteCond %{REQUEST_FILENAME} !-f | |||||
RewriteRule ^ index.php [L] | |||||
</IfModule> |
@@ -0,0 +1,3 @@ | |||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="red" class="bi bi-exclamation-triangle-fill" viewBox="0 0 16 16"> | |||||
<path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/> | |||||
</svg> |
@@ -1,6 +1,7 @@ | |||||
<template> | <template> | ||||
<form v-if="active === 'register'" v-on:submit="register" id="register-form"> | <form v-if="active === 'register'" v-on:submit="register" id="register-form"> | ||||
<h3>Registration</h3> | <h3>Registration</h3> | ||||
<div>{{errorMessage}}</div> | |||||
<div> | <div> | ||||
<label for='sender_name'>Name</label> | <label for='sender_name'>Name</label> | ||||
<input id='register-name' required type='name' name='sender_name' placeholder='' | <input id='register-name' required type='name' name='sender_name' placeholder='' | ||||
@@ -44,7 +45,7 @@ | |||||
<p>A password reset link has been sent.</p> | <p>A password reset link has been sent.</p> | ||||
</div> | </div> | ||||
<div v-if="active === 'error'"> | <div v-if="active === 'error'"> | ||||
<img class="medium-icon" src="../../images/warning.svg" alt=""> | <img class="medium-icon" src="../../images/warning-colored.svg" alt=""> | ||||
<h3>An Error Occured.</h3> | <h3>An Error Occured.</h3> | ||||
<p>{{`${error}: ${errorMessage}`}}</p> | <p>{{`${error}: ${errorMessage}`}}</p> | ||||
</div> | </div> | ||||
@@ -57,6 +58,7 @@ | |||||
fetch("/register", { | fetch("/register", { | ||||
method: 'POST', | method: 'POST', | ||||
headers: {'Content-Type': 'application/json', | headers: {'Content-Type': 'application/json', | ||||
'Accept': 'application/json', | |||||
'X-XSRF-TOKEN': this.token}, | 'X-XSRF-TOKEN': this.token}, | ||||
body: JSON.stringify({"name": document.getElementById("register-name").value, | body: JSON.stringify({"name": document.getElementById("register-name").value, | ||||
"email": document.getElementById("register-email").value, | "email": document.getElementById("register-email").value, | ||||
@@ -65,13 +67,18 @@ | |||||
.then(response => { | .then(response => { | ||||
//Give completed or error | //Give completed or error | ||||
if (response.ok) { | if (response.ok) { | ||||
this.active = 'completed' | this.active = 'register-completed' | ||||
} else { | } else { | ||||
this.error = response.status | if (response.status === 422) { | ||||
this.errorMessage = response.statusText | this.errorMessage = 'That email is already registered.' | ||||
this.active = 'error' | this.active = 'register' | ||||
} else { | |||||
this.error = response.status | |||||
this.errorMessage = response.statusText | |||||
this.active = 'error' | |||||
} | |||||
} | } | ||||
console.log(response) | /* console.log(response.json()) */ | ||||
}); | }); | ||||
event.preventDefault(); | event.preventDefault(); | ||||
} | } | ||||
@@ -501,15 +501,17 @@ div.register-area { | |||||
color: black; | color: black; | ||||
display: block; | display: block; | ||||
border-color: black; | border-color: black; | ||||
width: 95%; | |||||
} | } | ||||
div { | div { | ||||
margin-top: 20px; | margin-top: 20px; | ||||
margin-bottom: 20px; | margin-bottom: 20px; | ||||
width: 100%; | |||||
} | } | ||||
form { | form { | ||||
width: fit-content; | width: 160px; | ||||
margin: 20px auto; | margin: 20px auto; | ||||
} | } | ||||
@@ -535,7 +537,7 @@ section.features-info { | |||||
} | } | ||||
div.register-area.active { | div.register-area.active { | ||||
height: 400px; | min-height: 400px; | ||||
opacity: 1; | opacity: 1; | ||||
} | } | ||||
@@ -623,6 +625,8 @@ div.register-area.active { | |||||
div.register-area div { | div.register-area div { | ||||
margin-top: 10px; | margin-top: 10px; | ||||
margin-bottom: 5px; | margin-bottom: 5px; | ||||
margin-left: auto; | |||||
margin-right: auto; | |||||
} | } | ||||
.landing-hero div.hero-filter h2 { | .landing-hero div.hero-filter h2 { | ||||
@@ -41,7 +41,6 @@ Route::post('/resend-verification', function (Request $request) { | |||||
})->middleware(['auth', 'throttle:6,1'])->name('verification.send'); | })->middleware(['auth', 'throttle:6,1'])->name('verification.send'); | ||||
Route::post('/register', [UserController::class, 'create']); | Route::post('/register', [UserController::class, 'create']); | ||||
Route::view('/register', 'home'); | |||||
Route::get('/forgot-password', function () { | Route::get('/forgot-password', function () { | ||||
return view('request-reset'); | return view('request-reset'); | ||||