From 0b802f1154e0d66c6dd889f3206afa791224d1e7 Mon Sep 17 00:00:00 2001 From: Andrew Nowak Date: Mon, 6 Jul 2026 12:15:46 +0100 Subject: [PATCH] make return value of projectS3Image non-optional --- image-loader/app/ImageLoaderComponents.scala | 2 +- .../app/controllers/ImageLoaderController.scala | 12 +++++------- image-loader/app/model/Projector.scala | 14 +++++--------- image-loader/test/scala/model/ProjectorTest.scala | 3 +-- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/image-loader/app/ImageLoaderComponents.scala b/image-loader/app/ImageLoaderComponents.scala index be7748d9525..7241c5c3692 100644 --- a/image-loader/app/ImageLoaderComponents.scala +++ b/image-loader/app/ImageLoaderComponents.scala @@ -37,7 +37,7 @@ class ImageLoaderComponents(context: Context) extends GridComponents(context, ne } val uploader = new Uploader(store, config, imageOperations, notifications, maybeEmbedder, imageProcessor, gridClient, auth) - val projector = Projector(config, imageOperations, imageProcessor, auth, maybeEmbedder) + val projector = Projector(config, imageOperations, imageProcessor, maybeEmbedder) val quarantineUploader: Option[QuarantineUploader] = config.maybeQuarantineBucket.map(_ => new QuarantineUploader(new QuarantineStore(config), config) ) diff --git a/image-loader/app/controllers/ImageLoaderController.scala b/image-loader/app/controllers/ImageLoaderController.scala index ab44b57a88f..918952234dc 100644 --- a/image-loader/app/controllers/ImageLoaderController.scala +++ b/image-loader/app/controllers/ImageLoaderController.scala @@ -382,16 +382,14 @@ class ImageLoaderController(auth: Authentication, result.onComplete( _ => Try { deleteTempFile(tempFile) } ) - result.map { - case Some(img) => - logger.info(context, "image found") - Ok(Json.toJson(img)).as(ArgoMediaType) - case None => + result.map { img => + logger.info(context, "image found") + Ok(Json.toJson(img)).as(ArgoMediaType) + } recover { + case _: NoSuchImageExistsInS3 => val s3Path = "s3://" + config.imageBucket + "/" + ImageIngestOperations.fileKeyFromId(imageId) logger.info(context, "image not found") respondError(NotFound, "image-not-found", s"Could not find image: $imageId in s3 at $s3Path") - } recover { - case _: NoSuchImageExistsInS3 => NotFound(Json.obj("imageId" -> imageId)) case e => logger.error(context, s"projectImageBy request for id $imageId ended with a failure", e) InternalServerError(Json.obj("imageId" -> imageId, "exception" -> e.getMessage)) diff --git a/image-loader/app/model/Projector.scala b/image-loader/app/model/Projector.scala index 20b222382a1..24c79072290 100644 --- a/image-loader/app/model/Projector.scala +++ b/image-loader/app/model/Projector.scala @@ -30,8 +30,8 @@ object Projector { import Uploader.toImageUploadOpsCfg - def apply(config: ImageLoaderConfig, imageOps: ImageOperations, processor: ImageProcessor, auth: Authentication, maybeEmbedder: Option[Embedder])(implicit ec: ExecutionContext): Projector - = new Projector(toImageUploadOpsCfg(config), S3Ops.buildS3Client(config), imageOps, processor, auth, maybeEmbedder) + def apply(config: ImageLoaderConfig, imageOps: ImageOperations, processor: ImageProcessor, maybeEmbedder: Option[Embedder])(implicit ec: ExecutionContext): Projector + = new Projector(toImageUploadOpsCfg(config), S3Ops.buildS3Client(config), imageOps, processor, maybeEmbedder) } case class S3FileExtractedMetadata( @@ -84,13 +84,12 @@ class Projector(config: ImageUploadOpsCfg, s3: AmazonS3, imageOps: ImageOperations, processor: ImageProcessor, - auth: Authentication, maybeEmbedder: Option[Embedder]) extends GridLogging { private val imageUploadProjectionOps = new ImageUploadProjectionOps(config, imageOps, processor, s3, maybeEmbedder) def projectS3ImageById(imageId: String, tempFile: File, gridClient: GridClient, onBehalfOfFn: WSRequest => WSRequest) - (implicit ec: ExecutionContext, logMarker: LogMarker): Future[Option[Image]] = { + (implicit ec: ExecutionContext, logMarker: LogMarker): Future[Image] = { Future { import ImageIngestOperations.fileKeyFromId val s3Key = fileKeyFromId(imageId) @@ -106,14 +105,11 @@ class Projector(config: ImageUploadOpsCfg, val digestedFile = getSrcFileDigestForProjection(s3Source, imageId, tempFile) val extractedS3Meta = S3FileExtractedMetadata(s3Source.getObjectMetadata) - val finalImageFuture = projectImage(digestedFile, extractedS3Meta, gridClient, onBehalfOfFn) - val finalImage = Await.result(finalImageFuture, Duration.Inf) - - Some(finalImage) + projectImage(digestedFile, extractedS3Meta, gridClient, onBehalfOfFn) } finally { s3Source.close() } - } + }.flatten } private def getSrcFileDigestForProjection(s3Src: AwsS3Object, imageId: String, tempFile: File) = { diff --git a/image-loader/test/scala/model/ProjectorTest.scala b/image-loader/test/scala/model/ProjectorTest.scala index eccec5b65f0..f13d1b1dff8 100644 --- a/image-loader/test/scala/model/ProjectorTest.scala +++ b/image-loader/test/scala/model/ProjectorTest.scala @@ -45,8 +45,7 @@ class ProjectorTest extends AnyFreeSpec with Matchers with ScalaFutures with Moc private val maybeEmbedder = None private val s3 = mock[AmazonS3] - private val auth = mock[Authentication] - private val projector = new Projector(config, s3, imageOperations, ImageProcessor.identity, auth, maybeEmbedder) + private val projector = new Projector(config, s3, imageOperations, ImageProcessor.identity, maybeEmbedder) // FIXME temporary ignored as test is not executable in CI/CD machine // because graphic lib files like srgb.icc, cmyk.icc are in root directory instead of resources