app/controllers/Application.scala (64 lines of code) (raw):
package controllers
import java.io.File
import java.nio.file.{Files, Paths}
import java.text.SimpleDateFormat
import java.util.Calendar
import org.apache.pekko.stream.Materializer
import com.gu.pandomainauth.PublicSettings
import lib._
import play.api.mvc.{ControllerComponents, MaxSizeExceeded}
import play.api.libs.json._
import com.gu.permissions.PermissionsProvider
class Application(
s3Actions: S3Actions,
override val publicSettings: PublicSettings,
override val permissions: PermissionsProvider,
override val controllerComponents: ControllerComponents
)(implicit mat: Materializer) extends PandaController {
def index = AuthAction { request => {
Ok(views.html.index(request.user)(request))
}
}
def upload = AuthAction { request => {
Redirect(routes.Application.index)
}
}
def uploadChart = AuthAction (parse.maxLength(parse.DefaultMaxDiskLength, parse.multipartFormData)) { request =>
request.body match {
case Left(MaxSizeExceeded(limit)) => {
EntityTooLarge(views.html.tooLarge(request.user, bytesToMb(limit)))
}
case Right(multipartForm) => {
val uploads : Seq[S3UploadResponse] = multipartForm.files.map { f =>
val temporaryFilePath = Paths.get(s"/tmp/${f.filename}")
f.ref.moveTo(temporaryFilePath, replace = true)
val res = s3Actions.upload(temporaryFilePath.toFile, request.user, ChartsToolConfig, setPublicAcl = true)
Files.delete(temporaryFilePath)
res
}
uploads.head match {
case failure: S3UploadFailure => InternalServerError(Json.toJson(failure))
case success: S3UploadSuccess => Ok(Json.toJson(success))
}
}
}
}
private def bytesToMb (bytes: Long): Long = bytes / 1024 / 1024
def uploadFile = AuthAction (parse.maxLength(parse.DefaultMaxDiskLength, parse.multipartFormData)) { request =>
request.body match {
case Left(MaxSizeExceeded(limit)) => {
EntityTooLarge(views.html.tooLarge(request.user, bytesToMb(limit)))
}
case Right(multipartForm) => {
val uploads : Seq[S3UploadResponse] = multipartForm.files.map { f =>
val temporaryFilePath = Paths.get(s"/tmp/${f.filename}")
f.ref.moveTo(temporaryFilePath, replace = true)
val res = s3Actions.upload(temporaryFilePath.toFile, request.user, S3UploadAppConfig, setPublicAcl = false)
Files.delete(temporaryFilePath)
res
}
Ok(views.html.uploaded(request.user, uploads)(request))
}
}
}
}