|
|
@ -1,14 +1,16 @@ |
|
|
|
package com.xsn.explorer.services |
|
|
|
|
|
|
|
import com.alexitc.playsonify.core.FutureOr.Implicits.{FutureOps, OrOps} |
|
|
|
import com.alexitc.playsonify.core.FuturePaginatedResult |
|
|
|
import com.alexitc.playsonify.core.{FutureApplicationResult, FuturePaginatedResult} |
|
|
|
import com.alexitc.playsonify.models.ordering.OrderingQuery |
|
|
|
import com.alexitc.playsonify.models.pagination.PaginatedQuery |
|
|
|
import com.alexitc.playsonify.models.pagination.{Limit, Offset, PaginatedQuery} |
|
|
|
import com.alexitc.playsonify.validators.PaginatedQueryValidator |
|
|
|
import com.xsn.explorer.data.async.BalanceFutureDataHandler |
|
|
|
import com.xsn.explorer.models.Balance |
|
|
|
import com.xsn.explorer.errors.AddressFormatError |
|
|
|
import com.xsn.explorer.models.{Address, Balance, WrappedResult} |
|
|
|
import com.xsn.explorer.parsers.BalanceOrderingParser |
|
|
|
import javax.inject.Inject |
|
|
|
import org.scalactic.{Good, One, Or} |
|
|
|
|
|
|
|
import scala.concurrent.ExecutionContext |
|
|
|
|
|
|
@ -27,4 +29,22 @@ class BalanceService @Inject() ( |
|
|
|
|
|
|
|
result.toFuture |
|
|
|
} |
|
|
|
|
|
|
|
def getHighest(limit: Limit, lastSeenAddressString: Option[String]): FutureApplicationResult[WrappedResult[List[Balance]]] = { |
|
|
|
val result = for { |
|
|
|
_ <- paginatedQueryValidator.validate(PaginatedQuery(Offset(0), limit), 100).toFutureOr |
|
|
|
|
|
|
|
lastSeenAddress <- { |
|
|
|
lastSeenAddressString |
|
|
|
.map(Address.from) |
|
|
|
.map { txid => Or.from(txid, One(AddressFormatError)).map(Option.apply) } |
|
|
|
.getOrElse(Good(Option.empty)) |
|
|
|
.toFutureOr |
|
|
|
} |
|
|
|
|
|
|
|
data <- balanceFutureDataHandler.getHighestBalances(limit, lastSeenAddress).toFutureOr |
|
|
|
} yield WrappedResult(data) |
|
|
|
|
|
|
|
result.toFuture |
|
|
|
} |
|
|
|
} |
|
|
|