app/domain/externals/google/CustomeSearchAdapter.scala (43 lines of code) (raw):

package domain.externals.google import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global import play.api.libs.json._ import play.api.libs.functional.syntax._ /** GoogleCustomSearchClientを利用する */ object CustomSearchService extends CustomSearchServiceTrait { } trait CustomSearchServiceTrait { implicit val imageReads: Reads[Image] = ( (__ \ "byteSize").read[Int] and (__ \ "contextLink").read[String] and (__ \ "height").read[Int] and (__ \ "width").read[Int] and (__ \ "thumbnailHeight").read[Int] and (__ \ "thumbnailWidth").read[Int] and (__ \ "thumbnailLink").read[String] )(Image) implicit val itemReads: Reads[Item] = ( (__ \ "displayLink").read[String] and (__ \ "htmlSnippet").read[String] and (__ \ "htmlTitle").read[String] and (__ \ "image").read[Image] and (__ \ "kind").read[String] and (__ \ "link").read[String] and (__ \ "mime").read[String] and (__ \ "snippet").read[String] and (__ \ "title").read[String] )(Item) val client = infra.apiclient.GoogleCustomSearchClient def items(keyword: String): Future[Option[Seq[Item]]] = { client.search(keyword).map { wsResponse => (wsResponse.json \ "items").asOpt[Seq[Item]] } } /** * @param keyword: String 画像検索するキーワード * @return Future[Option[Seq[String]]] **/ def imageUrls(keyword: String): Future[Option[Seq[String]]] = { client.search(keyword).map { wsResponse => (wsResponse.json \ "items").asOpt[Seq[Item]] match { case None => None case Some(items) => Some(items.map(item => item.link)) } } } }