aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlad <vlad@drivergrp.com>2016-08-02 16:45:06 -0700
committervlad <vlad@drivergrp.com>2016-08-02 16:45:06 -0700
commitf97ab65634b5b88e3e42e10f9f4b0923d88a192b (patch)
treebb071b8c251b11ba533bf24668764b43bb0f10e2
parent3008753cf543caaecb7d0e325c9f4473ad8a0322 (diff)
downloaddriver-core-f97ab65634b5b88e3e42e10f9f4b0923d88a192b.tar.gz
driver-core-f97ab65634b5b88e3e42e10f9f4b0923d88a192b.tar.bz2
driver-core-f97ab65634b5b88e3e42e10f9f4b0923d88a192b.zip
More abstract auth model and File service definition
-rw-r--r--src/main/scala/com/drivergrp/core/auth.scala67
-rw-r--r--src/main/scala/com/drivergrp/core/file.scala17
2 files changed, 24 insertions, 60 deletions
diff --git a/src/main/scala/com/drivergrp/core/auth.scala b/src/main/scala/com/drivergrp/core/auth.scala
index 84d943d..8722d6a 100644
--- a/src/main/scala/com/drivergrp/core/auth.scala
+++ b/src/main/scala/com/drivergrp/core/auth.scala
@@ -2,65 +2,20 @@ package com.drivergrp.core
object auth {
- final case class FullName[+T](firstName: Name[T], middleName: Name[T], lastName: Name[T])
-
- final case class Email(username: String, domain: String) {
- override def toString = username + "@" + domain
- }
+ trait Permission
trait Role {
val id: Id[Role]
val name: Name[Role]
- def canEditReport: Boolean = false
- def canSignOffReport: Boolean = false
- def canAssignRoles: Boolean = false
- }
-
- case object ObserverRole extends Role {
- val id = Id(1L)
- val name = Name("observer")
- }
-
- case object PatientRole extends Role {
- val id = Id(2L)
- val name = Name("patient")
+ def hasPermission(permission: Permission): Boolean = false
}
- case object CuratorRole extends Role {
- val id = Id(3L)
- val name = Name("curator")
-
- override def canEditReport: Boolean = true
- }
-
- case object PathologistRole extends Role {
- val id = Id(4L)
- val name = Name("pathologist")
-
- override def canEditReport: Boolean = true
- override def canSignOffReport: Boolean = true
+ trait User {
+ def id: Id[User]
+ def roles: Set[Role]
}
- case object AdministratorRole extends Role {
- val id = Id(5L)
- val name = Name("administrator")
-
- override def canEditReport: Boolean = true
- override def canSignOffReport: Boolean = true
- override def canAssignRoles: Boolean = true
- }
-
- final case class Avatar(id: Id[Avatar], name: Name[Avatar])
-
- final case class User(id: Id[User], name: FullName[User], email: Email, avatar: Option[Avatar], roles: Set[Role])
-
- val TestUser = User(Id[User](1L),
- FullName[User](Name("James"), Name("Dewey"), Name("Watson")),
- Email("j.watson", "uchicago.edu"),
- Some(Avatar(Id[Avatar](1L), Name[Avatar]("Coolface"))),
- Set(PathologistRole))
-
final case class Macaroon(value: String)
final case class Base64[T](value: String)
@@ -73,13 +28,15 @@ object auth {
val AuthenticationTokenHeader = "WWW-Authenticate"
- def authorize(role: Role): Directive1[Id[User]] = {
+ type UserExtractor = AuthToken => Option[User]
+
+ def authorize(role: Role)(implicit userExtractor: UserExtractor): Directive1[Id[User]] = {
headerValueByName(AuthenticationTokenHeader).flatMap { tokenValue =>
val token = AuthToken(Base64[Macaroon](tokenValue))
- extractUser(token) match {
+ userExtractor(token) match {
case Some(user) =>
- if (user.roles.contains(role)) provide(user.id)
+ if (user.roles.contains(role)) provide(user.id: Id[User])
else reject(ValidationRejection(s"User does not have the required ${role.name} role"))
case None =>
reject(ValidationRejection(s"Wasn't able to extract user for the token provided"))
@@ -92,9 +49,5 @@ object auth {
provide(AuthToken(Base64[Macaroon](token)))
}
}
-
- def extractUser(authToken: AuthToken): Option[User] = {
- Some(TestUser)
- }
}
}
diff --git a/src/main/scala/com/drivergrp/core/file.scala b/src/main/scala/com/drivergrp/core/file.scala
index e9340ff..c085be8 100644
--- a/src/main/scala/com/drivergrp/core/file.scala
+++ b/src/main/scala/com/drivergrp/core/file.scala
@@ -1,12 +1,23 @@
package com.drivergrp.core
+import akka.http.scaladsl.model.Uri
import com.drivergrp.core.time.Time
object file {
- final case class Document(
- id: Id[Document],
- name: Name[Document],
+ final case class File(id: Id[File])
+
+ final case class FileLink(
+ id: Id[File],
+ name: Name[File],
+ location: Uri,
additionDate: Time
)
+
+ trait FileService {
+
+ def getFileLink(id: Id[File]): FileLink
+
+ def getFile(fileLink: FileLink): File
+ }
}