From 7f7bd651122754a3df47894b64ddb0456561bbe7 Mon Sep 17 00:00:00 2001 From: vlad Date: Thu, 13 Jul 2017 02:27:55 -0700 Subject: Updates for authentication --- .../services/LinkedPatientService.scala | 58 ---------- .../driver/pdsuidomain/services/MailService.scala | 39 ------- .../driver/pdsuidomain/services/UserService.scala | 127 --------------------- .../services/fake/StubMailService.scala | 13 --- .../services/rest/SendGridMailService.scala | 37 ------ 5 files changed, 274 deletions(-) delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/LinkedPatientService.scala delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/MailService.scala delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/UserService.scala delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/fake/StubMailService.scala delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/rest/SendGridMailService.scala (limited to 'src/main/scala/xyz/driver/pdsuidomain/services') diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/LinkedPatientService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/LinkedPatientService.scala deleted file mode 100644 index a69283a..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/services/LinkedPatientService.scala +++ /dev/null @@ -1,58 +0,0 @@ -package xyz.driver.pdsuidomain.services - -import xyz.driver.pdsuicommon.domain._ -import xyz.driver.pdsuicommon.error.DomainError -import xyz.driver.pdsuicommon.logging._ -import xyz.driver.pdsuidomain.entities.{LinkedPatient, Patient, Trial} - -import scala.concurrent.Future - -object LinkedPatientService { - - trait DefaultTrialNotFoundError { - def userMessage: String = "Trial not found" - } - - trait DefaultPatientNotFoundError { - def userMessage: String = "Patient not found" - } - - final case class RichLinkedPatient(email: Email, name: String, patientId: UuidId[Patient], trialId: StringId[Trial]) { - def toLinkedPatient(user: User) = LinkedPatient( - userId = user.id, - patientId = patientId, - trialId = trialId - ) - } - - object RichLinkedPatient { - implicit def toPhiString(x: RichLinkedPatient): PhiString = { - import x._ - phi"RichLinkedPatient(email=${Unsafe(email)}, patientId=$patientId, trialId=$trialId)" - } - } - - sealed trait CreateReply - object CreateReply { - type Error = CreateReply with DomainError - - /** - * @param createdUser None if a user was created before - */ - final case class Created(x: RichLinkedPatient, createdUser: Option[User]) extends CreateReply - - case object PatientNotFoundError - extends CreateReply with DefaultPatientNotFoundError with DomainError.NotFoundError - - case object TrialNotFoundError extends CreateReply with DefaultPatientNotFoundError with DomainError.NotFoundError - - final case class CommonError(userMessage: String) extends CreateReply with DomainError - } -} - -trait LinkedPatientService { - - import LinkedPatientService._ - - def create(entity: RichLinkedPatient): Future[CreateReply] -} diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/MailService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/MailService.scala deleted file mode 100644 index 53f897a..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/services/MailService.scala +++ /dev/null @@ -1,39 +0,0 @@ -package xyz.driver.pdsuidomain.services - -import java.io.{InputStream, StringReader, StringWriter} - -import xyz.driver.pdsuidomain.services.MailService.Template -import com.github.mustachejava.DefaultMustacheFactory -import com.twitter.mustache.ScalaObjectHandler - -import scala.io.Source - -object MailService { - - trait Template { - val subject: String - def parameters: Map[String, Any] - def filename: String - val contentType: String = "text/html" - - protected val factory = new DefaultMustacheFactory() - factory.setObjectHandler(new ScalaObjectHandler) - - protected def inputStream: InputStream = getClass.getClassLoader.getResourceAsStream(filename) - protected def templateContent: String = Source.fromInputStream(inputStream).getLines().mkString - - def content: String = { - val template = factory.compile(new StringReader(templateContent), filename) - val writer = new StringWriter - template - .execute(writer, parameters) - .close() - writer.toString - } - } -} - -trait MailService { - - def sendTo(email: String, template: Template): Boolean -} diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/UserService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/UserService.scala deleted file mode 100644 index 85b93ed..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/services/UserService.scala +++ /dev/null @@ -1,127 +0,0 @@ -package xyz.driver.pdsuidomain.services - -import xyz.driver.pdsuicommon.auth.{AnonymousRequestContext, AuthenticatedRequestContext} -import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting} -import xyz.driver.pdsuicommon.domain._ -import xyz.driver.pdsuicommon.error.DomainError - -import scala.concurrent.Future - -object UserService { - - trait DefaultCredentialsError { - def userMessage: String = "Incorrect email/password. Try again." - } - - trait DefaultAccessDeniedError { - def userMessage: String = "Access denied" - } - - trait DefaultNotFoundError { - def userMessage: String = "User not found" - } - - sealed trait ActivateExecutorReply - object ActivateExecutorReply { - type Error = ActivateExecutorReply with DomainError - final case class Entity(x: User) extends ActivateExecutorReply - case object NotFoundError extends ActivateExecutorReply with DomainError.NotFoundError { - val userMessage = "Info about you is not found on the server" - } - } - - sealed trait GetByIdReply - object GetByIdReply { - type Error = GetByIdReply with DomainError - final case class Entity(x: User) extends GetByIdReply - case object AuthorizationError - extends GetByIdReply with DomainError.AuthorizationError with DefaultAccessDeniedError - case object NotFoundError extends GetByIdReply with DomainError.NotFoundError with DefaultNotFoundError - final case class CommonError(userMessage: String) extends GetByIdReply with DomainError - } - - sealed trait GetByEmailReply - object GetByEmailReply { - final case class Entity(x: User) extends GetByEmailReply - case object NotFoundError extends GetByEmailReply with DefaultNotFoundError with DomainError.NotFoundError { - override def userMessage: String = "Incorrect email. Try again." - } - } - - sealed trait GetByCredentialsReply - object GetByCredentialsReply { - final case class Entity(x: User) extends GetByCredentialsReply - case object AuthenticationError - extends GetByCredentialsReply with DefaultCredentialsError with DomainError.AuthenticationError - case object NotFoundError extends GetByCredentialsReply with DomainError.NotFoundError with DefaultNotFoundError - } - - sealed trait GetListReply - object GetListReply { - final case class EntityList(xs: Seq[User], totalFound: Int) extends GetListReply - case object AuthorizationError extends GetListReply with DomainError.AuthorizationError with DefaultNotFoundError - } - - sealed trait CreateReply - object CreateReply { - type Error = CreateReply with DomainError - final case class Created(x: User) extends CreateReply - case object AuthorizationError extends CreateReply with DefaultNotFoundError with DomainError.AuthorizationError - final case class UserAlreadyExistsError(email: Email) extends CreateReply with DomainError { - val userMessage = s"The user with this email already exists." - } - final case class CommonError(userMessage: String) extends CreateReply with DomainError - } - - sealed trait UpdateReply - object UpdateReply { - type Error = UpdateReply with DomainError - final case class Updated(updated: User) extends UpdateReply - case object AuthorizationError - extends UpdateReply with DefaultAccessDeniedError with DomainError.AuthorizationError - final case class CommonError(userMessage: String) extends UpdateReply with DomainError - } - - sealed trait DeleteReply - object DeleteReply { - type Error = DeleteReply with DomainError - case object Deleted extends DeleteReply - final case class AuthorizationError(user: User) - extends DeleteReply with DefaultAccessDeniedError with DomainError.AuthorizationError - case object AssignedToRecordAndDocumentError extends DeleteReply with DomainError { - val userMessage = "User is can not be deleted because he has record and document in work" - } - case object NotFoundError extends DeleteReply with DefaultNotFoundError with DomainError.NotFoundError - final case class CommonError(userMessage: String) extends DeleteReply with DomainError - } -} - -trait UserService { - - import UserService._ - - /** - * Utility method for getting request executor. - */ - def activateExecutor(executorId: StringId[User])( - implicit requestContext: AnonymousRequestContext): Future[ActivateExecutorReply] - - def getById(userId: StringId[User])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] - - def getByEmail(email: Email)(implicit requestContext: AnonymousRequestContext): Future[GetByEmailReply] - - def getByCredentials(email: Email, password: String)( - implicit requestContext: AnonymousRequestContext): Future[GetByCredentialsReply] - - def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty, - sorting: Option[Sorting] = None, - pagination: Option[Pagination] = None)( - implicit requestContext: AuthenticatedRequestContext): Future[GetListReply] - - def create(draftUser: User)(implicit requestContext: AuthenticatedRequestContext): Future[CreateReply] - - def update(origUser: User, draftUser: User)( - implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] - - def delete(userId: StringId[User])(implicit requestContext: AuthenticatedRequestContext): Future[DeleteReply] -} diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/fake/StubMailService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/fake/StubMailService.scala deleted file mode 100644 index 932da67..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/services/fake/StubMailService.scala +++ /dev/null @@ -1,13 +0,0 @@ -package xyz.driver.pdsuidomain.services.fake - -import xyz.driver.pdsuicommon.logging._ -import xyz.driver.pdsuidomain.services.MailService -import xyz.driver.pdsuidomain.services.MailService.Template - -object StubMailService extends MailService with PhiLogging { - - override def sendTo(email: String, template: Template): Boolean = { - logger.debug(phi"sendTo(email=${Unsafe(email)}") - true - } -} diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/SendGridMailService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/SendGridMailService.scala deleted file mode 100644 index bb3228e..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/SendGridMailService.scala +++ /dev/null @@ -1,37 +0,0 @@ -package xyz.driver.pdsuidomain.services.rest - -import com.sendgrid._ -import xyz.driver.pdsuicommon.logging._ -import xyz.driver.pdsuidomain.services.MailService -import xyz.driver.pdsuidomain.services.MailService.Template - -import scala.util.control.NonFatal - -class SendGridMailService(apiKey: String, from: String) extends MailService with PhiLogging { - private val ExpectedHttpCode = 202 - - def sendTo(email: String, template: Template): Boolean = { - val to = new Email(email) - val content = new Content(template.contentType, template.content) - val mail = new Mail(new Email(from), template.subject, to, content) - - val request = new Request() - val sendGrid = new SendGrid(apiKey) - - try { - request.method = Method.POST - request.endpoint = "mail/send" - request.body = mail.build() - val response = sendGrid.api(request) - if (response.statusCode != ExpectedHttpCode) { - logger.error(phi"Unexpected response: ${Unsafe(response.statusCode)}, ${Unsafe(response.body.take(100))}") - } - - response.statusCode == ExpectedHttpCode - } catch { - case NonFatal(e) => - logger.error(phi"Can not send an email: $e") - false - } - } -} -- cgit v1.2.3