You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.3 KiB
39 lines
1.3 KiB
package com.xsn.explorer.services
|
|
|
|
import com.alexitc.playsonify.core.FutureApplicationResult
|
|
import com.alexitc.playsonify.core.FutureOr.Implicits.FutureOps
|
|
import com.xsn.explorer.data.async.StatisticsFutureDataHandler
|
|
import com.xsn.explorer.models.StatisticsDetails
|
|
import javax.inject.Inject
|
|
import org.scalactic.{Bad, Good}
|
|
|
|
import scala.concurrent.ExecutionContext
|
|
|
|
class StatisticsService @Inject() (
|
|
xsnService: XSNService,
|
|
statisticsFutureDataHandler: StatisticsFutureDataHandler)(
|
|
implicit ec: ExecutionContext) {
|
|
|
|
def getStatistics(): FutureApplicationResult[StatisticsDetails] = {
|
|
val dbStats = statisticsFutureDataHandler.getStatistics()
|
|
val rpcStats = xsnService.getMasternodeCount()
|
|
val difficultyF = xsnService.getDifficulty()
|
|
|
|
val result = for {
|
|
stats <- dbStats.toFutureOr
|
|
count <- discardErrors(rpcStats).toFutureOr
|
|
difficulty <- discardErrors(difficultyF).toFutureOr
|
|
} yield StatisticsDetails(stats, count, difficulty)
|
|
|
|
result.toFuture
|
|
}
|
|
|
|
private def discardErrors[T](value: FutureApplicationResult[T]): FutureApplicationResult[Option[T]] = {
|
|
value
|
|
.map {
|
|
case Good(result) => Good(Some(result))
|
|
case Bad(_) => Good(None)
|
|
}
|
|
.recover { case _: Throwable => Good(None) }
|
|
}
|
|
}
|
|
|