From 452b6a07008c54ce28dbf58e5ae8893012f5ef96 Mon Sep 17 00:00:00 2001 From: Rahul Rudragoudar Date: Fri, 16 Apr 2021 20:15:34 +0530 Subject: [PATCH] Add pattern matching to handle error Remove try except blocks Signed-off-by: Rahul Rudragoudar --- src/main/scala/lc/core/captcha.scala | 85 ++++++++++--------- src/main/scala/lc/core/captchaProviders.scala | 17 ++-- 2 files changed, 55 insertions(+), 47 deletions(-) diff --git a/src/main/scala/lc/core/captcha.scala b/src/main/scala/lc/core/captcha.scala index 65465f8..385c6b1 100644 --- a/src/main/scala/lc/core/captcha.scala +++ b/src/main/scala/lc/core/captcha.scala @@ -12,17 +12,16 @@ import java.sql.Blob object Captcha { def getCaptcha(id: Id): Either[Error, Image] = { - try { - val blob = getImage(id.id).get - if (blob != null) { - Right(Image(blob.getBytes(1, blob.length().toInt))) - } else { - Left(Error(ErrorMessageEnum.IMG_MISSING.toString)) - } - } catch { - case _: NoSuchElementException => { - Left(Error(ErrorMessageEnum.IMG_NOT_FOUND.toString)) + val blob = getImage(id.id) + blob match { + case Some(value) => { + if (blob != null) { + Right(Image(value.getBytes(1, value.length().toInt))) + } else { + Left(Error(ErrorMessageEnum.IMG_MISSING.toString)) + } } + case None => Left(Error(ErrorMessageEnum.IMG_NOT_FOUND.toString)) } } @@ -37,14 +36,19 @@ object Captcha { } } - def generateChallenge(param: Parameters): Int = { + def generateChallenge(param: Parameters): Option[Int] = { val provider = CaptchaProviders.getProvider(param) - val providerId = provider.getId() - val challenge = provider.returnChallenge() - val blob = new ByteArrayInputStream(challenge.content) - val token = insertCaptcha(provider, challenge, providerId, param, blob).get - // println("Added new challenge: " + token.toString) - token.asInstanceOf[Int] + provider match { + case Some(value) => { + val providerId = value.getId() + val challenge = value.returnChallenge() + val blob = new ByteArrayInputStream(challenge.content) + val token = insertCaptcha(value, challenge, providerId, param, blob) + // println("Added new challenge: " + token.toString) + token.map(_.toInt) + } + case None => None + } } private def insertCaptcha( @@ -85,21 +89,22 @@ object Captcha { } def getChallenge(param: Parameters): Either[Error, Id] = { - try { - val validParam = validateParam(param) - if (validParam.isEmpty) { - val tokenOpt = getToken(param) - val token = tokenOpt.getOrElse(generateChallenge(param)) - val uuid = getUUID(token) - updateAttempted(uuid) - Right(Id(uuid)) - } else { - Left(Error(ErrorMessageEnum.INVALID_PARAM.toString + " => " + validParam.mkString(", "))) - } - } catch { - case _: NoSuchElementException => { - Left(Error(ErrorMessageEnum.NO_CAPTCHA.toString)) + val validParam = validateParam(param) + if (validParam.isEmpty) { + val tokenOpt = getToken(param) + val token = tokenOpt.orElse(generateChallenge(param)) + token match { + case Some(value) => { + val uuid = getUUID(value) + updateAttempted(uuid) + Right(Id(uuid)) + } + case None => { + Left(Error(ErrorMessageEnum.NO_CAPTCHA.toString)) + } } + } else { + Left(Error(ErrorMessageEnum.INVALID_PARAM.toString + " => " + validParam.mkString(", "))) } } @@ -132,15 +137,15 @@ object Captcha { } def checkAnswer(answer: Answer): Either[Error, Success] = { - try { - val (provider, secret) = getSecret(answer.id).get - val check = CaptchaProviders.getProviderById(provider).checkAnswer(secret, answer.answer) - deleteCaptcha(answer.id) - val result = if (check) ResultEnum.TRUE.toString else ResultEnum.FALSE.toString - Right(Success(result)) - } catch { - case _: NoSuchElementException => { - Right(Success(ResultEnum.EXPIRED.toString)) + val challenge = getSecret(answer.id) + challenge match { + case None => Right(Success(ResultEnum.EXPIRED.toString)) + case Some(value) => { + val (provider, secret) = value + val check = CaptchaProviders.getProviderById(provider).checkAnswer(secret, answer.answer) + deleteCaptcha(answer.id) + val result = if (check) ResultEnum.TRUE.toString else ResultEnum.FALSE.toString + Right(Success(result)) } } } diff --git a/src/main/scala/lc/core/captchaProviders.scala b/src/main/scala/lc/core/captchaProviders.scala index 4606983..8a61841 100644 --- a/src/main/scala/lc/core/captchaProviders.scala +++ b/src/main/scala/lc/core/captchaProviders.scala @@ -55,13 +55,16 @@ object CaptchaProviders { providerFilter } - def getProvider(param: Parameters): ChallengeProvider = { + def getProvider(param: Parameters): Option[ChallengeProvider] = { val providerConfig = filterProviderByParam(param).toList - if (providerConfig.length == 0) throw new NoSuchElementException(ErrorMessageEnum.NO_CAPTCHA.toString) - val randomIndex = getNextRandomInt(providerConfig.length) - val providerIndex = providerConfig(randomIndex)._1 - val selectedProvider = providers(providerIndex) - selectedProvider.configure(providerConfig(randomIndex)._2) - selectedProvider + if (providerConfig.length > 0) { + val randomIndex = getNextRandomInt(providerConfig.length) + val providerIndex = providerConfig(randomIndex)._1 + val selectedProvider = providers(providerIndex) + selectedProvider.configure(providerConfig(randomIndex)._2) + Some(selectedProvider) + } else { + None + } } }