def allowedStages()

in riff-raff/app/controllers/DeployController.scala [199:242]


  def allowedStages(project: String, id: String) = AuthAction { request =>
    val allStages = prismLookup.stages
    def asJsonResponse(stages: Seq[String]) =
      Ok(Json.toJson(stages).toString()).as("application/json")

    def defaultStage(stages: Seq[String]): Option[String] = {
      val sorted = stages.sorted
      val code = sorted.find(stage => stage.contains("CODE"))
      val nonProd = sorted.find(stage => !stage.contains("PROD"))
      code.orElse(nonProd).orElse(stages.headOption)
    }

    def asHtmlResponse(stages: Seq[String], selected: Option[String]) = {
      val stageOptions = stages.map(stage => {
        val isSelected = if (selected.contains(stage)) "selected" else ""
        s"<option ${isSelected} value=\"${stage}\">${stage}</option>"
      })

      val options =
        s"""<option value="" class="blank">--- Choose a stage ---</option>${stageOptions.mkString}""".stripMargin;

      Ok(options)
    }

    if (project.trim.isEmpty || id.trim.isEmpty) {
      asHtmlResponse(allStages, None)
    } else {
      val build = Build(project, id)
      val artifact = S3YamlArtifact(build, config.artifact.aws.bucketName)
      val deployObjectPath = artifact.deployObject
      val deployObjectContent = S3Location.fetchContentAsString(
        deployObjectPath
      )(config.artifact.aws.client)

      val allowedStages = for {
        content <- deployObjectContent.map(Some.apply).getOrElse(None)
        config <- RiffRaffYamlReader.fromString(content).toOption
        allowedStages <- config.allowedStages
      } yield allowedStages

      val stages = allowedStages.getOrElse(allStages)
      asHtmlResponse(stages, defaultStage(stages))
    }
  }