validated(); $identifier = $data['identifier']; $password = $data['password']; $device = $data['device_name'] ?? $request->header('User-Agent') ?? 'api-client'; // Find user by email or username $user = User::where('email', $identifier) ->orWhere('username', $identifier) ->first(); if (!$user || !Hash::check($password, $user->password)) { throw ValidationException::withMessages([ 'identifier' => ['Email/username atau password yang diberikan salah.'], ]); } // Delete existing tokens for this device to prevent token accumulation $user->tokens()->where('name', $device)->delete(); // Create new token $token = $user->createToken($device)->plainTextToken; return response()->json([ 'success' => true, 'message' => 'Login berhasil', 'token' => $token, 'token_type' => 'Bearer', 'user' => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'username' => $user->username, 'roles' => $user->getRoleNames(), 'permissions' => $user->getAllPermissions()->pluck('name'), ], ]); } /** * Get authenticated user information */ public function me(Request $request) { $user = $request->user(); return response()->json([ 'success' => true, 'user' => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'username' => $user->username, 'roles' => $user->getRoleNames(), 'permissions' => $user->getAllPermissions()->pluck('name'), ], ]); } /** * Logout current API session (revoke current token) */ public function logout(Request $request) { $user = $request->user(); // Revoke current access token if ($user && method_exists($user, 'currentAccessToken')) { $token = $user->currentAccessToken(); if ($token) { $token->delete(); } } return response()->json([ 'success' => true, 'message' => 'Logout berhasil' ]); } /** * Logout from all devices (revoke all tokens) */ public function logoutAll(Request $request) { $user = $request->user(); // Revoke all tokens for this user $user->tokens()->delete(); return response()->json([ 'success' => true, 'message' => 'Logout dari semua perangkat berhasil' ]); } }