Felix
Felix

Reputation: 5619

scala playframework returning Ok in flatMap

i have the following function:

def createProcessTemplate: Action[AnyContent] = Action.async { implicit request =>
    println(request.body.asJson)
    request.body.asJson.map(_.validate[ProcessTemplatesModel] match {
      case JsSuccess(process, _) =>
        processTemplateDTO.createProcessTemplate(process).map {
          process => {

            // Create process steps templates
            createNewProcessStepTemplate(request, process.id.get)


            // Create prerequisites
            createProcessTemplatePrerequisite(request, process.id.get)

            // Create postConditions
            createProcessTemplatePostCondition(request, process.id.get)

            processTemplateDTO.getProcessStepTemplates(process.id.get).flatMap(
              steps => Ok(Json.obj("id" -> process.id, "title" -> process.title, "steps" -> steps)))
          }
        }
      case JsError(_) =>
        Future.successful(BadRequest("Process Template not create client"))
      case _ => Future.successful(BadRequest("Process Template create client"))
    }).getOrElse(Future.successful(BadRequest("Process Template create client")))
  }

I want to return the steps in the Ok Statement, but got this error:

enter image description here

what could be the problem in this case?

thanks

Upvotes: 1

Views: 62

Answers (1)

Paweł Motyl
Paweł Motyl

Reputation: 1342

Try this code:

def createProcessTemplate: Action[AnyContent] = Action.async { implicit request =>
println(request.body.asJson)
request.body.asJson.map(_.validate[ProcessTemplatesModel] match {
  case JsSuccess(process, _) =>
    processTemplateDTO.createProcessTemplate(process).flatMap {
      process => {

        // Create process steps templates
        createNewProcessStepTemplate(request, process.id.get)


        // Create prerequisites
        createProcessTemplatePrerequisite(request, process.id.get)

        // Create postConditions
        createProcessTemplatePostCondition(request, process.id.get)

        processTemplateDTO.getProcessStepTemplates(process.id.get).map(
          steps => Ok(Json.obj("id" -> process.id, "title" -> process.title, "steps" -> steps)))
      }
    }
  case JsError(_) =>
    Future.successful(BadRequest("Process Template not create client"))
  case _ => Future.successful(BadRequest("Process Template create client"))
}).getOrElse(Future.successful(BadRequest("Process Template create client")))

}

I've switched the map and flatMap that appear around calls to processTemplateDTO methods. In the first one you need flatMap because you return a Future, but in the second one you actually want a map because you return a Result.

Upvotes: 2

Related Questions