in image-loader/app/model/Uploader.scala [127:198]
private[model] def uploadAndStoreImage(storeOrProjectOriginalFile: StorableOriginalImage => Future[S3Object],
storeOrProjectThumbFile: StorableThumbImage => Future[S3Object],
storeOrProjectOptimisedFile: StorableOptimisedImage => Future[S3Object],
optimiseOps: OptimiseOps,
uploadRequest: UploadRequest,
deps: ImageUploadOpsDependencies,
fileMetadata: FileMetadata,
processor: ImageProcessor)
(implicit ec: ExecutionContext, logMarker: LogMarker) = {
val originalMimeType = uploadRequest.mimeType
.orElse(MimeTypeDetection.guessMimeType(uploadRequest.tempFile).toOption)
match {
case Some(a) => a
case None => throw new Exception("File of unknown and undetectable mime type")
}
val tempDirForRequest: File = Files.createTempDirectory(deps.config.tempDir.toPath, "upload").toFile
val colourModelFuture = ImageOperations.identifyColourModel(uploadRequest.tempFile, originalMimeType)
val sourceDimensionsFuture = FileMetadataReader.dimensions(uploadRequest.tempFile, Some(originalMimeType))
val storableOriginalImage = StorableOriginalImage(
uploadRequest.imageId,
uploadRequest.tempFile,
originalMimeType,
uploadRequest.uploadTime,
toMetaMap(uploadRequest)
)
val sourceStoreFuture = storeOrProjectOriginalFile(storableOriginalImage)
val eventualBrowserViewableImage = createBrowserViewableFileFuture(uploadRequest, tempDirForRequest, deps)
val eventualImage = for {
browserViewableImage <- eventualBrowserViewableImage
s3Source <- sourceStoreFuture
mergedUploadRequest = patchUploadRequestWithS3Metadata(uploadRequest, s3Source)
optimisedFileMetadata <- FileMetadataReader.fromIPTCHeadersWithColorInfo(browserViewableImage)
thumbViewableImage <- createThumbFuture(optimisedFileMetadata, colourModelFuture, browserViewableImage, deps, tempDirForRequest)
s3Thumb <- storeOrProjectThumbFile(thumbViewableImage)
maybeStorableOptimisedImage <- getStorableOptimisedImage(
tempDirForRequest, optimiseOps, browserViewableImage, optimisedFileMetadata, deps.tryFetchOptimisedFile)
s3PngOption <- maybeStorableOptimisedImage match {
case Some(storableOptimisedImage) => storeOrProjectOptimisedFile(storableOptimisedImage).map(a=>Some(a))
case None => Future.successful(None)
}
sourceDimensions <- sourceDimensionsFuture
thumbDimensions <- FileMetadataReader.dimensions(thumbViewableImage.file, Some(thumbViewableImage.mimeType))
colourModel <- colourModelFuture
} yield {
val fullFileMetadata = fileMetadata.copy(colourModel = colourModel)
val metadata = ImageMetadataConverter.fromFileMetadata(fullFileMetadata, s3Source.metadata.objectMetadata.lastModified)
val sourceAsset = Asset.fromS3Object(s3Source, sourceDimensions)
val thumbAsset = Asset.fromS3Object(s3Thumb, thumbDimensions)
val pngAsset = s3PngOption.map(Asset.fromS3Object(_, sourceDimensions))
val baseImage = ImageUpload.createImage(mergedUploadRequest, sourceAsset, thumbAsset, pngAsset, fullFileMetadata, metadata)
val processedImage = processor(baseImage)
logger.info(logMarker, s"Ending image ops")
// FIXME: dirty hack to sync the originalUsageRights and originalMetadata as well
processedImage.copy(
originalMetadata = processedImage.metadata,
originalUsageRights = processedImage.usageRights
)
}
eventualImage.onComplete{ _ =>
tempDirForRequest.listFiles().map(f => f.delete())
tempDirForRequest.delete()
}
eventualImage
}