From b4442b3d98311cf113c21a1c61c8bfa10186b344 Mon Sep 17 00:00:00 2001 From: Alexis Hernandez Date: Sun, 29 Apr 2018 15:12:55 -0500 Subject: [PATCH] server: Update playsonify to 1.2.0 --- .../explorer/data/BalanceDataHandler.scala | 2 +- .../anorm/BalancePostgresDataHandler.scala | 2 +- .../data/anorm/dao/BalancePostgresDAO.scala | 2 +- .../FieldOrderingSQLInterpreter.scala | 2 +- .../data/async/BalanceFutureDataHandler.scala | 6 +- .../errors/paginatedQueryErrors.scala | 22 ------- .../app/com/xsn/explorer/models/Address.scala | 2 +- .../com/xsn/explorer/models/Blockhash.scala | 2 +- .../xsn/explorer/models/Confirmations.scala | 2 +- .../app/com/xsn/explorer/models/Height.scala | 2 +- server/app/com/xsn/explorer/models/Size.scala | 2 +- .../xsn/explorer/models/TransactionId.scala | 2 +- .../com/xsn/explorer/models/base/Count.scala | 10 --- .../explorer/models/base/FieldOrdering.scala | 3 - .../com/xsn/explorer/models/base/Limit.scala | 10 --- .../com/xsn/explorer/models/base/Offset.scala | 10 --- .../models/base/OrderingCondition.scala | 9 --- .../explorer/models/base/OrderingQuery.scala | 3 - .../explorer/models/base/PaginatedQuery.scala | 3 - .../models/base/PaginatedResult.scala | 15 ----- .../xsn/explorer/models/base/WrappedInt.scala | 14 ---- .../explorer/models/base/WrappedString.scala | 16 ----- .../parsers/BalanceOrderingParser.scala | 3 +- .../parsers/FieldOrderingParser.scala | 64 ------------------- .../parsers/MasternodeOrderingParser.scala | 3 +- .../processors/BlockEventsProcessor.scala | 3 +- .../explorer/services/BalanceService.scala | 10 +-- .../explorer/services/MasternodeService.scala | 10 +-- .../services/TransactionService.scala | 3 +- .../validators/PaginatedQueryValidator.scala | 37 ----------- .../tasks/BackwardsSynchronizerTask.scala | 3 +- .../tasks/FirstBlockSynchronizerTask.scala | 3 +- .../com/xsn/explorer/util/Extensions.scala | 27 -------- .../app/controllers/BalancesController.scala | 2 +- .../controllers/MasternodesController.scala | 2 +- server/build.sbt | 2 +- .../data/BalancePostgresDataHandlerSpec.scala | 2 +- .../processors/BlockEventsProcessorSpec.scala | 11 +--- .../controllers/BalancesControllerSpec.scala | 2 +- 39 files changed, 39 insertions(+), 289 deletions(-) delete mode 100644 server/app/com/xsn/explorer/errors/paginatedQueryErrors.scala delete mode 100644 server/app/com/xsn/explorer/models/base/Count.scala delete mode 100644 server/app/com/xsn/explorer/models/base/FieldOrdering.scala delete mode 100644 server/app/com/xsn/explorer/models/base/Limit.scala delete mode 100644 server/app/com/xsn/explorer/models/base/Offset.scala delete mode 100644 server/app/com/xsn/explorer/models/base/OrderingCondition.scala delete mode 100644 server/app/com/xsn/explorer/models/base/OrderingQuery.scala delete mode 100644 server/app/com/xsn/explorer/models/base/PaginatedQuery.scala delete mode 100644 server/app/com/xsn/explorer/models/base/PaginatedResult.scala delete mode 100644 server/app/com/xsn/explorer/models/base/WrappedInt.scala delete mode 100644 server/app/com/xsn/explorer/models/base/WrappedString.scala delete mode 100644 server/app/com/xsn/explorer/parsers/FieldOrderingParser.scala delete mode 100644 server/app/com/xsn/explorer/services/validators/PaginatedQueryValidator.scala diff --git a/server/app/com/xsn/explorer/data/BalanceDataHandler.scala b/server/app/com/xsn/explorer/data/BalanceDataHandler.scala index 22a62e9..e3ed50f 100644 --- a/server/app/com/xsn/explorer/data/BalanceDataHandler.scala +++ b/server/app/com/xsn/explorer/data/BalanceDataHandler.scala @@ -1,8 +1,8 @@ package com.xsn.explorer.data import com.alexitc.playsonify.core.ApplicationResult +import com.alexitc.playsonify.models.{FieldOrdering, PaginatedQuery, PaginatedResult} import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base.{FieldOrdering, PaginatedQuery, PaginatedResult} import com.xsn.explorer.models.fields.BalanceField import scala.language.higherKinds diff --git a/server/app/com/xsn/explorer/data/anorm/BalancePostgresDataHandler.scala b/server/app/com/xsn/explorer/data/anorm/BalancePostgresDataHandler.scala index c9aa873..c343582 100644 --- a/server/app/com/xsn/explorer/data/anorm/BalancePostgresDataHandler.scala +++ b/server/app/com/xsn/explorer/data/anorm/BalancePostgresDataHandler.scala @@ -3,11 +3,11 @@ package com.xsn.explorer.data.anorm import javax.inject.Inject import com.alexitc.playsonify.core.ApplicationResult +import com.alexitc.playsonify.models.{FieldOrdering, PaginatedQuery, PaginatedResult} import com.xsn.explorer.data.BalanceBlockingDataHandler import com.xsn.explorer.data.anorm.dao.BalancePostgresDAO import com.xsn.explorer.errors.BalanceUnknownError import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base.{FieldOrdering, PaginatedQuery, PaginatedResult} import com.xsn.explorer.models.fields.BalanceField import org.scalactic.{Good, One, Or} import play.api.db.Database diff --git a/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala b/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala index 47bcbf2..ea99bb6 100644 --- a/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala +++ b/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala @@ -4,10 +4,10 @@ import java.sql.Connection import javax.inject.Inject import anorm._ +import com.alexitc.playsonify.models.{Count, FieldOrdering, PaginatedQuery} import com.xsn.explorer.data.anorm.interpreters.FieldOrderingSQLInterpreter import com.xsn.explorer.data.anorm.parsers.BalanceParsers._ import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base.{Count, FieldOrdering, PaginatedQuery} import com.xsn.explorer.models.fields.BalanceField class BalancePostgresDAO @Inject() (fieldOrderingSQLInterpreter: FieldOrderingSQLInterpreter) { diff --git a/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala b/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala index a5df63a..c25b15e 100644 --- a/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala +++ b/server/app/com/xsn/explorer/data/anorm/interpreters/FieldOrderingSQLInterpreter.scala @@ -1,6 +1,6 @@ package com.xsn.explorer.data.anorm.interpreters -import com.xsn.explorer.models.base.{FieldOrdering, OrderingCondition} +import com.alexitc.playsonify.models.{FieldOrdering, OrderingCondition} class FieldOrderingSQLInterpreter { diff --git a/server/app/com/xsn/explorer/data/async/BalanceFutureDataHandler.scala b/server/app/com/xsn/explorer/data/async/BalanceFutureDataHandler.scala index 1da1bf7..f15ae5e 100644 --- a/server/app/com/xsn/explorer/data/async/BalanceFutureDataHandler.scala +++ b/server/app/com/xsn/explorer/data/async/BalanceFutureDataHandler.scala @@ -2,11 +2,11 @@ package com.xsn.explorer.data.async import javax.inject.Inject -import com.alexitc.playsonify.core.FutureApplicationResult +import com.alexitc.playsonify.core.{FutureApplicationResult, FuturePaginatedResult} +import com.alexitc.playsonify.models.{FieldOrdering, PaginatedQuery} import com.xsn.explorer.data.{BalanceBlockingDataHandler, BalanceDataHandler} import com.xsn.explorer.executors.DatabaseExecutionContext import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base.{FieldOrdering, PaginatedQuery, PaginatedResult} import com.xsn.explorer.models.fields.BalanceField import scala.concurrent.Future @@ -20,7 +20,7 @@ class BalanceFutureDataHandler @Inject() ( blockingDataHandler.upsert(balance) } - override def get(query: PaginatedQuery, ordering: FieldOrdering[BalanceField]): FutureApplicationResult[PaginatedResult[Balance]] = Future { + override def get(query: PaginatedQuery, ordering: FieldOrdering[BalanceField]): FuturePaginatedResult[Balance] = Future { blockingDataHandler.get(query, ordering) } } diff --git a/server/app/com/xsn/explorer/errors/paginatedQueryErrors.scala b/server/app/com/xsn/explorer/errors/paginatedQueryErrors.scala deleted file mode 100644 index 28b19d9..0000000 --- a/server/app/com/xsn/explorer/errors/paginatedQueryErrors.scala +++ /dev/null @@ -1,22 +0,0 @@ -package com.xsn.explorer.errors - -import com.alexitc.playsonify.models.{FieldValidationError, InputValidationError, PublicError} -import play.api.i18n.{Lang, MessagesApi} - -sealed trait PaginatedQueryError - -case object PaginatedQueryOffsetError extends PaginatedQueryError with InputValidationError { - override def toPublicErrorList(messagesApi: MessagesApi)(implicit lang: Lang): List[PublicError] = { - val message = messagesApi("error.paginatedQuery.offset.invalid") - val error = FieldValidationError("offset", message) - List(error) - } -} - -case class PaginatedQueryLimitError(maxValue: Int) extends PaginatedQueryError with InputValidationError { - override def toPublicErrorList(messagesApi: MessagesApi)(implicit lang: Lang): List[PublicError] = { - val message = messagesApi("error.paginatedQuery.limit.invalid", maxValue) - val error = FieldValidationError("limit", message) - List(error) - } -} diff --git a/server/app/com/xsn/explorer/models/Address.scala b/server/app/com/xsn/explorer/models/Address.scala index 3bee4eb..f44c998 100644 --- a/server/app/com/xsn/explorer/models/Address.scala +++ b/server/app/com/xsn/explorer/models/Address.scala @@ -2,7 +2,7 @@ package com.xsn.explorer.models import javax.xml.bind.DatatypeConverter -import com.xsn.explorer.models.base.WrappedString +import com.alexitc.playsonify.models.WrappedString import play.api.libs.json._ import scala.util.Try diff --git a/server/app/com/xsn/explorer/models/Blockhash.scala b/server/app/com/xsn/explorer/models/Blockhash.scala index afa1618..1b8755a 100644 --- a/server/app/com/xsn/explorer/models/Blockhash.scala +++ b/server/app/com/xsn/explorer/models/Blockhash.scala @@ -1,6 +1,6 @@ package com.xsn.explorer.models -import com.xsn.explorer.models.base.WrappedString +import com.alexitc.playsonify.models.WrappedString import play.api.libs.json._ class Blockhash private (val string: String) extends AnyVal with WrappedString diff --git a/server/app/com/xsn/explorer/models/Confirmations.scala b/server/app/com/xsn/explorer/models/Confirmations.scala index d56b281..84d750e 100644 --- a/server/app/com/xsn/explorer/models/Confirmations.scala +++ b/server/app/com/xsn/explorer/models/Confirmations.scala @@ -1,6 +1,6 @@ package com.xsn.explorer.models -import com.xsn.explorer.models.base.WrappedInt +import com.alexitc.playsonify.models.WrappedInt import play.api.libs.json.{JsPath, Reads} case class Confirmations(int: Int) extends AnyVal with WrappedInt diff --git a/server/app/com/xsn/explorer/models/Height.scala b/server/app/com/xsn/explorer/models/Height.scala index 64e06b0..602ac8b 100644 --- a/server/app/com/xsn/explorer/models/Height.scala +++ b/server/app/com/xsn/explorer/models/Height.scala @@ -1,6 +1,6 @@ package com.xsn.explorer.models -import com.xsn.explorer.models.base.WrappedInt +import com.alexitc.playsonify.models.WrappedInt import play.api.libs.json.{JsPath, Reads} case class Height(int: Int) extends AnyVal with WrappedInt diff --git a/server/app/com/xsn/explorer/models/Size.scala b/server/app/com/xsn/explorer/models/Size.scala index bd208fc..c2cb817 100644 --- a/server/app/com/xsn/explorer/models/Size.scala +++ b/server/app/com/xsn/explorer/models/Size.scala @@ -1,6 +1,6 @@ package com.xsn.explorer.models -import com.xsn.explorer.models.base.WrappedInt +import com.alexitc.playsonify.models.WrappedInt import play.api.libs.json.{JsPath, Reads} case class Size(int: Int) extends AnyVal with WrappedInt diff --git a/server/app/com/xsn/explorer/models/TransactionId.scala b/server/app/com/xsn/explorer/models/TransactionId.scala index dda90f9..7a9c2f0 100644 --- a/server/app/com/xsn/explorer/models/TransactionId.scala +++ b/server/app/com/xsn/explorer/models/TransactionId.scala @@ -1,6 +1,6 @@ package com.xsn.explorer.models -import com.xsn.explorer.models.base.WrappedString +import com.alexitc.playsonify.models.WrappedString import play.api.libs.json._ class TransactionId private (val string: String) extends AnyVal with WrappedString diff --git a/server/app/com/xsn/explorer/models/base/Count.scala b/server/app/com/xsn/explorer/models/base/Count.scala deleted file mode 100644 index 06a3819..0000000 --- a/server/app/com/xsn/explorer/models/base/Count.scala +++ /dev/null @@ -1,10 +0,0 @@ -package com.xsn.explorer.models.base - -import play.api.libs.json.{JsNumber, Writes} - -case class Count(int: Int) extends AnyVal - -object Count { - - implicit val writes: Writes[Count] = Writes[Count] { count => JsNumber(count.int) } -} diff --git a/server/app/com/xsn/explorer/models/base/FieldOrdering.scala b/server/app/com/xsn/explorer/models/base/FieldOrdering.scala deleted file mode 100644 index cd898f2..0000000 --- a/server/app/com/xsn/explorer/models/base/FieldOrdering.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.xsn.explorer.models.base - -case class FieldOrdering[+A](field: A, orderingCondition: OrderingCondition) diff --git a/server/app/com/xsn/explorer/models/base/Limit.scala b/server/app/com/xsn/explorer/models/base/Limit.scala deleted file mode 100644 index 622d5b3..0000000 --- a/server/app/com/xsn/explorer/models/base/Limit.scala +++ /dev/null @@ -1,10 +0,0 @@ -package com.xsn.explorer.models.base - -import play.api.libs.json.{JsNumber, Writes} - -case class Limit(int: Int) extends AnyVal - -object Limit { - - implicit val writes: Writes[Limit] = Writes[Limit] { limit => JsNumber(limit.int) } -} diff --git a/server/app/com/xsn/explorer/models/base/Offset.scala b/server/app/com/xsn/explorer/models/base/Offset.scala deleted file mode 100644 index bc35f74..0000000 --- a/server/app/com/xsn/explorer/models/base/Offset.scala +++ /dev/null @@ -1,10 +0,0 @@ -package com.xsn.explorer.models.base - -import play.api.libs.json.{JsNumber, Writes} - -case class Offset(int: Int) extends AnyVal - -object Offset { - - implicit val writes: Writes[Offset] = Writes[Offset] { offset => JsNumber(offset.int) } -} diff --git a/server/app/com/xsn/explorer/models/base/OrderingCondition.scala b/server/app/com/xsn/explorer/models/base/OrderingCondition.scala deleted file mode 100644 index 6342310..0000000 --- a/server/app/com/xsn/explorer/models/base/OrderingCondition.scala +++ /dev/null @@ -1,9 +0,0 @@ -package com.xsn.explorer.models.base - -sealed trait OrderingCondition - -object OrderingCondition { - - case object AscendingOrder extends OrderingCondition - case object DescendingOrder extends OrderingCondition -} diff --git a/server/app/com/xsn/explorer/models/base/OrderingQuery.scala b/server/app/com/xsn/explorer/models/base/OrderingQuery.scala deleted file mode 100644 index 5dfd18c..0000000 --- a/server/app/com/xsn/explorer/models/base/OrderingQuery.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.xsn.explorer.models.base - -case class OrderingQuery(string: String) extends AnyVal diff --git a/server/app/com/xsn/explorer/models/base/PaginatedQuery.scala b/server/app/com/xsn/explorer/models/base/PaginatedQuery.scala deleted file mode 100644 index 0ecbd17..0000000 --- a/server/app/com/xsn/explorer/models/base/PaginatedQuery.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.xsn.explorer.models.base - -case class PaginatedQuery(offset: Offset, limit: Limit) diff --git a/server/app/com/xsn/explorer/models/base/PaginatedResult.scala b/server/app/com/xsn/explorer/models/base/PaginatedResult.scala deleted file mode 100644 index 2a1f49d..0000000 --- a/server/app/com/xsn/explorer/models/base/PaginatedResult.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.xsn.explorer.models.base - -import play.api.libs.json.{Json, OWrites, Writes} - -case class PaginatedResult[T](offset: Offset, limit: Limit, total: Count, data: List[T]) -object PaginatedResult { - implicit def writes[T](implicit writesT: Writes[T]): Writes[PaginatedResult[T]] = OWrites[PaginatedResult[T]] { result => - Json.obj( - "offset" -> result.offset, - "limit" -> result.limit, - "total" -> result.total, - "data" -> result.data - ) - } -} diff --git a/server/app/com/xsn/explorer/models/base/WrappedInt.scala b/server/app/com/xsn/explorer/models/base/WrappedInt.scala deleted file mode 100644 index 7719845..0000000 --- a/server/app/com/xsn/explorer/models/base/WrappedInt.scala +++ /dev/null @@ -1,14 +0,0 @@ -package com.xsn.explorer.models.base - -import play.api.libs.json.{JsNumber, Writes} - -trait WrappedInt extends Any { - def int: Int -} - -object WrappedInt { - - implicit val writes: Writes[WrappedInt] = { - Writes[WrappedInt] { wrapped => JsNumber(wrapped.int) } - } -} diff --git a/server/app/com/xsn/explorer/models/base/WrappedString.scala b/server/app/com/xsn/explorer/models/base/WrappedString.scala deleted file mode 100644 index 0540f9b..0000000 --- a/server/app/com/xsn/explorer/models/base/WrappedString.scala +++ /dev/null @@ -1,16 +0,0 @@ -package com.xsn.explorer.models.base - -import play.api.libs.json.{JsString, Writes} - -trait WrappedString extends Any { - def string: String - - override def toString: String = string -} - -object WrappedString { - - implicit val writes: Writes[WrappedString] = { - Writes[WrappedString] { wrapped => JsString(wrapped.string) } - } -} diff --git a/server/app/com/xsn/explorer/parsers/BalanceOrderingParser.scala b/server/app/com/xsn/explorer/parsers/BalanceOrderingParser.scala index 0128478..1c7c0d5 100644 --- a/server/app/com/xsn/explorer/parsers/BalanceOrderingParser.scala +++ b/server/app/com/xsn/explorer/parsers/BalanceOrderingParser.scala @@ -1,6 +1,7 @@ package com.xsn.explorer.parsers -import com.xsn.explorer.models.base.OrderingCondition +import com.alexitc.playsonify.models.OrderingCondition +import com.alexitc.playsonify.parsers.FieldOrderingParser import com.xsn.explorer.models.fields.BalanceField class BalanceOrderingParser extends FieldOrderingParser[BalanceField] { diff --git a/server/app/com/xsn/explorer/parsers/FieldOrderingParser.scala b/server/app/com/xsn/explorer/parsers/FieldOrderingParser.scala deleted file mode 100644 index 2c7af2a..0000000 --- a/server/app/com/xsn/explorer/parsers/FieldOrderingParser.scala +++ /dev/null @@ -1,64 +0,0 @@ -package com.xsn.explorer.parsers - -import com.alexitc.playsonify.core.{ApplicationErrors, ApplicationResult} -import com.xsn.explorer.errors.{InvalidOrderingConditionError, InvalidOrderingError, UnknownOrderingFieldError} -import com.xsn.explorer.models.base.{FieldOrdering, OrderingCondition, OrderingQuery} -import org.scalactic._ - -trait FieldOrderingParser[+A] { - - protected def parseField(unsafeField: String): Option[A] - - protected def defaultField: A - - protected def defaultOrderingCondition: OrderingCondition = OrderingCondition.AscendingOrder - - /** - * Accepts values in the format field[:condition], being condition - * an optional argument allowing the these values: - * - asc: for ascending order. - * - desc: for descending order. - * - * The empty string is also accepted returning a default ordering. - */ - def from(orderByQuery: OrderingQuery): ApplicationResult[FieldOrdering[A]] = { - Option(orderByQuery.string) - .filter(_.nonEmpty) - .map { string => from(string.split(":")) } - .getOrElse { - val ordering = FieldOrdering(defaultField, defaultOrderingCondition) - Good(ordering) - } - } - - private def from(parts: Seq[String]): FieldOrdering[A] Or ApplicationErrors = parts match { - case Seq(unsafeField) => - for { - field <- getFieldResult(unsafeField) - } yield FieldOrdering(field, defaultOrderingCondition) - - case Seq(unsafeField, unsafeOrderingCondition) => - Accumulation.withGood( - getFieldResult(unsafeField), - getOrderingConditionResult(unsafeOrderingCondition)) { FieldOrdering.apply } - - case _ => - Bad(InvalidOrderingError).accumulating - } - - private def getFieldResult(unsafeField: String) = { - val maybe = parseField(unsafeField) - Or.from(maybe, One(UnknownOrderingFieldError)) - } - - private def getOrderingConditionResult(unsafeOrderingCondition: String) = { - val maybe = parseOrderingCondition(unsafeOrderingCondition) - Or.from(maybe, One(InvalidOrderingConditionError)) - } - - protected def parseOrderingCondition(unsafeOrderingCondition: String): Option[OrderingCondition] = unsafeOrderingCondition match { - case "asc" => Some(OrderingCondition.AscendingOrder) - case "desc" => Some(OrderingCondition.DescendingOrder) - case _ => None - } -} diff --git a/server/app/com/xsn/explorer/parsers/MasternodeOrderingParser.scala b/server/app/com/xsn/explorer/parsers/MasternodeOrderingParser.scala index 03e2edf..686c98a 100644 --- a/server/app/com/xsn/explorer/parsers/MasternodeOrderingParser.scala +++ b/server/app/com/xsn/explorer/parsers/MasternodeOrderingParser.scala @@ -1,6 +1,7 @@ package com.xsn.explorer.parsers -import com.xsn.explorer.models.base.OrderingCondition +import com.alexitc.playsonify.models.OrderingCondition +import com.alexitc.playsonify.parsers.FieldOrderingParser import com.xsn.explorer.models.fields.MasternodeField class MasternodeOrderingParser extends FieldOrderingParser[MasternodeField] { diff --git a/server/app/com/xsn/explorer/processors/BlockEventsProcessor.scala b/server/app/com/xsn/explorer/processors/BlockEventsProcessor.scala index a9ac460..bd6c436 100644 --- a/server/app/com/xsn/explorer/processors/BlockEventsProcessor.scala +++ b/server/app/com/xsn/explorer/processors/BlockEventsProcessor.scala @@ -3,14 +3,13 @@ package com.xsn.explorer.processors import javax.inject.Inject import com.alexitc.playsonify.core.FutureApplicationResult -import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureListOps, FutureOps} import com.xsn.explorer.data.DatabaseSeeder import com.xsn.explorer.data.async.{BlockFutureDataHandler, DatabaseFutureSeeder} import com.xsn.explorer.errors.BlockNotFoundError import com.xsn.explorer.models.rpc.Block import com.xsn.explorer.models.{Blockhash, Transaction} import com.xsn.explorer.services.{TransactionService, XSNService} -import com.xsn.explorer.util.Extensions.FutureApplicationResultExt import org.scalactic.{Bad, Good, One} import org.slf4j.LoggerFactory diff --git a/server/app/com/xsn/explorer/services/BalanceService.scala b/server/app/com/xsn/explorer/services/BalanceService.scala index c6bd5bc..90d0f46 100644 --- a/server/app/com/xsn/explorer/services/BalanceService.scala +++ b/server/app/com/xsn/explorer/services/BalanceService.scala @@ -2,13 +2,13 @@ package com.xsn.explorer.services import javax.inject.Inject -import com.alexitc.playsonify.core.FutureApplicationResult import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} +import com.alexitc.playsonify.core.FuturePaginatedResult +import com.alexitc.playsonify.models.{OrderingQuery, PaginatedQuery} +import com.alexitc.playsonify.validators.PaginatedQueryValidator import com.xsn.explorer.data.async.BalanceFutureDataHandler import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base.{OrderingQuery, PaginatedQuery, PaginatedResult} import com.xsn.explorer.parsers.BalanceOrderingParser -import com.xsn.explorer.services.validators.PaginatedQueryValidator import scala.concurrent.ExecutionContext @@ -18,9 +18,9 @@ class BalanceService @Inject() ( balanceFutureDataHandler: BalanceFutureDataHandler)( implicit ec: ExecutionContext) { - def get(paginatedQuery: PaginatedQuery, orderingQuery: OrderingQuery): FutureApplicationResult[PaginatedResult[Balance]] = { + def get(paginatedQuery: PaginatedQuery, orderingQuery: OrderingQuery): FuturePaginatedResult[Balance] = { val result = for { - validatedQuery <- paginatedQueryValidator.validate(paginatedQuery).toFutureOr + validatedQuery <- paginatedQueryValidator.validate(paginatedQuery, 100).toFutureOr ordering <- balanceOrderingParser.from(orderingQuery).toFutureOr balances <- balanceFutureDataHandler.get(validatedQuery, ordering).toFutureOr } yield balances diff --git a/server/app/com/xsn/explorer/services/MasternodeService.scala b/server/app/com/xsn/explorer/services/MasternodeService.scala index 8e62cfc..92ba467 100644 --- a/server/app/com/xsn/explorer/services/MasternodeService.scala +++ b/server/app/com/xsn/explorer/services/MasternodeService.scala @@ -2,13 +2,13 @@ package com.xsn.explorer.services import javax.inject.Inject -import com.alexitc.playsonify.core.FutureApplicationResult import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} -import com.xsn.explorer.models.base._ +import com.alexitc.playsonify.core.FuturePaginatedResult +import com.alexitc.playsonify.models._ +import com.alexitc.playsonify.validators.PaginatedQueryValidator import com.xsn.explorer.models.fields.MasternodeField import com.xsn.explorer.models.rpc.Masternode import com.xsn.explorer.parsers.MasternodeOrderingParser -import com.xsn.explorer.services.validators.PaginatedQueryValidator import scala.concurrent.ExecutionContext @@ -18,9 +18,9 @@ class MasternodeService @Inject() ( xsnService: XSNService)( implicit ec: ExecutionContext) { - def getMasternodes(paginatedQuery: PaginatedQuery, orderingQuery: OrderingQuery): FutureApplicationResult[PaginatedResult[Masternode]] = { + def getMasternodes(paginatedQuery: PaginatedQuery, orderingQuery: OrderingQuery): FuturePaginatedResult[Masternode] = { val result = for { - validatedQuery <- queryValidator.validate(paginatedQuery).toFutureOr + validatedQuery <- queryValidator.validate(paginatedQuery, 2000).toFutureOr ordering <- masternodeOrderingParser.from(orderingQuery).toFutureOr masternodes <- xsnService.getMasternodes().toFutureOr } yield build(masternodes, validatedQuery, ordering) diff --git a/server/app/com/xsn/explorer/services/TransactionService.scala b/server/app/com/xsn/explorer/services/TransactionService.scala index a7952e0..bae0a45 100644 --- a/server/app/com/xsn/explorer/services/TransactionService.scala +++ b/server/app/com/xsn/explorer/services/TransactionService.scala @@ -3,11 +3,10 @@ package com.xsn.explorer.services import javax.inject.Inject import com.alexitc.playsonify.core.FutureApplicationResult -import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureListOps, FutureOps, OrOps} import com.xsn.explorer.errors.{TransactionFormatError, TransactionNotFoundError} import com.xsn.explorer.models.rpc.TransactionVIN import com.xsn.explorer.models.{Transaction, TransactionDetails, TransactionId, TransactionValue} -import com.xsn.explorer.util.Extensions.FutureApplicationResultExt import org.scalactic.{Bad, Good, One, Or} import scala.concurrent.{ExecutionContext, Future} diff --git a/server/app/com/xsn/explorer/services/validators/PaginatedQueryValidator.scala b/server/app/com/xsn/explorer/services/validators/PaginatedQueryValidator.scala deleted file mode 100644 index afec06b..0000000 --- a/server/app/com/xsn/explorer/services/validators/PaginatedQueryValidator.scala +++ /dev/null @@ -1,37 +0,0 @@ -package com.xsn.explorer.services.validators - -import com.alexitc.playsonify.core.ApplicationResult -import com.xsn.explorer.errors.{PaginatedQueryLimitError, PaginatedQueryOffsetError} -import com.xsn.explorer.models.base.{Limit, Offset, PaginatedQuery} -import org.scalactic.{Accumulation, Bad, Good} - -class PaginatedQueryValidator { - - private val MinOffset = 0 - private val LimitRange = 1 to 100 - - def validate(query: PaginatedQuery): ApplicationResult[PaginatedQuery] = { - Accumulation.withGood( - validateOffset(query.offset), - validateLimit(query.limit)) { - - PaginatedQuery.apply - } - } - - private def validateOffset(offset: Offset): ApplicationResult[Offset] = { - if (offset.int >= MinOffset) { - Good(offset) - } else { - Bad(PaginatedQueryOffsetError).accumulating - } - } - - private def validateLimit(limit: Limit): ApplicationResult[Limit] = { - if (LimitRange contains limit.int) { - Good(limit) - } else { - Bad(PaginatedQueryLimitError(LimitRange.last)).accumulating - } - } -} diff --git a/server/app/com/xsn/explorer/tasks/BackwardsSynchronizerTask.scala b/server/app/com/xsn/explorer/tasks/BackwardsSynchronizerTask.scala index a9b1c7a..871b7a9 100644 --- a/server/app/com/xsn/explorer/tasks/BackwardsSynchronizerTask.scala +++ b/server/app/com/xsn/explorer/tasks/BackwardsSynchronizerTask.scala @@ -3,14 +3,13 @@ package com.xsn.explorer.tasks import javax.inject.{Inject, Singleton} import com.alexitc.playsonify.core.FutureApplicationResult -import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureListOps, FutureOps, OrOps} import com.xsn.explorer.data.DatabaseSeeder import com.xsn.explorer.data.async.{BlockFutureDataHandler, DatabaseFutureSeeder} import com.xsn.explorer.errors.BlockNotFoundError import com.xsn.explorer.models.rpc.Block import com.xsn.explorer.models.{Blockhash, Height} import com.xsn.explorer.services.{TransactionService, XSNService} -import com.xsn.explorer.util.Extensions.FutureApplicationResultExt import org.scalactic.{Bad, Good, One, Or} import org.slf4j.LoggerFactory diff --git a/server/app/com/xsn/explorer/tasks/FirstBlockSynchronizerTask.scala b/server/app/com/xsn/explorer/tasks/FirstBlockSynchronizerTask.scala index 3853b1f..d933b01 100644 --- a/server/app/com/xsn/explorer/tasks/FirstBlockSynchronizerTask.scala +++ b/server/app/com/xsn/explorer/tasks/FirstBlockSynchronizerTask.scala @@ -3,13 +3,12 @@ package com.xsn.explorer.tasks import javax.inject.{Inject, Singleton} import com.alexitc.playsonify.core.FutureApplicationResult -import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} +import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureListOps, FutureOps, OrOps} import com.xsn.explorer.data.DatabaseSeeder import com.xsn.explorer.data.async.{BlockFutureDataHandler, DatabaseFutureSeeder} import com.xsn.explorer.errors.BlockNotFoundError import com.xsn.explorer.models.{Blockhash, Height} import com.xsn.explorer.services.{TransactionService, XSNService} -import com.xsn.explorer.util.Extensions.FutureApplicationResultExt import org.scalactic.{Bad, Good, One, Or} import org.slf4j.LoggerFactory diff --git a/server/app/com/xsn/explorer/util/Extensions.scala b/server/app/com/xsn/explorer/util/Extensions.scala index d9a555c..308e523 100644 --- a/server/app/com/xsn/explorer/util/Extensions.scala +++ b/server/app/com/xsn/explorer/util/Extensions.scala @@ -1,10 +1,5 @@ package com.xsn.explorer.util -import com.alexitc.playsonify.core.{FutureApplicationResult, FutureOr} -import org.scalactic.{Bad, Good} - -import scala.concurrent.{ExecutionContext, Future} - object Extensions { private val SatoshiScale = 100000000L @@ -15,28 +10,6 @@ object Extensions { } } - implicit class FutureApplicationResultExt[+A](val inner: List[FutureApplicationResult[A]]) extends AnyVal { - def toFutureOr(implicit ec: ExecutionContext): FutureOr[List[A]] = { - val futureList = Future.sequence(inner) - - val future = futureList.map { resultList => - val errorsMaybe = resultList - .flatMap(_.swap.toOption) - .reduceLeftOption(_ ++ _) - .map(_.distinct) - - errorsMaybe - .map(Bad(_)) - .getOrElse { - val valueList = resultList.flatMap(_.toOption) - Good(valueList) - } - } - - new FutureOr(future) - } - } - implicit class ListOptionExt[+A](val inner: List[Option[A]]) extends AnyVal { def everything: Option[List[A]] = { if (inner.forall(_.isDefined)) { diff --git a/server/app/controllers/BalancesController.scala b/server/app/controllers/BalancesController.scala index b902dfe..7c1f9e9 100644 --- a/server/app/controllers/BalancesController.scala +++ b/server/app/controllers/BalancesController.scala @@ -2,7 +2,7 @@ package controllers import javax.inject.Inject -import com.xsn.explorer.models.base.{Limit, Offset, OrderingQuery, PaginatedQuery} +import com.alexitc.playsonify.models.{Limit, Offset, OrderingQuery, PaginatedQuery} import com.xsn.explorer.services.BalanceService import controllers.common.{MyJsonController, MyJsonControllerComponents} diff --git a/server/app/controllers/MasternodesController.scala b/server/app/controllers/MasternodesController.scala index 7330381..5d67147 100644 --- a/server/app/controllers/MasternodesController.scala +++ b/server/app/controllers/MasternodesController.scala @@ -2,7 +2,7 @@ package controllers import javax.inject.Inject -import com.xsn.explorer.models.base.{Limit, Offset, OrderingQuery, PaginatedQuery} +import com.alexitc.playsonify.models.{Limit, Offset, OrderingQuery, PaginatedQuery} import com.xsn.explorer.services.MasternodeService import controllers.common.{MyJsonController, MyJsonControllerComponents} diff --git a/server/build.sbt b/server/build.sbt index 1b3ead3..71e7637 100644 --- a/server/build.sbt +++ b/server/build.sbt @@ -22,7 +22,7 @@ scalacOptions ++= Seq( ) -val playsonifyVersion = "1.1.0" +val playsonifyVersion = "1.2.0" lazy val root = (project in file(".")) .enablePlugins(PlayScala) diff --git a/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala b/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala index 31e0885..a45c0be 100644 --- a/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala +++ b/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala @@ -1,12 +1,12 @@ package com.xsn.explorer.data +import com.alexitc.playsonify.models._ import com.xsn.explorer.data.anorm.BalancePostgresDataHandler import com.xsn.explorer.data.anorm.dao.BalancePostgresDAO import com.xsn.explorer.data.anorm.interpreters.FieldOrderingSQLInterpreter import com.xsn.explorer.data.common.PostgresDataHandlerSpec import com.xsn.explorer.helpers.DataHelper import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base._ import com.xsn.explorer.models.fields.BalanceField import org.scalactic.Good diff --git a/server/test/com/xsn/explorer/processors/BlockEventsProcessorSpec.scala b/server/test/com/xsn/explorer/processors/BlockEventsProcessorSpec.scala index 45e0028..c4aa375 100644 --- a/server/test/com/xsn/explorer/processors/BlockEventsProcessorSpec.scala +++ b/server/test/com/xsn/explorer/processors/BlockEventsProcessorSpec.scala @@ -1,25 +1,20 @@ package com.xsn.explorer.processors -import com.alexitc.playsonify.core.FutureApplicationResult +import com.alexitc.playsonify.models._ import com.xsn.explorer.data.anorm.dao.{BalancePostgresDAO, BlockPostgresDAO, StatisticsPostgresDAO, TransactionPostgresDAO} import com.xsn.explorer.data.anorm.interpreters.FieldOrderingSQLInterpreter import com.xsn.explorer.data.anorm.{BalancePostgresDataHandler, BlockPostgresDataHandler, DatabasePostgresSeeder, StatisticsPostgresDataHandler} import com.xsn.explorer.data.async.{BlockFutureDataHandler, DatabaseFutureSeeder} import com.xsn.explorer.data.common.PostgresDataHandlerSpec -import com.xsn.explorer.errors.{BlockNotFoundError, TransactionNotFoundError} import com.xsn.explorer.helpers.{BlockLoader, Executors, FileBasedXSNService} -import com.xsn.explorer.models.base._ import com.xsn.explorer.models.fields.BalanceField -import com.xsn.explorer.models.rpc.{Block, Transaction} -import com.xsn.explorer.models.{Blockhash, TransactionId} +import com.xsn.explorer.models.rpc.Block import com.xsn.explorer.processors.BlockEventsProcessor.{NewBlockAppended, RechainDone} import com.xsn.explorer.services.TransactionService -import org.scalactic.{Bad, Good} +import org.scalactic.Good import org.scalatest.BeforeAndAfter import org.scalatest.concurrent.ScalaFutures -import scala.concurrent.Future - class BlockEventsProcessorSpec extends PostgresDataHandlerSpec with ScalaFutures with BeforeAndAfter { lazy val dataHandler = new BlockPostgresDataHandler(database, new BlockPostgresDAO) diff --git a/server/test/controllers/BalancesControllerSpec.scala b/server/test/controllers/BalancesControllerSpec.scala index c155e8d..6cf3206 100644 --- a/server/test/controllers/BalancesControllerSpec.scala +++ b/server/test/controllers/BalancesControllerSpec.scala @@ -1,10 +1,10 @@ package controllers import com.alexitc.playsonify.core.ApplicationResult +import com.alexitc.playsonify.models._ import com.xsn.explorer.data.BalanceBlockingDataHandler import com.xsn.explorer.helpers.DataHelper import com.xsn.explorer.models.Balance -import com.xsn.explorer.models.base._ import com.xsn.explorer.models.fields.BalanceField import controllers.common.MyAPISpec import org.scalactic.Good