diff --git a/app/Http/Controllers/AdminAuthController.php b/app/Http/Controllers/Admin/AdminAuthController.php similarity index 55% rename from app/Http/Controllers/AdminAuthController.php rename to app/Http/Controllers/Admin/AdminAuthController.php index 604ccd9..109f4a5 100644 --- a/app/Http/Controllers/AdminAuthController.php +++ b/app/Http/Controllers/Admin/AdminAuthController.php @@ -1,41 +1,51 @@ validate([ - 'email' => 'required|email', - 'password' => 'required|min:6', + 'email' => 'required|email', + 'password' => 'required|string|min:6', ]); - $credentials = $request->only('email', 'password'); - - if (Auth::guard('admin')->attempt($credentials)) { - return redirect()->route('admin.dashboard')->with('success', 'Login successful!'); + // Try to log in using the 'admin' guard + if (Auth::guard('admin')->attempt($request->only('email', 'password'))) { + return redirect()->route('admin.dashboard')->with('success', 'Welcome back, Admin!'); } - return back()->withErrors(['email' => 'Invalid credentials.'])->withInput(); + return back()->withErrors(['email' => 'Invalid email or password.']); } - // 🟢 Logout + /** + * Logout admin + */ public function logout(Request $request) { Auth::guard('admin')->logout(); + + // Destroy the session completely $request->session()->invalidate(); $request->session()->regenerateToken(); diff --git a/app/Http/Controllers/Admin/UserRequestController.php b/app/Http/Controllers/Admin/UserRequestController.php new file mode 100644 index 0000000..0b6306f --- /dev/null +++ b/app/Http/Controllers/Admin/UserRequestController.php @@ -0,0 +1,68 @@ +get(); + return view('admin.requests', compact('requests')); + } + + // Approve user request + public function approve($id) + { + $requestData = CustomerRequest::findOrFail($id); + + DB::beginTransaction(); + try { + // Generate unique Customer ID + $latestUser = User::orderBy('id', 'desc')->first(); + $nextId = $latestUser ? $latestUser->id + 1 : 1; + $customerId = 'CID-' . date('Y') . '-' . str_pad($nextId, 6, '0', STR_PAD_LEFT); + + // Create user record + $user = new User(); + $user->customer_id = $customerId; + $user->customer_name = $requestData->customer_name; + $user->company_name = $requestData->company_name; + $user->designation = $requestData->designation; + $user->email = $requestData->email; + $user->mobile_no = $requestData->mobile_no; + $user->address = $requestData->address; + $user->pincode = $requestData->pincode; + $user->date = now()->format('Y-m-d'); + $user->password = Hash::make('123456'); // default password (you can change logic) + $user->save(); + + // Update request status + $requestData->status = 'approved'; + $requestData->save(); + + DB::commit(); + return redirect()->back()->with('success', 'Request approved and user created successfully.'); + } catch (\Exception $e) { + DB::rollback(); + return redirect()->back()->with('error', 'Something went wrong: ' . $e->getMessage()); + } + } + + // Reject request + public function reject($id) + { + $requestData = CustomerRequest::findOrFail($id); + $requestData->status = 'rejected'; + $requestData->save(); + + return redirect()->back()->with('info', 'Request rejected successfully.'); + } +} diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php deleted file mode 100644 index d8eaab6..0000000 --- a/app/Http/Controllers/AuthController.php +++ /dev/null @@ -1,69 +0,0 @@ -validate([ - 'name' => 'required|string|max:255', - 'email' => 'required|string|email|unique:users', - 'password' => 'required|string|min:6', - ]); - - $user = User::create([ - 'name' => $request->name, - 'email' => $request->email, - 'password' => Hash::make($request->password), - ]); - - $token = JWTAuth::fromUser($user); - - return response()->json([ - 'status' => true, - 'message' => 'User registered successfully', - 'user' => $user, - 'token' => $token - ]); - } - - // ✅ Login - public function login(Request $request) - { - $credentials = $request->only('email', 'password'); - - if (!$token = Auth::guard('api')->attempt($credentials)) { - return response()->json(['error' => 'Invalid credentials'], 401); - } - - return response()->json([ - 'status' => true, - 'message' => 'Login successful', - 'token' => $token, - 'user' => Auth::guard('api')->user() - ]); - } - - // ✅ Logout - public function logout() - { - Auth::guard('api')->logout(); - return response()->json(['message' => 'Successfully logged out']); - } - - // ✅ Refresh token - public function refresh() - { - return response()->json([ - 'token' => Auth::guard('api')->refresh() - ]); - } -} diff --git a/app/Http/Controllers/RequestController.php b/app/Http/Controllers/RequestController.php new file mode 100644 index 0000000..e6af629 --- /dev/null +++ b/app/Http/Controllers/RequestController.php @@ -0,0 +1,56 @@ +validate([ + 'customer_name' => 'required|string|max:255', + 'company_name' => 'required|string|max:255', + 'designation' => 'nullable|string|max:255', + 'email' => 'required|email|unique:requests,email', + 'mobile_no' => 'required|string|max:15', + 'priority' => 'nullable|string|max:50', + 'address' => 'nullable|string', + 'pincode' => 'nullable|string|max:10', + ]); + + // ✅ Generate formatted request ID (e.g., REQ-2025-000001) + $lastRequest = RequestModel::latest('id')->first(); + $nextId = $lastRequest ? $lastRequest->id + 1 : 1; + $year = date('Y'); + $formattedRequestId = sprintf('REQ-%s-%06d', $year, $nextId); + + // ✅ Create new request entry + $newRequest = RequestModel::create([ + 'request_id' => $formattedRequestId, + 'customer_name' => $request->customer_name, + 'company_name' => $request->company_name, + 'designation' => $request->designation, + 'email' => $request->email, + 'mobile_no' => $request->mobile_no, + 'priority' => $request->priority, + 'address' => $request->address, + 'pincode' => $request->pincode, + 'date' => Carbon::now()->toDateString(), // Auto current date + 'status' => 'pending', // Default status + ]); + + // ✅ Response + return response()->json([ + 'status' => true, + 'message' => 'Signup request submitted successfully. Please wait for admin approval.', + 'data' => $newRequest + ]); + } +} diff --git a/app/Http/Controllers/UserAuthController.php b/app/Http/Controllers/UserAuthController.php new file mode 100644 index 0000000..b6893d4 --- /dev/null +++ b/app/Http/Controllers/UserAuthController.php @@ -0,0 +1,82 @@ +validate([ + 'login_id' => 'required|string', // can be email, mobile, or customer_id + 'password' => 'required|string', + ]); + + // Find user by email OR mobile_no OR customer_id + $user = User::where('email', $request->login_id) + ->orWhere('mobile_no', $request->login_id) + ->orWhere('customer_id', $request->login_id) + ->first(); + + if (!$user) { + return response()->json([ + 'success' => false, + 'message' => 'User not found with given credentials.', + ], 404); + } + + // Check hashed password + if (!Hash::check($request->password, $user->password)) { + return response()->json([ + 'success' => false, + 'message' => 'Incorrect password.', + ], 401); + } + + // Generate JWT token + $token = JWTAuth::fromUser($user); + + return response()->json([ + 'success' => true, + 'message' => 'Login successful.', + 'token' => $token, + 'user' => [ + 'id' => $user->id, + 'customer_id' => $user->customer_id, + 'customer_name' => $user->customer_name, + 'company_name' => $user->company_name, + 'email' => $user->email, + 'mobile_no' => $user->mobile_no, + 'address' => $user->address, + 'pincode' => $user->pincode, + ] + ]); + } + + /** + * User Logout + */ + public function logout(Request $request) + { + try { + JWTAuth::invalidate(JWTAuth::getToken()); + + return response()->json([ + 'success' => true, + 'message' => 'Logout successful.', + ]); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Failed to logout. Token may be invalid or expired.', + ], 500); + } + } +} diff --git a/app/Models/MarkList.php b/app/Models/MarkList.php new file mode 100644 index 0000000..18f3546 --- /dev/null +++ b/app/Models/MarkList.php @@ -0,0 +1,29 @@ +belongsTo(User::class, 'customer_id'); + } +} diff --git a/app/Models/RequestModel.php b/app/Models/RequestModel.php new file mode 100644 index 0000000..b3a181d --- /dev/null +++ b/app/Models/RequestModel.php @@ -0,0 +1,24 @@ +getKey(); } + /** + * JWT Custom Claims. + */ public function getJWTCustomClaims() { return []; diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index cc00c0e..de4ef86 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -11,22 +11,38 @@ return new class extends Migration */ public function up(): void { + // USERS TABLE Schema::create('users', function (Blueprint $table) { - $table->id(); - $table->string('name'); + $table->id(); // Auto-increment primary key + + // Custom customer ID like CID-2025-000001 + $table->string('customer_id')->unique(); + + // Customer details + $table->string('customer_name'); + $table->string('company_name'); + $table->string('designation')->nullable(); $table->string('email')->unique(); + $table->string('mobile_no'); + $table->string('address')->nullable(); + $table->string('pincode')->nullable(); + $table->date('date')->nullable(); + + // Authentication fields $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); + $table->string('password')->nullable(); $table->rememberToken(); $table->timestamps(); }); + // PASSWORD RESETS TABLE Schema::create('password_reset_tokens', function (Blueprint $table) { $table->string('email')->primary(); $table->string('token'); $table->timestamp('created_at')->nullable(); }); + // SESSIONS TABLE Schema::create('sessions', function (Blueprint $table) { $table->string('id')->primary(); $table->foreignId('user_id')->nullable()->index(); @@ -42,8 +58,8 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('users'); - Schema::dropIfExists('password_reset_tokens'); Schema::dropIfExists('sessions'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('users'); } }; diff --git a/database/migrations/2025_11_06_131937_create_mark_lists_table.php b/database/migrations/2025_11_06_131937_create_mark_lists_table.php new file mode 100644 index 0000000..dda2f24 --- /dev/null +++ b/database/migrations/2025_11_06_131937_create_mark_lists_table.php @@ -0,0 +1,45 @@ +id(); + + // Order as requested: + $table->string('mark_no'); + $table->string('origin'); + $table->string('destination'); + $table->string('customer_name'); + $table->string('mobile_no'); + $table->unsignedBigInteger('customer_id'); + $table->date('date')->nullable(); + $table->enum('status', ['active', 'inactive'])->default('active'); + + $table->timestamps(); + + // Foreign key constraint + $table->foreign('customer_id') + ->references('id') + ->on('users') + ->onDelete('cascade'); + }); +} + + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('mark_lists'); + } +}; diff --git a/public/img/kent-logo.png b/public/img/kent-logo.png new file mode 100644 index 0000000..031d25e Binary files /dev/null and b/public/img/kent-logo.png differ diff --git a/resources/views/admin/login.blade.php b/resources/views/admin/login.blade.php index c733597..452cc7e 100644 --- a/resources/views/admin/login.blade.php +++ b/resources/views/admin/login.blade.php @@ -5,13 +5,19 @@ +
-

Admin Login

+ {{-- Kent Logo --}} + KENT Logo +

Admin Login

+
@if ($errors->any())
@@ -38,5 +44,6 @@
+ diff --git a/resources/views/admin/requests.blade.php b/resources/views/admin/requests.blade.php index b95e44d..dd0ef3d 100644 --- a/resources/views/admin/requests.blade.php +++ b/resources/views/admin/requests.blade.php @@ -4,45 +4,73 @@ @section('content')
-
-
- -
- 3 Pending - 1 Approved - 1 Rejected -
+
+
Pending User Requests
+
+ @if(session('success')) +
{{ session('success') }}
+ @elseif(session('error')) +
{{ session('error') }}
+ @elseif(session('info')) +
{{ session('info') }}
+ @endif - - - - - - - - - - - - - - - - - - - - - - - - - -
Request IDRequesterCompanyTypePriorityDateStatusActions
REQ-2024-001Amit Patel
amit.patel@example.com
Tech Solutions Pvt. Ltd.New AccountHigh2024-09-01Pending - - -
-
+ + + + + + + + + + + + + + + + + + @forelse($requests as $req) + + + + + + + + + + + + + + @empty + + + + @endforelse + +
#Request IDNameCompanyEmailMobileAddressPriorityDateStatusActions
{{ $req->id }}{{ $req->request_id }}{{ $req->customer_name }}{{ $req->company_name }}{{ $req->email }}{{ $req->mobile_no }}{{ $req->address }}{{ $req->priority }}{{ $req->date }} + @if($req->status == 'approved') + Approved + @elseif($req->status == 'rejected') + Rejected + @else + Pending + @endif + + @if($req->status == 'pending' || $req->status == null) + Approve + Reject + @else + N/A + @endif +
No requests found
+
@endsection diff --git a/routes/api.php b/routes/api.php index 69783df..fc52089 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,12 +1,12 @@ group(function () { - Route::post('/logout', [AuthController::class, 'logout']); - Route::post('/refresh', [AuthController::class, 'refresh']); -}); +//login / logout +Route::post('/user/login', [UserAuthController::class, 'login']); +Route::post('/user/logout', [UserAuthController::class, 'logout'])->middleware('auth:api'); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 87a658b..38881e1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,9 +1,12 @@ group(function () { - Route::get('/login', [AdminAuthController::class, 'showLoginForm'])->name('admin.login'); - Route::post('/login', [AdminAuthController::class, 'login'])->name('admin.login.submit'); - Route::post('/logout', [AdminAuthController::class, 'logout'])->name('admin.logout'); + Route::get('login', [AdminAuthController::class, 'showLoginForm'])->name('admin.login'); + Route::post('login', [AdminAuthController::class, 'login'])->name('admin.login.submit'); + Route::post('logout', [AdminAuthController::class, 'logout'])->name('admin.logout'); }); // ------------------------- -// Protected Admin Panel Routes +// Protected Admin Routes // ------------------------- Route::prefix('admin')->middleware('auth:admin')->group(function () { + // Dashboard Pages Route::get('/dashboard', fn() => view('admin.dashboard'))->name('admin.dashboard'); Route::get('/shipments', fn() => view('admin.shipments'))->name('admin.shipments'); Route::get('/invoice', fn() => view('admin.invoice'))->name('admin.invoice'); @@ -28,7 +32,11 @@ Route::prefix('admin')->middleware('auth:admin')->group(function () { Route::get('/reports', fn() => view('admin.reports'))->name('admin.reports'); Route::get('/chat-support', fn() => view('admin.chat_support'))->name('admin.chat_support'); Route::get('/orders', fn() => view('admin.orders'))->name('admin.orders'); - Route::get('/requests', fn() => view('admin.requests'))->name('admin.requests'); Route::get('/staff', fn() => view('admin.staff'))->name('admin.staff'); Route::get('/account', fn() => view('admin.account'))->name('admin.account'); + + // ✅ User Requests Controller Routes + Route::get('/requests', [UserRequestController::class, 'index'])->name('admin.requests'); + Route::get('/requests/approve/{id}', [UserRequestController::class, 'approve'])->name('admin.requests.approve'); + Route::get('/requests/reject/{id}', [UserRequestController::class, 'reject'])->name('admin.requests.reject'); });