diff options
Diffstat (limited to 'src/main/scala')
-rw-r--r-- | src/main/scala/xyz/driver/core/file/GcsStorage.scala | 12 | ||||
-rw-r--r-- | src/main/scala/xyz/driver/core/file/package.scala | 9 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/main/scala/xyz/driver/core/file/GcsStorage.scala b/src/main/scala/xyz/driver/core/file/GcsStorage.scala index d0a3dad..6c2746e 100644 --- a/src/main/scala/xyz/driver/core/file/GcsStorage.scala +++ b/src/main/scala/xyz/driver/core/file/GcsStorage.scala @@ -1,7 +1,9 @@ package xyz.driver.core.file import java.io.{BufferedOutputStream, File, FileInputStream, FileOutputStream} +import java.net.URL import java.nio.file.{Path, Paths} +import java.util.concurrent.TimeUnit import com.google.cloud.storage.Storage.BlobListOption import com.google.cloud.storage._ @@ -9,11 +11,12 @@ import xyz.driver.core.time.Time import xyz.driver.core.{Name, Revision, generators} import scala.collection.JavaConverters._ +import scala.concurrent.duration.Duration import scala.concurrent.{ExecutionContext, Future} import scalaz.{ListT, OptionT} class GcsStorage(storageClient: Storage, bucketName: Name[Bucket], executionContext: ExecutionContext) - extends FileStorage { + extends SignedFileStorage { implicit private val execution: ExecutionContext = executionContext override def upload(localSource: File, destination: Path): Future[Unit] = Future { @@ -69,4 +72,11 @@ class GcsStorage(storageClient: Storage, bucketName: Name[Bucket], executionCont blob.getSize ) } + + override def signedFileUrl(filePath: Path, duration: Duration): OptionT[Future, URL] = + OptionT.optionT(Future { + Option(storageClient.get(bucketName.value, filePath.toString)).filterNot(_.getSize == 0).map { blob => + blob.signUrl(duration.toSeconds, TimeUnit.SECONDS) + } + }) } diff --git a/src/main/scala/xyz/driver/core/file/package.scala b/src/main/scala/xyz/driver/core/file/package.scala index 8c06010..9000894 100644 --- a/src/main/scala/xyz/driver/core/file/package.scala +++ b/src/main/scala/xyz/driver/core/file/package.scala @@ -9,6 +9,11 @@ import scala.concurrent.Future import scalaz.{ListT, OptionT} package file { + + import java.net.URL + + import scala.concurrent.duration.Duration + final case class FileLink( name: Name[File], location: Path, @@ -48,4 +53,8 @@ package file { } } } + + trait SignedFileStorage extends FileStorage { + def signedFileUrl(filePath: Path, duration: Duration): OptionT[Future, URL] + } } |