validate([ 'email' => 'required|email', 'password' => 'required' ]); $key = 'login:'.$request->email; // $key = 'login:'.$request->ip(); // Check if user exceeded limit if (RateLimiter::tooManyAttempts($key, $this->maxAttempts)) { $seconds = RateLimiter::availableIn($key); // seconds to wait $remaining = 0; return response()->json([ 'success' => false, 'message' => "Too many login attempts.", 'attempts_remaining' => $remaining, 'retry_after_seconds' => $seconds ], 429); } if (!Auth::attempt($request->only('email', 'password'))) { RateLimiter::hit($key, $this->decaySeconds); // 25 minutes decay $attemptsUsed = RateLimiter::attempts($key); $attemptsRemaining = 5 - $attemptsUsed; return response()->json([ 'success' => false, 'message' => 'Invalid credentials.', 'attempts_remaining' => $attemptsRemaining ], 401); } if (Auth::user()->is_locked) { return response()->json([ 'message' => 'Your account has been locked. Please contact support.' ], 403); } if (!Auth::user()->is_verified) { return response()->json([ 'message' => 'Please verify your email before logging in.' ], 403); } // Success: clear attempts RateLimiter::clear($key); $user = User::where('email', $request->email)->first(); return response()->json([ 'token' => $user->createToken('api-token')->plainTextToken, 'user' => $user, ]); } // Logout public function logout(Request $request) { $request->user()->currentAccessToken()->delete(); return response()->json(['message' => 'Logged out']); } // Example protected route public function profile(Request $request) { $user = $request->user(); $user->selfie_url = $user->selfie_url; $user->government_id_url = $user->government_id_url; return response()->json($user); } public function applicantProfile(Request $request, $id) { $cpcUser = $request->user(); $user = User::findOrFail($id); // if ($cpcUser->hasRole('cpc_user')) { // $user = User::findOrFail($id); // } else { // $user = $cpcUser; // } $user->selfie_url = $user->selfie_url; $user->government_id_url = $user->government_id_url; return response()->json($user); } public function register(Request $request) { $request->validate([ 'email_address' => 'required|email|unique:users,email,NULL,id,is_verified,1', 'password' => 'required|min:8|same:retypePassword', 'first_name' => 'required|string|max:255', 'last_name' => 'required|string|max:255', 'middle_name' => 'nullable|string|max:255', 'gender' => 'nullable|string|max:10', 'contact_number' => 'required|string|max:15', 'alt_email_address' => 'nullable|email|unique:users,alt_email', 'citizenship' => 'nullable|string|max:255', 'government_id' => 'nullable|file|mimes:jpg,jpeg,png,pdf', // 'government_id' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:4096', 'selfie' => 'nullable|image|mimes:jpg,jpeg,png', ]); // Create the user $user = new User(); if ($user->where('email', $request->email_address)->exists()) { $user->where('email', $request->email_address)->delete(); } $user->firstname = $request->first_name; $user->lastname = $request->last_name; $user->gender = $request->gender; $user->email = $request->email_address; $user->region = $request->region; $user->password = bcrypt($request->password); $user->phone = $request->contact_number; $user->alt_email = $request->alt_email_address; $user->citizenship = $request->citizenship; $user->save(); $govIdPath = null; $selfiePath = null; $user->assignRole('applicant'); if ($request->hasFile('government_id')) { PROC_DONE