From 6e13eb85a862bf8c8a20bc547f7eee9a85641c5c Mon Sep 17 00:00:00 2001 From: Arthur Rand Date: Wed, 18 Apr 2018 10:47:13 -0700 Subject: [API-1498] add url method to blobStorage (#157) * add url method to blobStorage * typo * typo * address comments * address comments * remove * scalafmt --- src/main/scala/xyz/driver/core/storage/BlobStorage.scala | 5 +++++ src/main/scala/xyz/driver/core/storage/FileSystemBlobStorage.scala | 7 +++++++ src/main/scala/xyz/driver/core/storage/GcsBlobStorage.scala | 7 +++++++ src/test/scala/xyz/driver/core/BlobStorageTest.scala | 5 +++++ 4 files changed, 24 insertions(+) diff --git a/src/main/scala/xyz/driver/core/storage/BlobStorage.scala b/src/main/scala/xyz/driver/core/storage/BlobStorage.scala index b12230e..ee6c5d7 100644 --- a/src/main/scala/xyz/driver/core/storage/BlobStorage.scala +++ b/src/main/scala/xyz/driver/core/storage/BlobStorage.scala @@ -38,6 +38,11 @@ trait BlobStorage { /** Delete a stored value. */ def delete(name: String): Future[String] + /** + * Path to specified resource. Checks that the resource exists and returns None if + * it is not found. Depending on the implementation, may throw. + */ + def url(name: String): Future[Option[URL]] } trait SignedBlobStorage extends BlobStorage { diff --git a/src/main/scala/xyz/driver/core/storage/FileSystemBlobStorage.scala b/src/main/scala/xyz/driver/core/storage/FileSystemBlobStorage.scala index 80076b6..e12c73d 100644 --- a/src/main/scala/xyz/driver/core/storage/FileSystemBlobStorage.scala +++ b/src/main/scala/xyz/driver/core/storage/FileSystemBlobStorage.scala @@ -1,5 +1,6 @@ package xyz.driver.core.storage +import java.net.URL import java.nio.file.{Files, Path, StandardCopyOption} import akka.stream.scaladsl.{FileIO, Sink, Source} @@ -72,4 +73,10 @@ class FileSystemBlobStorage(root: Path)(implicit ec: ExecutionContext) extends B name } + override def url(name: String): Future[Option[URL]] = exists(name) map { + case true => + Some(root.resolve(name).toUri.toURL) + case false => + None + } } diff --git a/src/main/scala/xyz/driver/core/storage/GcsBlobStorage.scala b/src/main/scala/xyz/driver/core/storage/GcsBlobStorage.scala index c176d12..95164c7 100644 --- a/src/main/scala/xyz/driver/core/storage/GcsBlobStorage.scala +++ b/src/main/scala/xyz/driver/core/storage/GcsBlobStorage.scala @@ -68,6 +68,13 @@ class GcsBlobStorage(client: Storage, bucketId: String, chunkSize: Int = GcsBlob Option(bucket.get(name)).map(blob => blob.signUrl(duration.length, duration.unit)) } + override def url(name: String): Future[Option[URL]] = Future { + val protocol: String = "https" + val resourcePath: String = s"storage.googleapis.com/${bucket.getName}/" + Option(bucket.get(name)).map { blob => + new URL(protocol, resourcePath, blob.getName) + } + } } object GcsBlobStorage { diff --git a/src/test/scala/xyz/driver/core/BlobStorageTest.scala b/src/test/scala/xyz/driver/core/BlobStorageTest.scala index 65f9cbc..637f9e0 100644 --- a/src/test/scala/xyz/driver/core/BlobStorageTest.scala +++ b/src/test/scala/xyz/driver/core/BlobStorageTest.scala @@ -80,6 +80,11 @@ class BlobStorageTest extends FlatSpec with ScalaFutures { assert(storage.list("a").futureValue === Set("a/a.txt", "a/b")) assert(storage.list("c").futureValue === Set("c/d")) } + it should "get valid URL" in { + assert(storage.exists(key).futureValue === true) + val fooUrl = storage.url(key).futureValue + assert(fooUrl.isDefined) + } } "File system storage" should behave like storageBehaviour( -- cgit v1.2.3