app/controllers/Application.scala (78 lines of code) (raw):
package controllers
import play.api.mvc._
import model._
import java.text.DecimalFormat
import play.api.libs.json.{Json, Writes}
import com.amazonaws.services.cloudwatch.model.Datapoint
import com.gu.googleauth._
import scala.util.Random
import play.api.libs.ws.WSClient
import scala.concurrent.Future
class Application(
wsClient:WSClient,
authAction: AuthAction[AnyContent],
awsCost: AWSCost,
estateProvider: EstateProvider,
controllerComponents: ControllerComponents)
extends AbstractController(controllerComponents) {
implicit val moneyFormat = new DecimalFormat("#,###")
implicit val datapointWrites: Writes[Datapoint] = new Writes[Datapoint] {
override def writes(d: Datapoint) = Json.obj(
"x" -> d.getTimestamp.getTime,
"y" -> d.getAverage.toInt
)
}
def index = authAction { implicit req =>
estateProvider().stageNames.headOption map (stage =>
Redirect(routes.Application.stage(stage))
) getOrElse Ok(views.html.loading(estateProvider))
}
def stageJson(stage: String) = authAction {
import ASG.writes
Ok(Json.toJson(
estateProvider()(stage)
))
}
def stage(stage: String) = authAction { implicit req =>
if (estateProvider().populated)
Ok(views.html.index(
stage,
awsCost.totalSunkCost,
estateProvider
))
else
Ok(views.html.loading(estateProvider))
}
def queues = authAction {
implicit val queueWrites = Json.writes[Queue]
Ok(Json.toJson(
estateProvider().queues
))
}
def instance(id: String) = authAction { implicit req =>
val instance = for {
asg <- estateProvider().asgs
member <- asg.members if member.id == id
} yield member
instance.headOption map (i => Ok(views.html.instance(i.instance, estateProvider))) getOrElse NotFound(views.html.instanceNotFound(id, estateProvider))
}
def es(name: String) = authAction.async { implicit req =>
import scala.concurrent.ExecutionContext.Implicits.global
(for {
asg <- estateProvider().asgs if asg.name.exists(_ == name)
stats <- Random.shuffle(asg.members).headOption map (m => wsClient.url(s"http://${m.instance.publicDns}:9200/_nodes/stats?groups=_all").get())
} yield stats map { r =>
Ok(views.html.elasticsearch(ElasticsearchStatsGroups.parse(r.json), estateProvider))
}).headOption.getOrElse(Future.successful(NotFound))
}
def void = Action {
NotFound
}
def robots = Action {
Ok(
"""
|User-agent: *
|Disallow: *
""".stripMargin)
}
}