app/controllers/OwnerApi.scala (73 lines of code) (raw):

package controllers import agent.{CrawlRate, Label, Origin, ResourceType} import data.Owners import jsonimplicits.model._ import model.Owner import org.joda.time.DateTime import play.api.mvc._ import play.api.mvc.{RequestHeader, Result} import play.api.libs.json.{JsObject, Json, Writes} import play.api.libs.json.Json._ import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.concurrent.duration._ import scala.language.postfixOps import utils.ResourceFilter //noinspection TypeAnnotation class OwnerApi(cc: ControllerComponents)(implicit executionContext: ExecutionContext ) extends AbstractController(cc) { private def itemsResult[T]( key: String, items: => Iterable[T], baseObject: JsObject = Json.obj() )(implicit request: RequestHeader, tw: Writes[T]): Future[Result] = { ApiResult.filter { Map(ownerLabel -> items.toSeq) } reduce { collection => baseObject ++ Json.obj(key -> toJson(collection.values.flatten)) } } object OwnerResourceType extends ResourceType("Owners") val ownerLabel: Label = Label( OwnerResourceType, new Origin { val vendor = "prism" val account = "prism" val resources = Set("sources") val jsonFields = Map.empty[String, String] val crawlRate = Map("Owners" -> CrawlRate(30 days, 30 days)) override def toMarkerMap: Map[String, Any] = jsonFields }, Owners.all.size, DateTime.now ) def ownerList = Action.async { implicit request => val requestFilter = ResourceFilter.fromRequestWithDefaults() def filter(owner: Owner) = { val json = Json.toJson(owner) Some(json).filter(requestFilter.isMatch) } itemsResult( "owners", Owners.all.toSeq.flatMap(filter), Json.obj("defaultOwner" -> Owners.default) ) } def ownerForStack(stack: String) = Action.async { implicit request => val stage: Option[String] = request.getQueryString("stage") val app: Option[String] = request.getQueryString("app") val owner = Owners.forStack(stack, stage, app) itemsResult("owner", Some(owner)) } def owner(id: String) = Action.async { implicit request => val owner = Owners .find(id) .orElse( throw ApiCallException( Json.obj("id" -> s"Owner with id '$id' doesn't exist"), NOT_FOUND ) ) itemsResult("owner", owner) } }