diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 6499b11..384367f 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -2,12 +2,47 @@ namespace App\Http\Controllers; +use App\Models\User; +use App\Models\EmployeeCounter; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Hash; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redis; class AuthController extends Controller { + private function generateEmployeeId() + { + return DB::transaction(function () { + + $year = date('Y'); + + $counter = EmployeeCounter::lockForUpdate() + ->where('year', $year) + ->first(); + + if (!$counter) { + $counter = EmployeeCounter::create([ + 'year' => $year, + 'last_number' => 0 + ]); + } + + $counter->last_number += 1; + $counter->save(); + + $runningNumber = str_pad($counter->last_number, 3, '0', STR_PAD_LEFT); + + return 'S' . $year . $runningNumber; + }); + } + + public function showRegister() + { + return view('auth.register'); + } + public function showLogin() { if (Auth::check()) { @@ -31,6 +66,20 @@ public function login(Request $request) 'password' => $request->password ]; + $user = User::where($loginType, $request->login)->first(); + + if (!$user) { + return back()->withErrors([ + 'login' => 'Account not registered.' + ]); + } + + if (!$user->is_approved) { + return back()->withErrors([ + 'login' => 'Account not approved by admin.' + ]); + } + if (Auth::attempt($credentials)) { $request->session()->regenerate(); @@ -70,4 +119,25 @@ public function logout(Request $request) return redirect('/login'); } + + public function register(Request $request) + { + $request->validate([ + 'name' => 'required|max:255', + 'email' => 'required|email|unique:users', + 'password' => 'required|min:8|confirmed' + ]); + + User::create([ + 'name' => $request->name, + 'employee_id' => $this->generateEmployeeId(), + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'is_approved' => false, + 'token_version' => 1, + ]); + + return redirect('/login') + ->with('message', 'Registration successful. Waiting for admin approval.'); + } } diff --git a/app/Models/EmployeeCounter.php b/app/Models/EmployeeCounter.php new file mode 100644 index 0000000..383ccc1 --- /dev/null +++ b/app/Models/EmployeeCounter.php @@ -0,0 +1,10 @@ +boolean('is_approved')->default(false); + } + + if (!Schema::hasColumn('users', 'token_version')) { + $table->integer('token_version')->default(1); + } + }); + } + + public function down(): void {} +}; diff --git a/database/migrations/2026_02_21_003010_create_employee_counters_table.php b/database/migrations/2026_02_21_003010_create_employee_counters_table.php new file mode 100644 index 0000000..022a21e --- /dev/null +++ b/database/migrations/2026_02_21_003010_create_employee_counters_table.php @@ -0,0 +1,29 @@ +id(); + $table->integer('year')->unique(); + $table->integer('last_number')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('employee_counters'); + } +}; diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 7f4e55a..2e90d91 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -120,7 +120,7 @@

- New here? Create an account + New here? Create an account

diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 0000000..e807f48 --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,166 @@ + + + + + + Create New Account | UBold - Responsive Bootstrap 5 Admin Dashboard + + + + + + + + + + + + + + + + + + + +

+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+

Create your account by entering the form below.

+ +
+ @csrf +
+ + +
+ +
+ + +
+ +
+ + +
+

Use 8+ characters with letters, numbers & symbols.

+
+ +
+ + +
+ +
+
+ + +
+
+ +
+ +
+
+
+ +

+ Already have an account? Login +

+ +

+ © + UBold — by Coderthemes +

+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 72289f2..e32d061 100755 --- a/routes/web.php +++ b/routes/web.php @@ -3,8 +3,13 @@ use Illuminate\Support\Facades\Route; use App\Http\Controllers\AuthController; -Route::get('/', function () { - return view('welcome'); +Route::get('/', [AuthController::class, 'showLogin'])->name('login'); + +Route::middleware('guest')->group(function () { + + Route::get('/register', [AuthController::class, 'showRegister']); + Route::post('/register', [AuthController::class, 'register']); + }); Route::get('/login', [AuthController::class, 'showLogin'])->name('login');