aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlad <vlad@drivergrp.com>2016-08-17 13:38:07 -0700
committervlad <vlad@drivergrp.com>2016-08-17 13:38:07 -0700
commit7a7e176fa4eb2515ccb7931ca8504635e0f17cca (patch)
tree1126c1be5f695415faac9c0fc9c54eda63e756b2
parent447dcfcc10de2fa21094f626ad06c583a05c4a2b (diff)
downloaddriver-core-7a7e176fa4eb2515ccb7931ca8504635e0f17cca.tar.gz
driver-core-7a7e176fa4eb2515ccb7931ca8504635e0f17cca.tar.bz2
driver-core-7a7e176fa4eb2515ccb7931ca8504635e0f17cca.zip
File service returning FileLinks instead of just file names
-rw-r--r--src/main/scala/com/drivergrp/core/core.scala4
-rw-r--r--src/main/scala/com/drivergrp/core/file.scala41
-rw-r--r--src/main/scala/com/drivergrp/core/generators.scala2
-rw-r--r--src/main/scala/com/drivergrp/core/json.scala13
4 files changed, 33 insertions, 27 deletions
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")
}
}