From 7a7e176fa4eb2515ccb7931ca8504635e0f17cca Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 17 Aug 2016 13:38:07 -0700 Subject: File service returning FileLinks instead of just file names --- src/main/scala/com/drivergrp/core/core.scala | 4 +-- src/main/scala/com/drivergrp/core/file.scala | 41 +++++++++++++++------- src/main/scala/com/drivergrp/core/generators.scala | 2 +- src/main/scala/com/drivergrp/core/json.scala | 13 ++----- 4 files changed, 33 insertions(+), 27 deletions(-) (limited to 'src/main/scala/com') diff --git a/src/main/scala/com/drivergrp/core/core.scala b/src/main/scala/com/drivergrp/core/core.scala index 5bfe017..f5f79df 100644 --- a/src/main/scala/com/drivergrp/core/core.scala +++ b/src/main/scala/com/drivergrp/core/core.scala @@ -1,7 +1,5 @@ package com.drivergrp -import java.util.UUID - import scalaz.Equal package object core { @@ -41,7 +39,7 @@ package object core { implicit def nameOrdering[T]: Ordering[Name[T]] = Ordering.by(identity) object revision { - final case class Revision[T](id: UUID) + final case class Revision[T](id: String) implicit def revisionEqual[T]: Equal[Revision[T]] = Equal.equal[Revision[T]](_.id == _.id) } diff --git a/src/main/scala/com/drivergrp/core/file.scala b/src/main/scala/com/drivergrp/core/file.scala index 8f365bf..da46107 100644 --- a/src/main/scala/com/drivergrp/core/file.scala +++ b/src/main/scala/com/drivergrp/core/file.scala @@ -6,6 +6,7 @@ import java.util.UUID._ import com.amazonaws.services.s3.AmazonS3 import com.amazonaws.services.s3.model.{Bucket, GetObjectRequest, ListObjectsV2Request} +import com.drivergrp.core.revision.Revision import com.drivergrp.core.time.Time import scala.concurrent.{ExecutionContext, Future} @@ -14,15 +15,15 @@ import scalaz.{ListT, OptionT} object file { final case class FileLink( - id: Id[File], name: Name[File], location: Path, - additionDate: Time + revision: Revision[File], + lastModificationDate: Time ) trait FileService { - def getFileLink(id: Id[File]): FileLink + def getFileLink(id: Name[File]): FileLink def getFile(fileLink: FileLink): File } @@ -35,7 +36,7 @@ object file { def delete(filePath: Path): Future[Unit] - def list(path: Path): ListT[Future, Name[File]] + def list(path: Path): ListT[Future, FileLink] /** List of characters to avoid in S3 (I would say file names in general) * @@ -79,20 +80,26 @@ object file { s3.deleteObject(bucket, filePath.toString) } - def list(path: Path): ListT[Future, Name[File]] = + def list(path: Path): ListT[Future, FileLink] = ListT.listT(Future { import scala.collection.JavaConverters._ val req = new ListObjectsV2Request().withBucketName(bucket).withPrefix(path.toString).withMaxKeys(2) + def isInSubFolder(path: Path)(fileLink: FileLink) = + fileLink.location.toString.replace(path.toString + "/", "").contains("/") + Iterator.continually(s3.listObjectsV2(req)).takeWhile { result => req.setContinuationToken(result.getNextContinuationToken) result.isTruncated } flatMap { result => - result.getObjectSummaries.asScala - .map(_.getKey) - .toList - .filterNot(_.replace(path.toString + "/", "").contains("/")) // filter out sub-folders or files in sub-folders - .map(item => Name[File](new File(item).getName)) + result.getObjectSummaries.asScala.toList.map { summary => + val file = new File(summary.getKey) + FileLink( + Name[File](file.getName), + Paths.get(file.getPath), + Revision[File](summary.getETag), + Time(summary.getLastModified.getTime)) + } filterNot isInSubFolder(path) } toList }) } @@ -128,11 +135,19 @@ object file { } } - def list(path: Path): ListT[Future, Name[File]] = + def list(path: Path): ListT[Future, FileLink] = ListT.listT(Future { val file = new File(path.toString) - if (file.isDirectory) file.listFiles().filter(_.isFile).map(f => Name[File](f.getName)).toList - else List.empty[Name[File]] + if (file.isDirectory) { + file.listFiles().toList.filter(_.isFile).map { file => + FileLink( + Name[File](file.getName), + Paths.get(file.getPath), + Revision[File](file.hashCode.toString), + Time(file.lastModified())) + } + } + else List.empty[FileLink] }) } } diff --git a/src/main/scala/com/drivergrp/core/generators.scala b/src/main/scala/com/drivergrp/core/generators.scala index 22a838c..86183a1 100644 --- a/src/main/scala/com/drivergrp/core/generators.scala +++ b/src/main/scala/com/drivergrp/core/generators.scala @@ -22,7 +22,7 @@ object generators { def nextUuid() = java.util.UUID.randomUUID - def nextRevision[T]() = Revision[T](nextUuid()) + def nextRevision[T]() = Revision[T](nextUuid().toString) def nextString(maxLength: Int = DefaultMaxLength): String = (oneOf[Char](StringLetters) +: arrayOf(oneOf[Char](StringLetters), maxLength - 1)).mkString diff --git a/src/main/scala/com/drivergrp/core/json.scala b/src/main/scala/com/drivergrp/core/json.scala index 0ac7d04..9a30161 100644 --- a/src/main/scala/com/drivergrp/core/json.scala +++ b/src/main/scala/com/drivergrp/core/json.scala @@ -1,7 +1,5 @@ package com.drivergrp.core -import java.util.UUID - import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.server.PathMatcher.Matched import akka.http.scaladsl.server.{PathMatcher, _} @@ -66,22 +64,17 @@ object json { def RevisionInPath[T]: PathMatcher1[Revision[T]] = PathMatcher("""[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}""".r) flatMap { string => - try Some(Revision[T](UUID.fromString(string))) - catch { - case _: IllegalArgumentException => None - } + Some(Revision[T](string)) } implicit def revisionFromStringUnmarshaller[T]: Unmarshaller[String, Revision[T]] = - Unmarshaller.strict[String, Revision[T]] { string => - Revision[T](UUID.fromString(string)) - } + Unmarshaller.strict[String, Revision[T]](Revision[T](_)) implicit def revisionFormat[T] = new RootJsonFormat[Revision[T]] { def write(revision: Revision[T]) = JsString(revision.id.toString) def read(value: JsValue): Revision[T] = value match { - case JsString(revision) => Revision[T](UUID.fromString(revision)) + case JsString(revision) => Revision[T](revision) case _ => throw new DeserializationException("Revision expects uuid string") } } -- cgit v1.2.3