Я новичок в Scala и в настоящее время пытаюсь работать с картой игры.Scala: Либо, вправо, влево
Это работает код, который я написал:
def authenticate = Action (BodyParsers.parse.json) { req =>
req.body.validate[AuthenticationForm].map {form =>
UserRepository.findByCredentials(form).map { user =>
user.apiKeys.find(_.deviceId == form.deviceId).map { apiKey =>
Ok(Json.toJson(apiKey))
}.getOrElse({
// HOW DO I TRANSFORM THIS INTO MORE BEAUTIFUL CODE
val createdApiKey = ApiKeyRepository.create(new ApiKey(form.deviceId, form.deviceId))
val userToWithNewApiKey = user.copy(apiKeys = user.apiKeys.:+(createdApiKey))
UserRepository.update(userToWithNewApiKey)
Ok(Json.toJson(createdApiKey))
})
}.getOrElse {
Unauthorized
}
}.getOrElse {
BadRequest
}
}
Ну, это не выглядит tooo приятно. Мы можем сделать лучше? Я еще не могу. Но я видел эту запись stackoverflow: https://stackoverflow.com/a/24085333/3038183 Это выглядит довольно хорошо :)
Теперь мне интересно, как преобразовать мой код, чтобы он выглядел в данном примере. Конечно, я уже пробовал, но я не мог скомпилировать его, а также не знаю, как обрабатывать код после комментария («КАК Я ПЕРЕДАЮ ЭТО В БОЛЬШЕ КРАСИВЕЙШЕГО КОДА»). В моем случае я использую play.api.mvc.Result вместо «Failure», как указано в ссылке выше. Итак, какого типа должен быть мой Ли [play.api.mvc.Result,? WhatHere?]?
С наилучшими пожеланиями
EDIT: Я принял ответ Трэвиса. Большое спасибо.
Для тех, кто заинтересован здесь лучше выглядит код, который я мог бы написать благодаря Travis:
def getApiKey(user: User, deviceId: String) : ApiKey = {
user.apiKeys.find(_.deviceId == deviceId).getOrElse {
val createdApiKey =
ApiKeyRepository.create(new ApiKey(deviceId, deviceId))
val userToWithNewApiKey =
user.copy(apiKeys = user.apiKeys.:+(createdApiKey))
UserRepository.update(userToWithNewApiKey)
createdApiKey
}
}
def authenticate = Action (BodyParsers.parse.json) { req =>
(for {
form <- req.body.validate[AuthenticationForm].asOpt.toRight(BadRequest).right
user <- UserRepository.findByCredentials(form).toRight(Unauthorized).right
} yield {
Ok(Json.toJson(getApiKey(user, form.deviceId)))
}).merge
}