userFinder = $userFinder; $this->passwordHash = $passwordHash; } public function login(Data $data, Request $request): Result { $username = $data->getUsername(); $password = $data->getPassword(); $authToken = $data->getAuthToken(); if (!$username) { return Result::fail(FailReason::NO_USERNAME); } if (!$password) { return Result::fail(FailReason::NO_PASSWORD); } $hash = $authToken ? $authToken->getHash() : $this->passwordHash->hash($password); if (!$hash) { throw new RuntimeException("No hash."); } $user = $this->userFinder->find($username, $hash); if (!$user) { return Result::fail(FailReason::WRONG_CREDENTIALS); } if ($authToken && $user->getId() !== $authToken->getUserId()) { return Result::fail(FailReason::USER_TOKEN_MISMATCH); } return Result::success($user); } }