aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
diff options
context:
space:
mode:
authorzachdriver <zach@driver.xyz>2017-10-17 14:51:21 -0700
committerGitHub <noreply@github.com>2017-10-17 14:51:21 -0700
commit2af63e7fb8b15568adaf2d9f0a6b395d6719fd71 (patch)
treebb66e54c3f7ff26af279df255452566df057223b /src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
parentb00892d723f6dedf50dc1c1fde7d443e9c3f9497 (diff)
parent1aaaf7a5ecf2cd28350fff872e334f9f6186966a (diff)
downloaddriver-core-2af63e7fb8b15568adaf2d9f0a6b395d6719fd71.tar.gz
driver-core-2af63e7fb8b15568adaf2d9f0a6b395d6719fd71.tar.bz2
driver-core-2af63e7fb8b15568adaf2d9f0a6b395d6719fd71.zip
Merge pull request #74 from drivergroup/zsmith/rest-app-packages
Split app and rest packages into separate files
Diffstat (limited to 'src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala')
-rw-r--r--src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala b/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
new file mode 100644
index 0000000..4020d57
--- /dev/null
+++ b/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
@@ -0,0 +1,62 @@
+package xyz.driver.core.rest
+
+import xyz.driver.core.auth.{AuthToken, PermissionsToken, User}
+import xyz.driver.core.generators
+
+import scalaz.Scalaz.{mapEqual, stringInstance}
+import scalaz.syntax.equal._
+
+class ServiceRequestContext(val trackingId: String = generators.nextUuid().toString,
+ val contextHeaders: Map[String, String] = Map.empty[String, String]) {
+ def authToken: Option[AuthToken] =
+ contextHeaders.get(AuthProvider.AuthenticationTokenHeader).map(AuthToken.apply)
+
+ def permissionsToken: Option[PermissionsToken] =
+ contextHeaders.get(AuthProvider.PermissionsTokenHeader).map(PermissionsToken.apply)
+
+ def withAuthToken(authToken: AuthToken): ServiceRequestContext =
+ new ServiceRequestContext(
+ trackingId,
+ contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value)
+ )
+
+ def withAuthenticatedUser[U <: User](authToken: AuthToken, user: U): AuthorizedServiceRequestContext[U] =
+ new AuthorizedServiceRequestContext(
+ trackingId,
+ contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value),
+ user
+ )
+
+ override def hashCode(): Int =
+ Seq[Any](trackingId, contextHeaders).foldLeft(31)((result, obj) => 31 * result + obj.hashCode())
+
+ override def equals(obj: Any): Boolean = obj match {
+ case ctx: ServiceRequestContext => trackingId === ctx.trackingId && contextHeaders === ctx.contextHeaders
+ case _ => false
+ }
+
+ override def toString: String = s"ServiceRequestContext($trackingId, $contextHeaders)"
+}
+
+class AuthorizedServiceRequestContext[U <: User](override val trackingId: String = generators.nextUuid().toString,
+ override val contextHeaders: Map[String, String] =
+ Map.empty[String, String],
+ val authenticatedUser: U)
+ extends ServiceRequestContext {
+
+ def withPermissionsToken(permissionsToken: PermissionsToken): AuthorizedServiceRequestContext[U] =
+ new AuthorizedServiceRequestContext[U](
+ trackingId,
+ contextHeaders.updated(AuthProvider.PermissionsTokenHeader, permissionsToken.value),
+ authenticatedUser)
+
+ override def hashCode(): Int = 31 * super.hashCode() + authenticatedUser.hashCode()
+
+ override def equals(obj: Any): Boolean = obj match {
+ case ctx: AuthorizedServiceRequestContext[U] => super.equals(ctx) && ctx.authenticatedUser == authenticatedUser
+ case _ => false
+ }
+
+ override def toString: String =
+ s"AuthorizedServiceRequestContext($trackingId, $contextHeaders, $authenticatedUser)"
+}