in image-loader/app/controllers/ImageLoaderController.scala [252:310]
def loadImage(uploadedBy: Option[String], identifiers: Option[String], uploadTime: Option[String], filename: Option[String]): Action[DigestedFile] = {
val uploadTimeToRecord = DateTimeUtils.fromValueOrNow(uploadTime)
val initialContext = MarkerMap(
"requestType" -> "load-image",
"uploadedBy" -> uploadedBy.getOrElse(FALLBACK),
"identifiers" -> identifiers.getOrElse(FALLBACK),
"uploadTime" -> uploadTimeToRecord.toString,
"filename" -> filename.getOrElse(FALLBACK)
)
logger.info(initialContext, "loadImage request start")
// synchronous write to file
val tempFile = createTempFile("requestBody")(initialContext)
logger.info(initialContext, "body parsed")
val parsedBody = DigestBodyParser.create(tempFile)
AuthenticatedAndAuthorised.async(parsedBody) { req =>
val uploadedByToRecord = uploadedBy.getOrElse(Authentication.getIdentity(req.user))
implicit val context: LogMarker =
initialContext ++ Map(
"uploadedBy" -> uploadedByToRecord,
"requestId" -> RequestLoggingFilter.getRequestId(req)
)
val uploadStatus = if(config.uploadToQuarantineEnabled) StatusType.Pending else StatusType.Completed
val uploadExpiry = Instant.now.getEpochSecond + config.uploadStatusExpiry.toSeconds
val record = UploadStatusRecord(req.body.digest, filename, uploadedByToRecord, printDateTime(uploadTimeToRecord), identifiers, uploadStatus, None, uploadExpiry)
val result = for {
uploadRequest <- uploader.loadFile(
req.body,
uploadedByToRecord,
identifiers,
uploadTimeToRecord,
filename.flatMap(_.trim.nonEmptyOpt)
)
_ <- uploadStatusTable.setStatus(record)
result <- quarantineOrStoreImage(uploadRequest)
} yield result
result.onComplete( _ => Try { deleteTempFile(tempFile) } )
result map { r =>
val result = Accepted(r).as(ArgoMediaType)
logger.info(context, "loadImage request end")
result
} recover {
case NonFatal(e) =>
logger.error(context, "loadImage request ended with a failure", e)
val response = e match {
case e: UnsupportedMimeTypeException => FailureResponse.unsupportedMimeType(e, config.supportedMimeTypes)
case e: ImageProcessingException => FailureResponse.notAnImage(e, config.supportedMimeTypes)
case e: java.io.IOException => FailureResponse.badImage(e)
case other => FailureResponse.internalError(other)
}
FailureResponse.responseToResult(response)
}
}
}