Add pattern matching to handle error

Remove try except blocks

Signed-off-by: Rahul Rudragoudar <rr83019@gmail.com>
This commit is contained in:
Rahul Rudragoudar 2021-04-16 20:15:34 +05:30
parent 33cd6c0525
commit 452b6a0700
No known key found for this signature in database
GPG Key ID: 0D2CE231A7287EBC
2 changed files with 55 additions and 47 deletions

View File

@ -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))
}
}
}

View File

@ -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
}
}
}