From da31eb3170e23942961e7e2b2f135679188aca2a Mon Sep 17 00:00:00 2001 From: Alexis Hernandez Date: Sun, 25 Feb 2018 14:03:48 -0600 Subject: [PATCH] alerts-server: Integrate playsonify library --- .../AbstractAuthenticatorService.scala | 26 -- .../commons/AbstractJsonController.scala | 270 ----------------- .../commons/ApplicationErrorMapper.scala | 8 - .../alexitc/coinalerts/commons/ErrorId.scala | 9 - .../alexitc/coinalerts/commons/FutureOr.scala | 64 ---- .../commons/JsonControllerComponents.scala | 18 -- .../coinalerts/commons/MessageKey.scala | 11 - .../commons/PublicErrorRenderer.scala | 37 --- .../commons/applicationErrors.scala | 14 - .../commons/jsonControllerErrors.scala | 8 - .../alexitc/coinalerts/commons/package.scala | 12 - .../coinalerts/commons/publicErrors.scala | 15 - .../coinalerts/commons/requestContexts.scala | 19 -- .../com/alexitc/coinalerts/core/package.scala | 2 +- .../data/DailyPriceAlertDataHandler.scala | 2 +- .../data/ExchangeCurrencyDataHandler.scala | 2 +- .../data/FixedPriceAlertDataHandler.scala | 2 +- .../data/NewCurrencyAlertDataHandler.scala | 2 +- .../coinalerts/data/UserDataHandler.scala | 2 +- .../data/anorm/AnormPostgresDAL.scala | 2 +- .../DailyPriceAlertPostgresDataHandler.scala | 2 +- .../ExchangeCurrencyPostgresDataHandler.scala | 2 +- .../FixedPriceAlertPostgresDataHandler.scala | 2 +- .../NewCurrencyAlertPostgresDataHandler.scala | 4 +- .../data/anorm/UserPostgresDataHandler.scala | 2 +- .../dao/DailyPriceAlertPostgresDAO.scala | 2 +- .../DailyPriceAlertFutureDataHandler.scala | 2 +- .../ExchangeCurrencyFutureDataHandler.scala | 2 +- .../FixedPriceAlertFutureDataHandler.scala | 2 +- .../NewCurrencyAlertFutureDataHandler.scala | 2 +- .../data/async/UserFutureDataHandler.scala | 2 +- .../errors/MyApplicationErrorMapper.scala | 3 +- .../coinalerts/errors/PlayErrorHandler.scala | 3 +- .../errors/dailyPriceAlertErrors.scala | 3 +- .../errors/exchangeCurrencyErrors.scala | 2 +- .../errors/fixedPriceAlertErrors.scala | 2 +- .../alexitc/coinalerts/errors/jWTErrors.scala | 2 +- .../coinalerts/errors/mailgunErrors.scala | 3 +- .../errors/newCurrencyAlertErrors.scala | 2 +- .../errors/paginatedQueryErrors.scala | 3 +- .../coinalerts/errors/postgresErrors.scala | 3 +- .../coinalerts/errors/reCaptchaErrors.scala | 2 +- .../coinalerts/errors/userErrors.scala | 3 +- .../errors/userVerificationTokenErrors.scala | 3 +- .../parsers/FixedPriceAlertFilterParser.scala | 2 +- .../FixedPriceAlertOrderByParser.scala | 2 +- .../services/DailyPriceAlertService.scala | 4 +- .../services/EmailServiceTrait.scala | 2 +- .../services/ExchangeCurrencyService.scala | 4 +- .../services/FixedPriceAlertService.scala | 5 +- .../services/JWTAuthenticatorService.scala | 3 +- .../coinalerts/services/JWTService.scala | 2 +- .../services/NewCurrencyAlertService.scala | 2 +- .../coinalerts/services/UserService.scala | 4 +- .../external/MailgunEmailService.scala | 2 +- .../services/external/ReCaptchaService.scala | 2 +- .../validators/FixedPriceAlertValidator.scala | 2 +- .../validators/PaginatedQueryValidator.scala | 2 +- .../services/validators/UserValidator.scala | 2 +- .../tasks/ExchangeCurrencySeederTask.scala | 2 +- .../tasks/FixedPriceAlertCollector.scala | 2 +- .../tasks/FixedPriceAlertsTask.scala | 2 +- .../app/controllers/MyJsonController.scala | 3 +- .../MyJsonControllerComponents.scala | 2 +- .../app/controllers/UsersController.scala | 2 +- alerts-server/app/controllers/package.scala | 10 +- alerts-server/build.sbt | 1 + .../commons/AbstractJsonControllerSpec.scala | 273 ------------------ .../coinalerts/commons/FakeEmailService.scala | 1 + .../commons/FakeReCaptchaService.scala | 1 + .../AuthenticatedNoInputController.scala | 15 - .../examples/CustomAuthenticator.scala | 23 -- .../examples/CustomControllerComponents.scala | 16 - .../commons/examples/CustomErrorMapper.scala | 35 --- .../examples/CustomJsonController.scala | 13 - .../commons/examples/CustomModel.scala | 9 - .../commons/examples/CustomUser.scala | 3 - .../examples/PublicNoInputController.scala | 31 -- .../examples/PublicWithInputController.scala | 27 -- .../DailyPriceAlertInMemoryDataHandler.scala | 3 +- .../ExchangeCurrencyInMemoryDataHandler.scala | 2 +- .../FixedPriceAlertInMemoryDataHandler.scala | 3 +- .../NewCurrencyAlertInMemoryDataHandler.scala | 2 +- .../data/UserInMemoryDataHandler.scala | 2 +- 84 files changed, 77 insertions(+), 1029 deletions(-) delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/AbstractAuthenticatorService.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/AbstractJsonController.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/ApplicationErrorMapper.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/ErrorId.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/FutureOr.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/JsonControllerComponents.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/MessageKey.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/PublicErrorRenderer.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/applicationErrors.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/jsonControllerErrors.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/package.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/publicErrors.scala delete mode 100644 alerts-server/app/com/alexitc/coinalerts/commons/requestContexts.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/AbstractJsonControllerSpec.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/AuthenticatedNoInputController.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomAuthenticator.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomControllerComponents.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomErrorMapper.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomJsonController.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomModel.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomUser.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicNoInputController.scala delete mode 100644 alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicWithInputController.scala diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/AbstractAuthenticatorService.scala b/alerts-server/app/com/alexitc/coinalerts/commons/AbstractAuthenticatorService.scala deleted file mode 100644 index 3ceb127..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/AbstractAuthenticatorService.scala +++ /dev/null @@ -1,26 +0,0 @@ -package com.alexitc.coinalerts.commons - -import play.api.libs.json.JsValue -import play.api.mvc.Request - -/** - * Allow to authenticate a request and map it to a value with type [[T]]. - * - * A dummy service that gets the user id from the "Authorization" header or uses -1 - * when the header is not present could look like this, NEVER USE THIS PIECE OF CODE: - * {{{ - * class DummyAuthenticatorService extends AbstractAuthenticatorService { - * override def authenticate[A](request: Request[A]): FutureApplicationResult[Int] = { - * val userId = request.headers.get(HeaderNames.AUTHORIZATION).map(_.toInt).getOrElse(-1) - * Future.successful { Good(userId) } - * } - * } - * }}} - * - * @tparam A the type representing what is useful to use in your controllers as the user or credentials. - */ -trait AbstractAuthenticatorService[A] { - - def authenticate(request: Request[JsValue]): FutureApplicationResult[A] - -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/AbstractJsonController.scala b/alerts-server/app/com/alexitc/coinalerts/commons/AbstractJsonController.scala deleted file mode 100644 index 7ff216f..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/AbstractJsonController.scala +++ /dev/null @@ -1,270 +0,0 @@ -package com.alexitc.coinalerts.commons - -import javax.inject.Inject - -import com.alexitc.coinalerts.commons.FutureOr.Implicits.{FutureOps, OrOps} -import org.scalactic.{Bad, Every, Good} -import play.api.i18n.Lang -import play.api.libs.json._ -import play.api.mvc._ - -import scala.concurrent.Future -import scala.util.control.NonFatal - -/** - * Base Controller designed to process actions that expect an input model - * and computes an output model. - * - * The controller handles the json serialization and deserialization as well - * as the error responses and http status codes. - * - * @tparam A the value type for an authenticated request, like User or UserId. - */ -abstract class AbstractJsonController[A] @Inject() (components: JsonControllerComponents[A]) - extends MessagesBaseController { - - override protected val controllerComponents: MessagesControllerComponents = components.messagesControllerComponents - - protected implicit val ec = components.executionContext - - /** - * Override this and decide what to do in case of server errors. - * - * For example, log the error with the id, handle metrics, etc. - * - * @param error the error that occurred. - * @param errorId the unique identifier for the error. - */ - protected def onServerError(error: ServerError, errorId: ErrorId): Unit - - /** - * Ignores the body returning an empty json. - * - * Useful for using methods that doesn't require input. - */ - private val EmptyJsonParser = parse.ignore(Json.toJson(JsObject.empty)) - - /** - * Execute an asynchronous action that receives the model [[R]] - * and returns the model [[M]] on success. - * - * The model [[R]] is wrapped in a [[RequestContext]]. - * - * Note: This method is intended to be used on public APIs. - * - * @param successStatus the http status for a successful response - * @param block the block to execute - * @param tjs the serializer for [[M]] - * @tparam R the input model type - * @tparam M the output model type - */ - def publicWithInput[R: Reads, M]( - successStatus: Status)( - block: PublicRequestContextWithModel[R] => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = Action.async(parse.json) { request => - - val result = for { - input <- validate[R](request.body).toFutureOr - context = PublicRequestContextWithModel(input, messagesApi.preferred(request).lang) - output <- block(context).toFutureOr - } yield output - - val lang = messagesApi.preferred(request).lang - toResult(successStatus, result.toFuture)(lang, tjs) - } - - /** - * Sets a default successStatus. - */ - def publicWithInput[R: Reads, M]( - block: PublicRequestContextWithModel[R] => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = { - - publicWithInput[R, M](Ok)(block) - } - - /** - * Execute an asynchronous action that doesn't need an input model - * and returns the model [[M]] on success. - * - * Note: This method is intended to be used on public APIs. - * - * @param successStatus the http status for a successful response - * @param block the block to execute - * @param tjs the serializer for [[M]] - * @tparam M the output model type - */ - def publicNoInput[M]( - successStatus: Status)( - block: PublicRequestContext => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = Action.async(EmptyJsonParser) { request => - - val context = PublicRequestContext(messagesApi.preferred(request).lang) - val result = block(context) - val lang = messagesApi.preferred(request).lang - toResult(successStatus, result)(lang, tjs) - } - - /** - * Sets a default successStatus. - */ - def publicNoInput[M]( - block: PublicRequestContext => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = { - - publicNoInput[M](Ok)(block) - } - - /** - * Execute an asynchronous action that receives the model [[R]] - * and produces the model [[M]] on success, the http status in - * case of a successful result will be taken from successStatus param. - * - * Note: This method is intended to be on APIs requiring authentication. - * - * @param successStatus the http status for a successful response - * @param block the block to execute - * @param tjs the serializer for [[M]] - * @tparam R the input model type - * @tparam M the output model type - */ - def authenticatedWithInput[R: Reads, M]( - successStatus: Status)( - block: AuthenticatedRequestContextWithModel[A, R] => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = Action.async(parse.json) { request => - - val lang = messagesApi.preferred(request).lang - val result = for { - input <- validate[R](request.body).toFutureOr - authValue <- components.authenticatorService.authenticate(request).toFutureOr - context = AuthenticatedRequestContextWithModel(authValue, input, lang) - output <- block(context).toFutureOr - } yield output - - toResult(successStatus, result.toFuture)(lang, tjs) - } - - /** - * Sets a default successStatus. - */ - def authenticatedWithInput[R: Reads, M]( - block: AuthenticatedRequestContextWithModel[A, R] => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = { - - authenticatedWithInput[R, M](Ok)(block) - } - - /** - * Execute an asynchronous action that doesn't need an input model - * and returns the model [[M]] on success. - * - * Note: This method is intended to be on APIs requiring authentication. - * - * @param successStatus the http status for a successful response - * @param block the block to execute - * @param tjs the serializer for [[M]] - * @tparam M the output model type - */ - def authenticatedNoInput[M]( - successStatus: Status)( - block: AuthenticatedRequestContext[A] => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = Action.async(EmptyJsonParser) { request => - - val lang = messagesApi.preferred(request).lang - val result = for { - authValue <- components.authenticatorService.authenticate(request).toFutureOr - context = AuthenticatedRequestContext(authValue, lang) - output <- block(context).toFutureOr - } yield output - - toResult(successStatus, result.toFuture)(lang, tjs) - } - - /** - * Sets a default successStatus. - */ - def authenticatedNoInput[M]( - block: AuthenticatedRequestContext[A] => FutureApplicationResult[M])( - implicit tjs: Writes[M]): Action[JsValue] = { - - authenticatedNoInput[M](Ok)(block) - } - - private def validate[R: Reads](json: JsValue): ApplicationResult[R] = { - json.validate[R].fold( - invalid => { - val errorList: Seq[JsonFieldValidationError] = invalid.map { case (path, errors) => - JsonFieldValidationError( - path, - errors - .flatMap(_.messages) - .map(MessageKey.apply)) - } - - // assume that errorList is non empty - Bad(Every(errorList.head, errorList.drop(1): _*)) - }, - valid => Good(valid) - ) - } - - private def toResult[M]( - successStatus: Status, - response: FutureApplicationResult[M])( - implicit lang: Lang, - tjs: Writes[M]): Future[Result] = { - - response.map { - case Good(value) => - renderSuccessfulResult(successStatus, value)(tjs) - - case Bad(errors) => - renderErrors(errors) - }.recover { - case NonFatal(ex) => - val error = WrappedExceptionError(ex) - renderErrors(Every(error)) - } - } - - private def renderSuccessfulResult[M](successStatus: Status, model: M)(implicit tjs: Writes[M]) = { - val json = Json.toJson(model) - successStatus.apply(json) - } - - private def renderErrors(errors: ApplicationErrors)(implicit lang: Lang): Result = { - // detect response status based on the first error - val status = errors.head match { - case _: InputValidationError => Results.BadRequest - case _: ConflictError => Results.Conflict - case _: NotFoundError => Results.NotFound - case _: AuthenticationError => Results.Unauthorized - case _: ServerError => Results.InternalServerError - } - - val json = errors.head match { - case error: ServerError => - val errorId = ErrorId.create - onServerError(error, errorId) - renderPrivateError(errorId) - - case _ => renderPublicErrors(errors) - } - status(Json.toJson(json)) - } - - private def renderPublicErrors(errors: ApplicationErrors)(implicit lang: Lang) = { - val jsonErrorList = errors - .toList - .flatMap(components.applicationErrorMapper.toPublicErrorList) - .map(components.publicErrorRenderer.renderPublicError) - - Json.obj("errors" -> jsonErrorList) - } - - private def renderPrivateError(errorId: ErrorId) = { - val jsonError = components.publicErrorRenderer.renderPrivateError(errorId) - - Json.obj("errors" -> List(jsonError)) - } -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/ApplicationErrorMapper.scala b/alerts-server/app/com/alexitc/coinalerts/commons/ApplicationErrorMapper.scala deleted file mode 100644 index 0e96f9b..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/ApplicationErrorMapper.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.alexitc.coinalerts.commons - -import play.api.i18n.Lang - -trait ApplicationErrorMapper { - - def toPublicErrorList(error: ApplicationError)(implicit lang: Lang): Seq[PublicError] -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/ErrorId.scala b/alerts-server/app/com/alexitc/coinalerts/commons/ErrorId.scala deleted file mode 100644 index 72632a6..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/ErrorId.scala +++ /dev/null @@ -1,9 +0,0 @@ -package com.alexitc.coinalerts.commons - -import java.util.UUID - -case class ErrorId(string: String) extends AnyVal - -object ErrorId { - def create: ErrorId = ErrorId(UUID.randomUUID().toString.replace("-", "")) -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/FutureOr.scala b/alerts-server/app/com/alexitc/coinalerts/commons/FutureOr.scala deleted file mode 100644 index e2974d1..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/FutureOr.scala +++ /dev/null @@ -1,64 +0,0 @@ -package com.alexitc.coinalerts.commons - -import org.scalactic.{Bad, Good, One, Or} - -import scala.concurrent.{ExecutionContext, Future} - -/** - * Monad transformer for composing values with [[FutureApplicationResult]] type. - * - * @param future - * @tparam A - */ -class FutureOr[+A](val future: FutureApplicationResult[A]) extends AnyVal { - - def toFuture: Future[ApplicationResult[A]] = future - - def flatMap[B](f: A => FutureOr[B])(implicit ec: ExecutionContext): FutureOr[B] = { - val newFuture = future.flatMap { - case Good(a) => f(a).toFuture - case Bad(error) => Future.successful(Bad(error)) - } - - new FutureOr(newFuture) - } - - def map[B](f: A => B)(implicit ec: ExecutionContext): FutureOr[B] = { - val newFuture = future.map { _.map(f) } - new FutureOr(newFuture) - } - - def mapWithError[B](f: A => B Or ApplicationErrors)(implicit ec: ExecutionContext): FutureOr[B] = { - val newFuture = future.map { - case Good(x) => f(x) - case Bad(e) => Bad(e) - } - - new FutureOr(newFuture) - } -} - -object FutureOr { - object Implicits { - implicit class FutureOps[+A](val future: FutureApplicationResult[A]) extends AnyVal { - def toFutureOr: FutureOr[A] = { - new FutureOr(future) - } - } - - implicit class OrOps[+A](val or: ApplicationResult[A]) extends AnyVal { - def toFutureOr: FutureOr[A] = { - val future = Future.successful(or) - new FutureOr(future) - } - } - - implicit class OptionOps[+A](val option: Option[A]) extends AnyVal { - def toFutureOr(error: ApplicationError): FutureOr[A] = { - val or = Or.from(option, One(error)) - val future = Future.successful(or) - new FutureOr(future) - } - } - } -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/JsonControllerComponents.scala b/alerts-server/app/com/alexitc/coinalerts/commons/JsonControllerComponents.scala deleted file mode 100644 index a9aa51c..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/JsonControllerComponents.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.alexitc.coinalerts.commons - -import play.api.mvc.MessagesControllerComponents - -import scala.concurrent.ExecutionContext - -trait JsonControllerComponents[A] { - - def messagesControllerComponents: MessagesControllerComponents - - def executionContext: ExecutionContext - - def publicErrorRenderer: PublicErrorRenderer - - def applicationErrorMapper: ApplicationErrorMapper - - def authenticatorService: AbstractAuthenticatorService[A] -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/MessageKey.scala b/alerts-server/app/com/alexitc/coinalerts/commons/MessageKey.scala deleted file mode 100644 index 9611337..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/MessageKey.scala +++ /dev/null @@ -1,11 +0,0 @@ -package com.alexitc.coinalerts.commons - -/** - * Represents a message key to use with play i18n. - * - * The use of this model allow us to differentiate - * the messages that are not adequate to display. - * - * @param string - */ -case class MessageKey(string: String) extends AnyVal diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/PublicErrorRenderer.scala b/alerts-server/app/com/alexitc/coinalerts/commons/PublicErrorRenderer.scala deleted file mode 100644 index 9808d81..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/PublicErrorRenderer.scala +++ /dev/null @@ -1,37 +0,0 @@ -package com.alexitc.coinalerts.commons - -import play.api.libs.json.{JsValue, Json} - -class PublicErrorRenderer { - def renderPublicError(publicError: PublicError): JsValue = publicError match { - case e: GenericPublicError => - val obj = Json.obj( - "type" -> "generic-error", - "message" -> e.message - ) - Json.toJson(obj) - - case e: FieldValidationError => - val obj = Json.obj( - "type" -> "field-validation-error", - "field" -> e.field, - "message" -> e.message - ) - Json.toJson(obj) - - case e: HeaderValidationError => - val obj = Json.obj( - "type" -> "header-validation-error", - "header" -> e.header, - "message" -> e.message - ) - Json.toJson(obj) - } - - def renderPrivateError(errorId: ErrorId) = { - Json.obj( - "type" -> "server-error", - "errorId" -> errorId.string - ) - } -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/applicationErrors.scala b/alerts-server/app/com/alexitc/coinalerts/commons/applicationErrors.scala deleted file mode 100644 index 1b434c8..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/applicationErrors.scala +++ /dev/null @@ -1,14 +0,0 @@ -package com.alexitc.coinalerts.commons - -// Top-level errors -trait ApplicationError -trait InputValidationError extends ApplicationError -trait ConflictError extends ApplicationError -trait NotFoundError extends ApplicationError -trait AuthenticationError extends ApplicationError -trait ServerError extends ApplicationError { - // contains data private to the server - def cause: Throwable -} - -case class WrappedExceptionError(cause: Throwable) extends ServerError diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/jsonControllerErrors.scala b/alerts-server/app/com/alexitc/coinalerts/commons/jsonControllerErrors.scala deleted file mode 100644 index 2aae350..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/jsonControllerErrors.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.alexitc.coinalerts.commons - -import play.api.libs.json.JsPath - -sealed trait JsonControllerErrors - -// play json validation errors -case class JsonFieldValidationError(path: JsPath, errors: Seq[MessageKey]) extends JsonControllerErrors with InputValidationError diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/package.scala b/alerts-server/app/com/alexitc/coinalerts/commons/package.scala deleted file mode 100644 index 5ee4f99..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/package.scala +++ /dev/null @@ -1,12 +0,0 @@ -package com.alexitc.coinalerts - -import org.scalactic.{Every, Or} - -import scala.concurrent.Future - -package object commons { - - type ApplicationErrors = Every[ApplicationError] - type ApplicationResult[+A] = A Or ApplicationErrors - type FutureApplicationResult[+A] = Future[ApplicationResult[A]] -} diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/publicErrors.scala b/alerts-server/app/com/alexitc/coinalerts/commons/publicErrors.scala deleted file mode 100644 index c6c4ed3..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/publicErrors.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.alexitc.coinalerts.commons - -/** - * A PublicError could be displayed to anyone. - */ -sealed trait PublicError -case class GenericPublicError(message: String) extends PublicError -case class FieldValidationError(field: String, message: String) extends PublicError -case class HeaderValidationError(header: String, message: String) extends PublicError - -object PublicError { - def genericError(message: String): PublicError = { - GenericPublicError(message) - } -} \ No newline at end of file diff --git a/alerts-server/app/com/alexitc/coinalerts/commons/requestContexts.scala b/alerts-server/app/com/alexitc/coinalerts/commons/requestContexts.scala deleted file mode 100644 index 4653aed..0000000 --- a/alerts-server/app/com/alexitc/coinalerts/commons/requestContexts.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.alexitc.coinalerts.commons - -import play.api.i18n.Lang - -sealed trait RequestContext { - def lang: Lang -} - -sealed trait HasModel[T] { - def model: T -} - -final case class PublicRequestContext(lang: Lang) extends RequestContext -final case class PublicRequestContextWithModel[T](model: T, lang: Lang) - extends RequestContext with HasModel[T] - -final case class AuthenticatedRequestContext[A](auth: A, lang: Lang) extends RequestContext -final case class AuthenticatedRequestContextWithModel[A, T](auth: A, model: T, lang: Lang) - extends RequestContext with HasModel[T] diff --git a/alerts-server/app/com/alexitc/coinalerts/core/package.scala b/alerts-server/app/com/alexitc/coinalerts/core/package.scala index 050397c..4820b14 100644 --- a/alerts-server/app/com/alexitc/coinalerts/core/package.scala +++ b/alerts-server/app/com/alexitc/coinalerts/core/package.scala @@ -1,6 +1,6 @@ package com.alexitc.coinalerts -import com.alexitc.coinalerts.commons.FutureApplicationResult +import com.alexitc.playsonify.core.FutureApplicationResult package object core { diff --git a/alerts-server/app/com/alexitc/coinalerts/data/DailyPriceAlertDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/DailyPriceAlertDataHandler.scala index 911a5f3..4931ccf 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/DailyPriceAlertDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/DailyPriceAlertDataHandler.scala @@ -1,8 +1,8 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.{PaginatedQuery, PaginatedResult} import com.alexitc.coinalerts.models.{CreateDailyPriceAlertModel, DailyPriceAlert, UserId} +import com.alexitc.playsonify.core.ApplicationResult import scala.language.higherKinds diff --git a/alerts-server/app/com/alexitc/coinalerts/data/ExchangeCurrencyDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/ExchangeCurrencyDataHandler.scala index 3781f3c..3d537e7 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/ExchangeCurrencyDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/ExchangeCurrencyDataHandler.scala @@ -1,7 +1,7 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import scala.language.higherKinds diff --git a/alerts-server/app/com/alexitc/coinalerts/data/FixedPriceAlertDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/FixedPriceAlertDataHandler.scala index 81a4675..e0b8406 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/FixedPriceAlertDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/FixedPriceAlertDataHandler.scala @@ -1,9 +1,9 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.{Count, PaginatedQuery, PaginatedResult} import com.alexitc.coinalerts.models.FixedPriceAlertFilter.Conditions import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import scala.language.higherKinds diff --git a/alerts-server/app/com/alexitc/coinalerts/data/NewCurrencyAlertDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/NewCurrencyAlertDataHandler.scala index b25ec48..efa21e5 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/NewCurrencyAlertDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/NewCurrencyAlertDataHandler.scala @@ -1,7 +1,7 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.models.{Exchange, NewCurrencyAlert, UserId} +import com.alexitc.playsonify.core.ApplicationResult import scala.language.higherKinds diff --git a/alerts-server/app/com/alexitc/coinalerts/data/UserDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/UserDataHandler.scala index ca87fab..a910de9 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/UserDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/UserDataHandler.scala @@ -1,7 +1,7 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import scala.language.higherKinds diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/AnormPostgresDAL.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/AnormPostgresDAL.scala index 911db1b..ef84b16 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/AnormPostgresDAL.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/AnormPostgresDAL.scala @@ -2,8 +2,8 @@ package com.alexitc.coinalerts.data.anorm import java.sql.Connection -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.errors.{PostgresError, PostgresIntegrityViolationError} +import com.alexitc.playsonify.core.ApplicationResult import org.postgresql.util.PSQLException import org.scalactic.Bad import play.api.db.Database diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/DailyPriceAlertPostgresDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/DailyPriceAlertPostgresDataHandler.scala index e1dfd93..3444ea9 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/DailyPriceAlertPostgresDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/DailyPriceAlertPostgresDataHandler.scala @@ -2,12 +2,12 @@ package com.alexitc.coinalerts.data.anorm import javax.inject.Inject -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.{PaginatedQuery, PaginatedResult} import com.alexitc.coinalerts.data.DailyPriceAlertBlockingDataHandler import com.alexitc.coinalerts.data.anorm.dao.DailyPriceAlertPostgresDAO import com.alexitc.coinalerts.errors.{PostgresIntegrityViolationError, UnknownExchangeCurrencyIdError} import com.alexitc.coinalerts.models.{CreateDailyPriceAlertModel, DailyPriceAlert, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.Good import play.api.db.Database diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/ExchangeCurrencyPostgresDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/ExchangeCurrencyPostgresDataHandler.scala index 3b188ef..860c676 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/ExchangeCurrencyPostgresDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/ExchangeCurrencyPostgresDataHandler.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.data.anorm import javax.inject.Inject -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.data.ExchangeCurrencyBlockingDataHandler import com.alexitc.coinalerts.data.anorm.dao.ExchangeCurrencyPostgresDAO import com.alexitc.coinalerts.errors.RepeatedExchangeCurrencyError import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Good, One, Or} import play.api.db.Database diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/FixedPriceAlertPostgresDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/FixedPriceAlertPostgresDataHandler.scala index 9fb6add..336b9a7 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/FixedPriceAlertPostgresDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/FixedPriceAlertPostgresDataHandler.scala @@ -2,12 +2,12 @@ package com.alexitc.coinalerts.data.anorm import javax.inject.Inject -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.{Count, PaginatedQuery, PaginatedResult} import com.alexitc.coinalerts.data.FixedPriceAlertBlockingDataHandler import com.alexitc.coinalerts.data.anorm.dao.{ExchangeCurrencyPostgresDAO, FixedPriceAlertPostgresDAO} import com.alexitc.coinalerts.errors._ import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good, One, Or} import play.api.db.Database diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/NewCurrencyAlertPostgresDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/NewCurrencyAlertPostgresDataHandler.scala index a0fac75..e34218e 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/NewCurrencyAlertPostgresDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/NewCurrencyAlertPostgresDataHandler.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.data.anorm import javax.inject.Inject -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.data.NewCurrencyAlertBlockingDataHandler import com.alexitc.coinalerts.data.anorm.dao.NewCurrencyAlertPostgresDAO import com.alexitc.coinalerts.errors.{NewCurrencyAlertNotFoundError, PostgresIntegrityViolationError, RepeatedExchangeError, VerifiedUserNotFound} -import com.alexitc.coinalerts.models.{Exchange, NewCurrencyAlert, NewCurrencyAlertId, UserId} +import com.alexitc.coinalerts.models.{Exchange, NewCurrencyAlert, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Good, One, Or} import play.api.db.Database diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/UserPostgresDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/UserPostgresDataHandler.scala index 2e8cb6a..90cb185 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/UserPostgresDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/UserPostgresDataHandler.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.data.anorm import javax.inject.Inject -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.data.UserBlockingDataHandler import com.alexitc.coinalerts.data.anorm.dao.UserPostgresDAO import com.alexitc.coinalerts.errors._ import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Good, One, Or} import org.slf4j.LoggerFactory import play.api.db.Database diff --git a/alerts-server/app/com/alexitc/coinalerts/data/anorm/dao/DailyPriceAlertPostgresDAO.scala b/alerts-server/app/com/alexitc/coinalerts/data/anorm/dao/DailyPriceAlertPostgresDAO.scala index 4d47f49..0e5af07 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/anorm/dao/DailyPriceAlertPostgresDAO.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/anorm/dao/DailyPriceAlertPostgresDAO.scala @@ -3,11 +3,11 @@ package com.alexitc.coinalerts.data.anorm.dao import java.sql.Connection import anorm._ -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.{Count, PaginatedQuery} import com.alexitc.coinalerts.data.anorm.parsers.DailyPriceAlertParsers import com.alexitc.coinalerts.errors.RepeatedDailyPriceAlertError import com.alexitc.coinalerts.models.{CreateDailyPriceAlertModel, DailyPriceAlert, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{One, Or} class DailyPriceAlertPostgresDAO { diff --git a/alerts-server/app/com/alexitc/coinalerts/data/async/DailyPriceAlertFutureDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/async/DailyPriceAlertFutureDataHandler.scala index dbab1d2..f47ed23 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/async/DailyPriceAlertFutureDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/async/DailyPriceAlertFutureDataHandler.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.data.async import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.DatabaseExecutionContext import com.alexitc.coinalerts.core.{FuturePaginatedResult, PaginatedQuery} import com.alexitc.coinalerts.data.{DailyPriceAlertBlockingDataHandler, DailyPriceAlertDataHandler} import com.alexitc.coinalerts.models.{CreateDailyPriceAlertModel, DailyPriceAlert, UserId} +import com.alexitc.playsonify.core.FutureApplicationResult import scala.concurrent.Future diff --git a/alerts-server/app/com/alexitc/coinalerts/data/async/ExchangeCurrencyFutureDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/async/ExchangeCurrencyFutureDataHandler.scala index 303a16c..0de5394 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/async/ExchangeCurrencyFutureDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/async/ExchangeCurrencyFutureDataHandler.scala @@ -2,10 +2,10 @@ package com.alexitc.coinalerts.data.async import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.DatabaseExecutionContext import com.alexitc.coinalerts.data.{ExchangeCurrencyBlockingDataHandler, ExchangeCurrencyDataHandler} import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.FutureApplicationResult import scala.concurrent.Future diff --git a/alerts-server/app/com/alexitc/coinalerts/data/async/FixedPriceAlertFutureDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/async/FixedPriceAlertFutureDataHandler.scala index 1f1de2a..08c6f70 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/async/FixedPriceAlertFutureDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/async/FixedPriceAlertFutureDataHandler.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.data.async import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.DatabaseExecutionContext import com.alexitc.coinalerts.core.{Count, FuturePaginatedResult, PaginatedQuery} import com.alexitc.coinalerts.data.{FixedPriceAlertBlockingDataHandler, FixedPriceAlertDataHandler} import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.FutureApplicationResult import scala.concurrent.Future diff --git a/alerts-server/app/com/alexitc/coinalerts/data/async/NewCurrencyAlertFutureDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/async/NewCurrencyAlertFutureDataHandler.scala index 23b0a82..3c2666b 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/async/NewCurrencyAlertFutureDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/async/NewCurrencyAlertFutureDataHandler.scala @@ -2,10 +2,10 @@ package com.alexitc.coinalerts.data.async import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.DatabaseExecutionContext import com.alexitc.coinalerts.data.{NewCurrencyAlertBlockingDataHandler, NewCurrencyAlertDataHandler} import com.alexitc.coinalerts.models.{Exchange, NewCurrencyAlert, UserId} +import com.alexitc.playsonify.core.FutureApplicationResult import scala.concurrent.Future diff --git a/alerts-server/app/com/alexitc/coinalerts/data/async/UserFutureDataHandler.scala b/alerts-server/app/com/alexitc/coinalerts/data/async/UserFutureDataHandler.scala index 160a932..d426112 100644 --- a/alerts-server/app/com/alexitc/coinalerts/data/async/UserFutureDataHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/data/async/UserFutureDataHandler.scala @@ -2,10 +2,10 @@ package com.alexitc.coinalerts.data.async import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.DatabaseExecutionContext import com.alexitc.coinalerts.data.{UserBlockingDataHandler, UserDataHandler} import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.FutureApplicationResult import scala.concurrent.Future diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/MyApplicationErrorMapper.scala b/alerts-server/app/com/alexitc/coinalerts/errors/MyApplicationErrorMapper.scala index 56b87d2..7c406c8 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/MyApplicationErrorMapper.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/MyApplicationErrorMapper.scala @@ -2,7 +2,8 @@ package com.alexitc.coinalerts.errors import javax.inject.Inject -import com.alexitc.coinalerts.commons._ +import com.alexitc.playsonify.ApplicationErrorMapper +import com.alexitc.playsonify.models._ import play.api.i18n.{Lang, MessagesApi} class MyApplicationErrorMapper @Inject() (messagesApi: MessagesApi) extends ApplicationErrorMapper { diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/PlayErrorHandler.scala b/alerts-server/app/com/alexitc/coinalerts/errors/PlayErrorHandler.scala index 53e11f0..2c82620 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/PlayErrorHandler.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/PlayErrorHandler.scala @@ -2,7 +2,8 @@ package com.alexitc.coinalerts.errors import javax.inject.{Inject, Singleton} -import com.alexitc.coinalerts.commons.{ErrorId, PublicError, PublicErrorRenderer} +import com.alexitc.playsonify.PublicErrorRenderer +import com.alexitc.playsonify.models.{ErrorId, PublicError} import org.slf4j.LoggerFactory import play.api.http.HttpErrorHandler import play.api.libs.json.Json diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/dailyPriceAlertErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/dailyPriceAlertErrors.scala index 225558e..2f8f5c5 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/dailyPriceAlertErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/dailyPriceAlertErrors.scala @@ -1,7 +1,6 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.ConflictError +import com.alexitc.playsonify.models.ConflictError -// Daily price alert sealed trait DailyPriceAlertError case object RepeatedDailyPriceAlertError extends DailyPriceAlertError with ConflictError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/exchangeCurrencyErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/exchangeCurrencyErrors.scala index e83858e..c2ed658 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/exchangeCurrencyErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/exchangeCurrencyErrors.scala @@ -1,6 +1,6 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.{InputValidationError, NotFoundError} +import com.alexitc.playsonify.models.{InputValidationError, NotFoundError} sealed trait ExchangeCurrencyError case object UnknownExchangeCurrencyIdError extends ExchangeCurrencyError with InputValidationError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/fixedPriceAlertErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/fixedPriceAlertErrors.scala index 6819035..6e720cd 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/fixedPriceAlertErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/fixedPriceAlertErrors.scala @@ -1,7 +1,7 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.{ConflictError, InputValidationError, NotFoundError} import com.alexitc.coinalerts.core.Count +import com.alexitc.playsonify.models.{ConflictError, InputValidationError, NotFoundError} // Fixed price alert sealed trait FixedPriceAlertError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/jWTErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/jWTErrors.scala index 53ee04a..5af1a09 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/jWTErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/jWTErrors.scala @@ -1,6 +1,6 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.AuthenticationError +import com.alexitc.playsonify.models.AuthenticationError sealed trait JWTError case object AuthorizationHeaderRequiredError extends JWTError with AuthenticationError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/mailgunErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/mailgunErrors.scala index ca755b3..6cd8363 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/mailgunErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/mailgunErrors.scala @@ -1,7 +1,6 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.InputValidationError +import com.alexitc.playsonify.models.InputValidationError -// Mailgun sealed trait MailgunError case object MailgunSendEmailError extends MailgunError with InputValidationError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/newCurrencyAlertErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/newCurrencyAlertErrors.scala index c8358d1..3a31478 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/newCurrencyAlertErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/newCurrencyAlertErrors.scala @@ -1,6 +1,6 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.{ConflictError, NotFoundError} +import com.alexitc.playsonify.models.{ConflictError, NotFoundError} sealed trait NewCurrencyAlertError case object RepeatedExchangeError extends NewCurrencyAlertError with ConflictError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/paginatedQueryErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/paginatedQueryErrors.scala index bbac3dc..a3d7232 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/paginatedQueryErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/paginatedQueryErrors.scala @@ -1,8 +1,7 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.InputValidationError +import com.alexitc.playsonify.models.InputValidationError -// Paginated query sealed trait PaginatedQueryError case object InvalidQueryOffsetError extends PaginatedQueryError with InputValidationError case class InvalidQueryLimitError(maxValue: Int) extends PaginatedQueryError with InputValidationError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/postgresErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/postgresErrors.scala index fd0883f..5466fb3 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/postgresErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/postgresErrors.scala @@ -1,9 +1,8 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.ServerError +import com.alexitc.playsonify.models.ServerError import org.postgresql.util.PSQLException -// PostgreSQL specific errors sealed trait PostgresError extends ServerError { def cause: PSQLException } diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/reCaptchaErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/reCaptchaErrors.scala index f559412..7e03ac9 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/reCaptchaErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/reCaptchaErrors.scala @@ -1,6 +1,6 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.InputValidationError +import com.alexitc.playsonify.models.InputValidationError sealed trait ReCaptchaError case object ReCaptchaValidationError extends ReCaptchaError with InputValidationError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/userErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/userErrors.scala index a7a1abb..e08921b 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/userErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/userErrors.scala @@ -1,8 +1,7 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.{ConflictError, InputValidationError} +import com.alexitc.playsonify.models.{ConflictError, InputValidationError} -// User errors sealed trait UserError case object InvalidEmailFormatError extends UserError with InputValidationError case class InvalidEmailLengthError(maxLength: Int) extends UserError with InputValidationError diff --git a/alerts-server/app/com/alexitc/coinalerts/errors/userVerificationTokenErrors.scala b/alerts-server/app/com/alexitc/coinalerts/errors/userVerificationTokenErrors.scala index 484a841..a4cc79c 100644 --- a/alerts-server/app/com/alexitc/coinalerts/errors/userVerificationTokenErrors.scala +++ b/alerts-server/app/com/alexitc/coinalerts/errors/userVerificationTokenErrors.scala @@ -1,8 +1,7 @@ package com.alexitc.coinalerts.errors -import com.alexitc.coinalerts.commons.{ConflictError, NotFoundError} +import com.alexitc.playsonify.models.{ConflictError, NotFoundError} -// Verify user email sealed trait UserVerificationTokenError case object UserVerificationTokenNotFoundError extends UserVerificationTokenError with NotFoundError case object UserVerificationTokenAlreadyExistsError extends UserVerificationTokenError with ConflictError diff --git a/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertFilterParser.scala b/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertFilterParser.scala index fa24aed..885c04b 100644 --- a/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertFilterParser.scala +++ b/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertFilterParser.scala @@ -1,9 +1,9 @@ package com.alexitc.coinalerts.parsers -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.FilterQuery import com.alexitc.coinalerts.errors.InvalidFilterError import com.alexitc.coinalerts.models.{FixedPriceAlertFilter, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good} class FixedPriceAlertFilterParser { diff --git a/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertOrderByParser.scala b/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertOrderByParser.scala index ec003a6..8f40cc2 100644 --- a/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertOrderByParser.scala +++ b/alerts-server/app/com/alexitc/coinalerts/parsers/FixedPriceAlertOrderByParser.scala @@ -1,10 +1,10 @@ package com.alexitc.coinalerts.parsers -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.OrderByQuery import com.alexitc.coinalerts.errors.InvalidOrderError import com.alexitc.coinalerts.models.FixedPriceAlertOrderBy import com.alexitc.coinalerts.models.FixedPriceAlertOrderBy.{Conditions, DescendingOrderCondition, OrderByCreatedOn} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good, One, Or} class FixedPriceAlertOrderByParser { diff --git a/alerts-server/app/com/alexitc/coinalerts/services/DailyPriceAlertService.scala b/alerts-server/app/com/alexitc/coinalerts/services/DailyPriceAlertService.scala index 765dbfd..dfaa84e 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/DailyPriceAlertService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/DailyPriceAlertService.scala @@ -2,12 +2,12 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult -import com.alexitc.coinalerts.commons.FutureOr.Implicits.{FutureOps, OrOps} import com.alexitc.coinalerts.core.{FuturePaginatedResult, PaginatedQuery} import com.alexitc.coinalerts.data.async.DailyPriceAlertFutureDataHandler import com.alexitc.coinalerts.models.{CreateDailyPriceAlertModel, DailyPriceAlert, UserId} import com.alexitc.coinalerts.services.validators.PaginatedQueryValidator +import com.alexitc.playsonify.core.FutureApplicationResult +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} import scala.concurrent.ExecutionContext diff --git a/alerts-server/app/com/alexitc/coinalerts/services/EmailServiceTrait.scala b/alerts-server/app/com/alexitc/coinalerts/services/EmailServiceTrait.scala index aa9d79f..ff59fa2 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/EmailServiceTrait.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/EmailServiceTrait.scala @@ -1,7 +1,7 @@ package com.alexitc.coinalerts.services -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.models.UserEmail +import com.alexitc.playsonify.core.FutureApplicationResult trait EmailServiceTrait { diff --git a/alerts-server/app/com/alexitc/coinalerts/services/ExchangeCurrencyService.scala b/alerts-server/app/com/alexitc/coinalerts/services/ExchangeCurrencyService.scala index 3a23a62..6becbd0 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/ExchangeCurrencyService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/ExchangeCurrencyService.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult -import com.alexitc.coinalerts.commons.FutureOr.Implicits.FutureOps import com.alexitc.coinalerts.data.async.ExchangeCurrencyFutureDataHandler import com.alexitc.coinalerts.errors.ExchangeCurrencyNotFoundError import com.alexitc.coinalerts.models.{Exchange, ExchangeCurrency, ExchangeCurrencyId, Market} +import com.alexitc.playsonify.core.FutureApplicationResult +import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps import org.scalactic.{Bad, Good} import scala.concurrent.ExecutionContext diff --git a/alerts-server/app/com/alexitc/coinalerts/services/FixedPriceAlertService.scala b/alerts-server/app/com/alexitc/coinalerts/services/FixedPriceAlertService.scala index 1fc5669..843ae34 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/FixedPriceAlertService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/FixedPriceAlertService.scala @@ -2,9 +2,8 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult -import com.alexitc.coinalerts.commons.FutureOr.Implicits.{FutureOps, OrOps} import com.alexitc.coinalerts.config.FixedPriceAlertConfig +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} import com.alexitc.coinalerts.core._ import com.alexitc.coinalerts.data.async.FixedPriceAlertFutureDataHandler import com.alexitc.coinalerts.errors.TooManyFixedPriceAlertsError @@ -12,6 +11,8 @@ import com.alexitc.coinalerts.models.FixedPriceAlertFilter.{HasNotBeenTriggeredC import com.alexitc.coinalerts.models._ import com.alexitc.coinalerts.parsers.{FixedPriceAlertFilterParser, FixedPriceAlertOrderByParser} import com.alexitc.coinalerts.services.validators.{FixedPriceAlertValidator, PaginatedQueryValidator} +import com.alexitc.playsonify.core.FutureApplicationResult +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} import org.scalactic.{Bad, Good} import scala.concurrent.ExecutionContext diff --git a/alerts-server/app/com/alexitc/coinalerts/services/JWTAuthenticatorService.scala b/alerts-server/app/com/alexitc/coinalerts/services/JWTAuthenticatorService.scala index 748efd1..193bb92 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/JWTAuthenticatorService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/JWTAuthenticatorService.scala @@ -2,10 +2,11 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.{AbstractAuthenticatorService, ApplicationResult, FutureApplicationResult} import com.alexitc.coinalerts.core.AuthorizationToken import com.alexitc.coinalerts.errors.{AuthorizationHeaderRequiredError, InvalidJWTError} import com.alexitc.coinalerts.models.UserId +import com.alexitc.playsonify.AbstractAuthenticatorService +import com.alexitc.playsonify.core.{ApplicationResult, FutureApplicationResult} import org.scalactic.{Bad, One, Or} import play.api.http.HeaderNames import play.api.libs.json.JsValue diff --git a/alerts-server/app/com/alexitc/coinalerts/services/JWTService.scala b/alerts-server/app/com/alexitc/coinalerts/services/JWTService.scala index 82ebefa..8bbcc1f 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/JWTService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/JWTService.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.config.JWTConfig import com.alexitc.coinalerts.core.AuthorizationToken import com.alexitc.coinalerts.errors.InvalidJWTError import com.alexitc.coinalerts.models.{User, UserEmail, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good} import pdi.jwt.{Jwt, JwtAlgorithm, JwtClaim} import play.api.libs.json.Json diff --git a/alerts-server/app/com/alexitc/coinalerts/services/NewCurrencyAlertService.scala b/alerts-server/app/com/alexitc/coinalerts/services/NewCurrencyAlertService.scala index f803c24..fe14207 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/NewCurrencyAlertService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/NewCurrencyAlertService.scala @@ -2,9 +2,9 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.data.async.NewCurrencyAlertFutureDataHandler import com.alexitc.coinalerts.models.{Exchange, NewCurrencyAlert, UserId} +import com.alexitc.playsonify.core.FutureApplicationResult class NewCurrencyAlertService @Inject() (newCurrencyAlertFutureDataHandler: NewCurrencyAlertFutureDataHandler) { diff --git a/alerts-server/app/com/alexitc/coinalerts/services/UserService.scala b/alerts-server/app/com/alexitc/coinalerts/services/UserService.scala index 61903ea..64a4070 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/UserService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/UserService.scala @@ -2,13 +2,13 @@ package com.alexitc.coinalerts.services import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureOr.Implicits._ -import com.alexitc.coinalerts.commons.{ApplicationErrors, FutureApplicationResult} import com.alexitc.coinalerts.core.AuthorizationToken import com.alexitc.coinalerts.data.async.UserFutureDataHandler import com.alexitc.coinalerts.errors.IncorrectPasswordError import com.alexitc.coinalerts.models._ import com.alexitc.coinalerts.services.validators.UserValidator +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} +import com.alexitc.playsonify.core.{ApplicationErrors, FutureApplicationResult} import org.mindrot.jbcrypt.BCrypt import org.scalactic._ import play.api.i18n.Lang diff --git a/alerts-server/app/com/alexitc/coinalerts/services/external/MailgunEmailService.scala b/alerts-server/app/com/alexitc/coinalerts/services/external/MailgunEmailService.scala index ff24d27..7c7e8bb 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/external/MailgunEmailService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/external/MailgunEmailService.scala @@ -2,11 +2,11 @@ package com.alexitc.coinalerts.services.external import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.{ExternalServiceExecutionContext, MailgunConfig} import com.alexitc.coinalerts.errors.MailgunSendEmailError import com.alexitc.coinalerts.models.UserEmail import com.alexitc.coinalerts.services.{EmailServiceTrait, EmailSubject, EmailText} +import com.alexitc.playsonify.core.FutureApplicationResult import org.scalactic.{Bad, Good} import org.slf4j.LoggerFactory import play.api.libs.functional.syntax._ diff --git a/alerts-server/app/com/alexitc/coinalerts/services/external/ReCaptchaService.scala b/alerts-server/app/com/alexitc/coinalerts/services/external/ReCaptchaService.scala index 55b8943..964060c 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/external/ReCaptchaService.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/external/ReCaptchaService.scala @@ -2,10 +2,10 @@ package com.alexitc.coinalerts.services.external import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureApplicationResult import com.alexitc.coinalerts.config.{ExternalServiceExecutionContext, ReCaptchaConfig} import com.alexitc.coinalerts.errors.ReCaptchaValidationError import com.alexitc.coinalerts.models.ReCaptchaResponse +import com.alexitc.playsonify.core.FutureApplicationResult import org.scalactic.{Bad, Good} import play.api.libs.ws.WSClient diff --git a/alerts-server/app/com/alexitc/coinalerts/services/validators/FixedPriceAlertValidator.scala b/alerts-server/app/com/alexitc/coinalerts/services/validators/FixedPriceAlertValidator.scala index 4049657..7f31b4a 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/validators/FixedPriceAlertValidator.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/validators/FixedPriceAlertValidator.scala @@ -1,8 +1,8 @@ package com.alexitc.coinalerts.services.validators -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.errors.{InvalidBasePriceError, InvalidPriceError} import com.alexitc.coinalerts.models.CreateFixedPriceAlertModel +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Accumulation, Bad, Good} class FixedPriceAlertValidator { diff --git a/alerts-server/app/com/alexitc/coinalerts/services/validators/PaginatedQueryValidator.scala b/alerts-server/app/com/alexitc/coinalerts/services/validators/PaginatedQueryValidator.scala index d2cbebe..6bcd477 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/validators/PaginatedQueryValidator.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/validators/PaginatedQueryValidator.scala @@ -1,8 +1,8 @@ package com.alexitc.coinalerts.services.validators -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.core.{Limit, Offset, PaginatedQuery} import com.alexitc.coinalerts.errors.{InvalidQueryLimitError, InvalidQueryOffsetError} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Accumulation, Bad, Good} class PaginatedQueryValidator { diff --git a/alerts-server/app/com/alexitc/coinalerts/services/validators/UserValidator.scala b/alerts-server/app/com/alexitc/coinalerts/services/validators/UserValidator.scala index 3b12e67..5ad45e3 100644 --- a/alerts-server/app/com/alexitc/coinalerts/services/validators/UserValidator.scala +++ b/alerts-server/app/com/alexitc/coinalerts/services/validators/UserValidator.scala @@ -1,8 +1,8 @@ package com.alexitc.coinalerts.services.validators -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.errors.{InvalidEmailFormatError, InvalidEmailLengthError, InvalidPasswordLengthError, UnsupportedLangError} import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.apache.commons.validator.routines.EmailValidator import org.scalactic.Accumulation.withGood import org.scalactic.{Bad, Good, One, Or} diff --git a/alerts-server/app/com/alexitc/coinalerts/tasks/ExchangeCurrencySeederTask.scala b/alerts-server/app/com/alexitc/coinalerts/tasks/ExchangeCurrencySeederTask.scala index e7aa5e0..90892d4 100644 --- a/alerts-server/app/com/alexitc/coinalerts/tasks/ExchangeCurrencySeederTask.scala +++ b/alerts-server/app/com/alexitc/coinalerts/tasks/ExchangeCurrencySeederTask.scala @@ -2,13 +2,13 @@ package com.alexitc.coinalerts.tasks import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureOr.Implicits.FutureOps import com.alexitc.coinalerts.config.TaskExecutionContext import com.alexitc.coinalerts.data.ExchangeCurrencyBlockingDataHandler import com.alexitc.coinalerts.data.async.{NewCurrencyAlertFutureDataHandler, UserFutureDataHandler} import com.alexitc.coinalerts.models._ import com.alexitc.coinalerts.services.external._ import com.alexitc.coinalerts.services.{EmailMessagesProvider, EmailServiceTrait} +import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps import org.scalactic.TypeCheckedTripleEquals._ import org.scalactic.{Bad, Good} import org.slf4j.LoggerFactory diff --git a/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertCollector.scala b/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertCollector.scala index 554ecd4..3b8c87c 100644 --- a/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertCollector.scala +++ b/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertCollector.scala @@ -2,12 +2,12 @@ package com.alexitc.coinalerts.tasks import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureOr.Implicits.FutureOps import com.alexitc.coinalerts.config.TaskExecutionContext import com.alexitc.coinalerts.data.async.{ExchangeCurrencyFutureDataHandler, FixedPriceAlertFutureDataHandler} import com.alexitc.coinalerts.models._ import com.alexitc.coinalerts.tasks.collectors.TickerCollector import com.alexitc.coinalerts.tasks.models.{FixedPriceAlertEvent, Ticker} +import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps import org.scalactic.{Bad, Good} import org.slf4j.LoggerFactory diff --git a/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertsTask.scala b/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertsTask.scala index 9fc58bf..265bb7a 100644 --- a/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertsTask.scala +++ b/alerts-server/app/com/alexitc/coinalerts/tasks/FixedPriceAlertsTask.scala @@ -3,13 +3,13 @@ package com.alexitc.coinalerts.tasks import java.math.MathContext import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureOr.Implicits.FutureOps import com.alexitc.coinalerts.config.TaskExecutionContext import com.alexitc.coinalerts.data.async.{FixedPriceAlertFutureDataHandler, UserFutureDataHandler} import com.alexitc.coinalerts.models._ import com.alexitc.coinalerts.services.{EmailMessagesProvider, EmailServiceTrait, EmailText} import com.alexitc.coinalerts.tasks.collectors._ import com.alexitc.coinalerts.tasks.models.FixedPriceAlertEvent +import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps import org.scalactic.{Bad, Good} import org.slf4j.LoggerFactory import play.api.i18n.{Lang, MessagesApi} diff --git a/alerts-server/app/controllers/MyJsonController.scala b/alerts-server/app/controllers/MyJsonController.scala index 8c37f4d..1c33871 100644 --- a/alerts-server/app/controllers/MyJsonController.scala +++ b/alerts-server/app/controllers/MyJsonController.scala @@ -1,6 +1,7 @@ package controllers -import com.alexitc.coinalerts.commons.{AbstractJsonController, ErrorId, ServerError} +import com.alexitc.playsonify.AbstractJsonController +import com.alexitc.playsonify.models.{ErrorId, ServerError} import org.slf4j.LoggerFactory class MyJsonController (components: MyJsonControllerComponents) extends AbstractJsonController(components) { diff --git a/alerts-server/app/controllers/MyJsonControllerComponents.scala b/alerts-server/app/controllers/MyJsonControllerComponents.scala index 8693957..f733fae 100644 --- a/alerts-server/app/controllers/MyJsonControllerComponents.scala +++ b/alerts-server/app/controllers/MyJsonControllerComponents.scala @@ -2,10 +2,10 @@ package controllers import javax.inject.Inject -import com.alexitc.coinalerts.commons.{JsonControllerComponents, PublicErrorRenderer} import com.alexitc.coinalerts.errors.MyApplicationErrorMapper import com.alexitc.coinalerts.models.UserId import com.alexitc.coinalerts.services.JWTAuthenticatorService +import com.alexitc.playsonify.{JsonControllerComponents, PublicErrorRenderer} import play.api.mvc.MessagesControllerComponents import scala.concurrent.ExecutionContext diff --git a/alerts-server/app/controllers/UsersController.scala b/alerts-server/app/controllers/UsersController.scala index e598667..9466638 100644 --- a/alerts-server/app/controllers/UsersController.scala +++ b/alerts-server/app/controllers/UsersController.scala @@ -2,10 +2,10 @@ package controllers import javax.inject.Inject -import com.alexitc.coinalerts.commons.FutureOr.Implicits.FutureOps import com.alexitc.coinalerts.models._ import com.alexitc.coinalerts.services.UserService import com.alexitc.coinalerts.services.external.ReCaptchaService +import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps class UsersController @Inject() ( reCaptchaService: ReCaptchaService, diff --git a/alerts-server/app/controllers/package.scala b/alerts-server/app/controllers/package.scala index 7f3ce15..ccb6615 100644 --- a/alerts-server/app/controllers/package.scala +++ b/alerts-server/app/controllers/package.scala @@ -1,13 +1,13 @@ -import com.alexitc.coinalerts.commons.{AuthenticatedRequestContext, AuthenticatedRequestContextWithModel, PublicRequestContext, PublicRequestContextWithModel} import com.alexitc.coinalerts.models.UserId +import com.alexitc.playsonify.models._ package object controllers { /** * These type alias help to not type the long request context names in the controllers */ - type PublicCtx = PublicRequestContext - type PublicCtxModel[T] = PublicRequestContextWithModel[T] - type AuthCtx = AuthenticatedRequestContext[UserId] - type AuthCtxModel[T] = AuthenticatedRequestContextWithModel[UserId, T] + type PublicCtx = PublicContext + type PublicCtxModel[T] = PublicContextWithModel[T] + type AuthCtx = AuthenticatedContext[UserId] + type AuthCtxModel[T] = AuthenticatedContextWithModel[UserId, T] } diff --git a/alerts-server/build.sbt b/alerts-server/build.sbt index 413ebed..7b17c95 100644 --- a/alerts-server/build.sbt +++ b/alerts-server/build.sbt @@ -35,6 +35,7 @@ coverageExcludedPackages := ";Reverse.*;router\\.*" libraryDependencies ++= Seq(guice, evolutions, jdbc, ws, specs2 % Test) libraryDependencies += "com.typesafe.play" %% "anorm" % "2.5.3" +libraryDependencies += "com.alexitc" %% "playsonify" % "1.0.0" libraryDependencies += "com.google.inject" % "guice" % "4.1.0" libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.4" libraryDependencies += "org.postgresql" % "postgresql" % "9.4.1212" // docker-it-scala has issues with 42.1.4 diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/AbstractJsonControllerSpec.scala b/alerts-server/test/com/alexitc/coinalerts/commons/AbstractJsonControllerSpec.scala deleted file mode 100644 index ea2c960..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/AbstractJsonControllerSpec.scala +++ /dev/null @@ -1,273 +0,0 @@ -package com.alexitc.coinalerts.commons - -import com.alexitc.coinalerts.commons.examples.{AuthenticatedNoInputController, PublicNoInputController, PublicWithInputController} -import play.api.libs.json.{JsValue, Json} -import play.api.test.Helpers._ -import play.api.test._ - -class AbstractJsonControllerSpec extends PlayAPISpec { - - val application = guiceApplicationBuilder.build() - implicit val materializer = application.materializer - - val injector = application.injector - - "publicNoInput" should { - val controller = injector.instanceOf[PublicNoInputController] - - "serialize a result as json" in { - val int = 0 - val string = "hi" - val result = controller.getModel(int, string).apply(FakeRequest()) - - status(result) mustEqual OK - val json = contentAsJson(result) - (json \ "int").as[Int] mustEqual int - (json \ "string").as[String] mustEqual string - } - - "allows to override successful result status" in { - val result = controller.getCustomStatus().apply(FakeRequest()) - - status(result) mustEqual CREATED - } - - "serializes an error list as json" in { - val result = controller.getErrors().apply(FakeRequest()) - status(result) mustEqual BAD_REQUEST - - val json = contentAsJson(result) - val errorList = (json \ "errors").as[List[JsValue]] - - errorList.size mustEqual 2 - - val firstError = errorList.head - (firstError \ "type").as[String] mustEqual "field-validation-error" - (firstError \ "field").as[String] mustEqual "field" - (firstError \ "message").as[String].nonEmpty mustEqual true - - val secondError = errorList.lift(1).get - (secondError \ "type").as[String] mustEqual "field-validation-error" - (secondError \ "field").as[String] mustEqual "anotherField" - (secondError \ "message").as[String].nonEmpty mustEqual true - } - - "serialize exceptions as json with an error id" in { - val exception = new RuntimeException("failed") - val result = controller.getException(exception).apply(FakeRequest()) - status(result) mustEqual INTERNAL_SERVER_ERROR - - val json = contentAsJson(result) - val errorList = (json \ "errors").as[List[JsValue]] - errorList.size mustEqual 1 - - val error = errorList.head - (error \ "type").as[String] mustEqual "server-error" - (error \ "errorId").as[String].nonEmpty mustEqual true - } - } - - "publicWithInput" should { - val controller = injector.instanceOf[PublicWithInputController] - - "serialize a result as json" in { - val body = - """ - | { - | "int": 0, - | "string": "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withJsonBody(Json.parse(body)) - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getModel(), request) - - status(result) mustEqual OK - val json = contentAsJson(result) - (json \ "int").as[Int] mustEqual 0 - (json \ "string").as[String] mustEqual "none" - } - - "reject invalid json body" in { - val body = - """ - | { - | int: 0 - | string: "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withBody(body) - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getModel(), request) - - status(result) mustEqual BAD_REQUEST - val json = contentAsJson(result) - val errors = (json \ "errors").as[List[JsValue]] - errors.size mustEqual 1 - - val error = errors.head - (error \ "type").as[String] mustEqual "generic-error" - (error \ "message").as[String].nonEmpty mustEqual true - } - - "reject json with missing field" in { - val body = - """ - | { - | "string": "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withBody(body) - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getModel(), request) - - status(result) mustEqual BAD_REQUEST - val json = contentAsJson(result) - val errors = (json \ "errors").as[List[JsValue]] - errors.size mustEqual 1 - - val error = errors.head - (error \ "type").as[String] mustEqual "field-validation-error" - (error \ "field").as[String] mustEqual "int" - (error \ "message").as[String].nonEmpty mustEqual true - } - - "reject json with wrong types" in { - val body = - """ - | { - | "int": "1", - | "string": "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withBody(body) - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getModel(), request) - - status(result) mustEqual BAD_REQUEST - val json = contentAsJson(result) - - val errors = (json \ "errors").as[List[JsValue]] - errors.size mustEqual 1 - - val error = errors.head - (error \ "type").as[String] mustEqual "field-validation-error" - (error \ "field").as[String] mustEqual "int" - (error \ "message").as[String].nonEmpty mustEqual true - } - - "reject empty body" in { - val request = FakeRequest("POST", "/") - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getModel(), request) - - status(result) mustEqual BAD_REQUEST - val json = contentAsJson(result) - val errors = (json \ "errors").as[List[JsValue]] - errors.size mustEqual 1 - - val error = errors.head - (error \ "type").as[String] mustEqual "generic-error" - (error \ "message").as[String].nonEmpty mustEqual true - } - - "allows to override successful result status" in { - val body = - """ - | { - | "int": 0, - | "string": "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withJsonBody(Json.parse(body)) - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getCustomStatus(), request) - - status(result) mustEqual CREATED - } - - "serializes an error list as json" in { - val body = - """ - | { - | "int": 0, - | "string": "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withJsonBody(Json.parse(body)) - .withHeaders(CONTENT_TYPE -> "application/json") - val result = call(controller.getErrors(), request) - status(result) mustEqual BAD_REQUEST - - val json = contentAsJson(result) - val errorList = (json \ "errors").as[List[JsValue]] - - errorList.size mustEqual 2 - - val firstError = errorList.head - (firstError \ "type").as[String] mustEqual "field-validation-error" - (firstError \ "field").as[String] mustEqual "field" - (firstError \ "message").as[String].nonEmpty mustEqual true - - val secondError = errorList.lift(1).get - (secondError \ "type").as[String] mustEqual "field-validation-error" - (secondError \ "field").as[String] mustEqual "anotherField" - (secondError \ "message").as[String].nonEmpty mustEqual true - } - - "serialize exceptions as json with an error id" in { - val body = - """ - | { - | "int": 0, - | "string": "none" - | } - """.stripMargin - val request = FakeRequest("POST", "/") - .withJsonBody(Json.parse(body)) - .withHeaders(CONTENT_TYPE -> "application/json") - val exception = new RuntimeException("nothing") - val result = call(controller.getException(exception), request) - status(result) mustEqual INTERNAL_SERVER_ERROR - - val json = contentAsJson(result) - val errorList = (json \ "errors").as[List[JsValue]] - errorList.size mustEqual 1 - - val error = errorList.head - (error \ "type").as[String] mustEqual "server-error" - (error \ "errorId").as[String].nonEmpty mustEqual true - } - } - - "authenticatedNoInput" should { - val controller = injector.instanceOf[AuthenticatedNoInputController] - - "return UNAUTHORIZED when no AUTHORIZATION header is present" in { - val result = controller.getModel(0, "").apply(FakeRequest()) - - status(result) mustEqual UNAUTHORIZED - val json = contentAsJson(result) - val errorList = (json \ "errors").as[List[JsValue]] - errorList.size mustEqual 1 - - val jsonError = errorList.head - (jsonError \ "type").as[String] mustEqual "header-validation-error" - (jsonError \ "header").as[String] mustEqual AUTHORIZATION - (jsonError \ "message").as[String].nonEmpty mustEqual true - } - - "return OK when the request is authenticated" in { - val request = FakeRequest().withHeaders(AUTHORIZATION -> "user") - val result = controller.getModel(0, "").apply(request) - - status(result) mustEqual OK - } - } -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/FakeEmailService.scala b/alerts-server/test/com/alexitc/coinalerts/commons/FakeEmailService.scala index dc98abf..2afbd79 100644 --- a/alerts-server/test/com/alexitc/coinalerts/commons/FakeEmailService.scala +++ b/alerts-server/test/com/alexitc/coinalerts/commons/FakeEmailService.scala @@ -2,6 +2,7 @@ package com.alexitc.coinalerts.commons import com.alexitc.coinalerts.models.UserEmail import com.alexitc.coinalerts.services.{EmailServiceTrait, EmailSubject, EmailText} +import com.alexitc.playsonify.core.FutureApplicationResult import org.scalactic.Good import org.slf4j.LoggerFactory diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/FakeReCaptchaService.scala b/alerts-server/test/com/alexitc/coinalerts/commons/FakeReCaptchaService.scala index cfac6df..7e8e54b 100644 --- a/alerts-server/test/com/alexitc/coinalerts/commons/FakeReCaptchaService.scala +++ b/alerts-server/test/com/alexitc/coinalerts/commons/FakeReCaptchaService.scala @@ -2,6 +2,7 @@ package com.alexitc.coinalerts.commons import com.alexitc.coinalerts.models.ReCaptchaResponse import com.alexitc.coinalerts.services.external.ReCaptchaService +import com.alexitc.playsonify.core.FutureApplicationResult import org.scalactic.Good import scala.concurrent.Future diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/AuthenticatedNoInputController.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/AuthenticatedNoInputController.scala deleted file mode 100644 index 7ee3016..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/AuthenticatedNoInputController.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import javax.inject.Inject - -import org.scalactic.Good - -import scala.concurrent.Future - -class AuthenticatedNoInputController @Inject() (cc: CustomControllerComponents) extends CustomJsonController(cc) { - - def getModel(int: Int, string: String) = authenticatedNoInput { context => - val result = CustomModel(int, string) - Future.successful(Good(result)) - } -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomAuthenticator.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomAuthenticator.scala deleted file mode 100644 index 16a20f0..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomAuthenticator.scala +++ /dev/null @@ -1,23 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import com.alexitc.coinalerts.commons.examples.CustomErrorMapper.FailedAuthError -import com.alexitc.coinalerts.commons.{AbstractAuthenticatorService, FutureApplicationResult} -import org.scalactic.{One, Or} -import play.api.libs.json.JsValue -import play.api.mvc.Request -import play.api.test.Helpers.AUTHORIZATION - -import scala.concurrent.Future - -class CustomAuthenticator extends AbstractAuthenticatorService[CustomUser] { - - override def authenticate(request: Request[JsValue]): FutureApplicationResult[CustomUser] = { - val header = request - .headers - .get(AUTHORIZATION) - .map(CustomUser.apply) - - val result = Or.from(header, One(FailedAuthError)) - Future.successful(result) - } -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomControllerComponents.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomControllerComponents.scala deleted file mode 100644 index 42a5626..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomControllerComponents.scala +++ /dev/null @@ -1,16 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import javax.inject.Inject - -import com.alexitc.coinalerts.commons.{JsonControllerComponents, PublicErrorRenderer} -import play.api.mvc.MessagesControllerComponents - -import scala.concurrent.ExecutionContext - -class CustomControllerComponents @Inject()( - override val messagesControllerComponents: MessagesControllerComponents, - override val executionContext: ExecutionContext, - override val publicErrorRenderer: PublicErrorRenderer, - override val applicationErrorMapper: CustomErrorMapper, - override val authenticatorService: CustomAuthenticator) - extends JsonControllerComponents[CustomUser] diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomErrorMapper.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomErrorMapper.scala deleted file mode 100644 index e66500f..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomErrorMapper.scala +++ /dev/null @@ -1,35 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import com.alexitc.coinalerts.commons._ -import play.api.i18n.Lang - -class CustomErrorMapper extends ApplicationErrorMapper { - import CustomErrorMapper._ - override def toPublicErrorList(applicationError: ApplicationError)(implicit lang: Lang): Seq[PublicError] = applicationError match { - case JsonFieldValidationError(path, errors) => - val field = path.path.map(_.toJsonString.replace(".", "")).mkString(".") - errors.map { messageKey => - val message = messageKey.string - FieldValidationError(field, message) - } - - case InputError => - val publicError = FieldValidationError("field", "just an error") - List(publicError) - - case DuplicateError => - val publicError = FieldValidationError("anotherField", "just another error") - List(publicError) - - case FailedAuthError => - val publicError = HeaderValidationError("Authorization", "Invalid auth") - List(publicError) - } -} - -object CustomErrorMapper { - sealed trait CustomError - case object InputError extends CustomError with InputValidationError - case object DuplicateError extends CustomError with ConflictError - case object FailedAuthError extends CustomError with AuthenticationError -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomJsonController.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomJsonController.scala deleted file mode 100644 index 4f63775..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomJsonController.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import com.alexitc.coinalerts.commons.{AbstractJsonController, ErrorId, ServerError} -import org.slf4j.LoggerFactory - -class CustomJsonController (components: CustomControllerComponents) extends AbstractJsonController(components) { - - protected val logger = LoggerFactory.getLogger(this.getClass) - - override protected def onServerError(error: ServerError, errorId: ErrorId): Unit = { - logger.error(s"Unexpected internal error = ${errorId.string}", error.cause) - } -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomModel.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomModel.scala deleted file mode 100644 index e6764f0..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomModel.scala +++ /dev/null @@ -1,9 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import play.api.libs.json.{Format, Json} - -case class CustomModel(int: Int, string: String) - -object CustomModel { - implicit val format: Format[CustomModel] = Json.format[CustomModel] -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomUser.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomUser.scala deleted file mode 100644 index e496870..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/CustomUser.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -case class CustomUser(id: String) diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicNoInputController.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicNoInputController.scala deleted file mode 100644 index dcd1a37..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicNoInputController.scala +++ /dev/null @@ -1,31 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import javax.inject.Inject - -import com.alexitc.coinalerts.commons._ -import com.alexitc.coinalerts.models.User -import org.scalactic.{Bad, Good, Many} - -import scala.concurrent.Future - -class PublicNoInputController @Inject() (cc: CustomControllerComponents) extends CustomJsonController(cc) { - - def getModel(int: Int, string: String) = publicNoInput { context => - val result = CustomModel(int, string) - Future.successful(Good(result)) - } - - def getCustomStatus() = publicNoInput(Created) { context => - val result = CustomModel(0, "no") - Future.successful(Good(result)) - } - - def getErrors() = publicNoInput[User] { context: PublicRequestContext => - val result = Bad(Many(CustomErrorMapper.InputError, CustomErrorMapper.DuplicateError)) - Future.successful(result) - } - - def getException(exception: Exception) = publicNoInput[User] { context: PublicRequestContext => - Future.failed(exception) - } -} diff --git a/alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicWithInputController.scala b/alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicWithInputController.scala deleted file mode 100644 index 05747d2..0000000 --- a/alerts-server/test/com/alexitc/coinalerts/commons/examples/PublicWithInputController.scala +++ /dev/null @@ -1,27 +0,0 @@ -package com.alexitc.coinalerts.commons.examples - -import javax.inject.Inject - -import com.alexitc.coinalerts.commons.PublicRequestContextWithModel -import org.scalactic.{Bad, Good, Many} - -import scala.concurrent.Future - -class PublicWithInputController @Inject() (cc: CustomControllerComponents) extends CustomJsonController(cc) { - def getModel() = publicWithInput { context: PublicRequestContextWithModel[CustomModel] => - Future.successful(Good(context.model)) - } - - def getCustomStatus() = publicWithInput(Created) { context: PublicRequestContextWithModel[CustomModel] => - Future.successful(Good(context.model)) - } - - def getErrors() = publicWithInput[CustomModel, CustomModel] { context: PublicRequestContextWithModel[CustomModel] => - val result = Bad(Many(CustomErrorMapper.InputError, CustomErrorMapper.DuplicateError)) - Future.successful(result) - } - - def getException(exception: Exception) = publicWithInput[CustomModel, CustomModel] { context: PublicRequestContextWithModel[CustomModel] => - Future.failed(exception) - } -} diff --git a/alerts-server/test/com/alexitc/coinalerts/data/DailyPriceAlertInMemoryDataHandler.scala b/alerts-server/test/com/alexitc/coinalerts/data/DailyPriceAlertInMemoryDataHandler.scala index a32b81b..d121289 100644 --- a/alerts-server/test/com/alexitc/coinalerts/data/DailyPriceAlertInMemoryDataHandler.scala +++ b/alerts-server/test/com/alexitc/coinalerts/data/DailyPriceAlertInMemoryDataHandler.scala @@ -1,10 +1,11 @@ package com.alexitc.coinalerts.data import java.time.OffsetDateTime -import com.alexitc.coinalerts.commons.{ApplicationResult, RandomDataGenerator} +import com.alexitc.coinalerts.commons.RandomDataGenerator import com.alexitc.coinalerts.core.{Count, PaginatedQuery, PaginatedResult} import com.alexitc.coinalerts.errors.RepeatedDailyPriceAlertError import com.alexitc.coinalerts.models.{CreateDailyPriceAlertModel, DailyPriceAlert, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good} import scala.collection.mutable diff --git a/alerts-server/test/com/alexitc/coinalerts/data/ExchangeCurrencyInMemoryDataHandler.scala b/alerts-server/test/com/alexitc/coinalerts/data/ExchangeCurrencyInMemoryDataHandler.scala index 34c2306..8a3420e 100644 --- a/alerts-server/test/com/alexitc/coinalerts/data/ExchangeCurrencyInMemoryDataHandler.scala +++ b/alerts-server/test/com/alexitc/coinalerts/data/ExchangeCurrencyInMemoryDataHandler.scala @@ -1,7 +1,7 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.errors.RepeatedExchangeCurrencyError import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good} import scala.collection.mutable diff --git a/alerts-server/test/com/alexitc/coinalerts/data/FixedPriceAlertInMemoryDataHandler.scala b/alerts-server/test/com/alexitc/coinalerts/data/FixedPriceAlertInMemoryDataHandler.scala index 7ff8c0f..c9eac11 100644 --- a/alerts-server/test/com/alexitc/coinalerts/data/FixedPriceAlertInMemoryDataHandler.scala +++ b/alerts-server/test/com/alexitc/coinalerts/data/FixedPriceAlertInMemoryDataHandler.scala @@ -2,10 +2,11 @@ package com.alexitc.coinalerts.data import java.time.OffsetDateTime -import com.alexitc.coinalerts.commons.{ApplicationResult, RandomDataGenerator} +import com.alexitc.coinalerts.commons.RandomDataGenerator import com.alexitc.coinalerts.core.{Count, PaginatedQuery, PaginatedResult} import com.alexitc.coinalerts.errors.{FixedPriceAlertNotFoundError, UnknownExchangeCurrencyIdError} import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good, One, Or} import scala.collection.mutable diff --git a/alerts-server/test/com/alexitc/coinalerts/data/NewCurrencyAlertInMemoryDataHandler.scala b/alerts-server/test/com/alexitc/coinalerts/data/NewCurrencyAlertInMemoryDataHandler.scala index cf373a1..5c10356 100644 --- a/alerts-server/test/com/alexitc/coinalerts/data/NewCurrencyAlertInMemoryDataHandler.scala +++ b/alerts-server/test/com/alexitc/coinalerts/data/NewCurrencyAlertInMemoryDataHandler.scala @@ -1,8 +1,8 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.errors.{NewCurrencyAlertNotFoundError, RepeatedExchangeError} import com.alexitc.coinalerts.models.{Exchange, NewCurrencyAlert, NewCurrencyAlertId, UserId} +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good} class NewCurrencyAlertInMemoryDataHandler extends NewCurrencyAlertBlockingDataHandler { diff --git a/alerts-server/test/com/alexitc/coinalerts/data/UserInMemoryDataHandler.scala b/alerts-server/test/com/alexitc/coinalerts/data/UserInMemoryDataHandler.scala index 6dc1b73..e112a00 100644 --- a/alerts-server/test/com/alexitc/coinalerts/data/UserInMemoryDataHandler.scala +++ b/alerts-server/test/com/alexitc/coinalerts/data/UserInMemoryDataHandler.scala @@ -1,8 +1,8 @@ package com.alexitc.coinalerts.data -import com.alexitc.coinalerts.commons.ApplicationResult import com.alexitc.coinalerts.errors.{EmailAlreadyExistsError, UserVerificationTokenNotFoundError, VerifiedUserNotFound} import com.alexitc.coinalerts.models._ +import com.alexitc.playsonify.core.ApplicationResult import org.scalactic.{Bad, Good, One, Or} import scala.collection.mutable