app/controllers/ImageGenerateController.scala (67 lines of code) (raw):

package controllers import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import java.io.File import play.api._ import play.api.mvc._ import org.joda.time.DateTime import play.api.libs.Files.TemporaryFile import play.api.mvc.MultipartFormData.FilePart import play.api.libs.json._ import play.api.Play.current import play.api.libs.concurrent.Akka import akka.actor.Props import domain.image.ImageRepository import actors.ImageActor import actors.ImageGenerateMessage import actors.ImageDownloadAndGenerateMessage import infra.util.UrlBuilder import infra.datasource.ImageStorage /** 画像生成を行うコントロラー */ class ImageGenerateController extends BaseControllerTrait { /** 非同期で画像生成をするためのActor */ val imageActor = Akka.system.actorOf(Props(new ImageActor())) /** postされたurlから画像生成をする */ def withUrl = Action.async { request => val jsonOpt = request.body.asJson jsonOpt match { case None => Future(NOT_JSON_RESPONSE) case Some(json) => { (json \ "url").asOpt[String] match { case None => Future(PARAMETER_KEYWORD_NOT_FOUND_RESPONSE) case Some(url) => { val xForwardedFor = request.remoteAddress Logger.info(xForwardedFor) // とりあえずURLだけ先に払い出して返す ImageRepository.create() map { case None => DATABASE_CONNECTION_ERROR_RESPONSE case Some(id) => { val lgtmUrl = UrlBuilder.imageUrl(id.toString) imageActor ! ImageDownloadAndGenerateMessage(id, url) Ok(JsonBuilder.imageUrl(lgtmUrl)) } } } } } } } def withBinary = Action.async { request => request.body.asMultipartFormData match { case None => Future(INVALID_IMAGE_RESPONSE) case Some(data) => { data.file("file") match { case None => Future(INVALID_IMAGE_RESPONSE) case Some(file) => { // TODO file validation ImageRepository.create().map { case None => DATABASE_CONNECTION_ERROR_RESPONSE case Some(id) => { val lgtmImageUrl = UrlBuilder.imageUrl(id.toString) val tmpPath = ImageStorage.getTmpPath(id.toString) file.ref.moveTo(new File(tmpPath)) imageActor ! ImageGenerateMessage(id) Ok(JsonBuilder.imageUrl(lgtmImageUrl)) } } } } } } } }