From 47b3cbb887d64fc5071e6a396fccb9971eaa6fbb Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Thu, 11 Nov 2021 10:28:29 +0300 Subject: [PATCH] Tapir updated (#161) * Migration to Tapir 0.18.x. --- .gitignore | 1 + build.sbt | 2 +- docker-compose.yaml | 20 +++++++++++ .../src/main/resources/application.conf | 2 +- .../explorer/http/api/HttpApi.scala | 6 ++-- .../explorer/http/api/commonDirectives.scala | 2 +- .../explorer/http/api/models/Items.scala | 6 +++- .../api/v0/models/BlockExtensionInfo.scala | 1 - .../http/api/v0/models/OutputInfo.scala | 1 - .../api/v0/models/SpendingProofInfo.scala | 1 - .../http/api/v0/models/UOutputInfo.scala | 1 - .../http/api/v0/routes/AddressesRoutes.scala | 10 +++--- .../http/api/v0/routes/AssetsRoutes.scala | 6 ++-- .../http/api/v0/routes/BlocksRoutes.scala | 8 +++-- .../http/api/v0/routes/BoxesRoutes.scala | 12 ++++--- .../http/api/v0/routes/ChartsRoutes.scala | 20 ++++++----- .../http/api/v0/routes/DexRoutes.scala | 6 ++-- .../http/api/v0/routes/DocsRoutes.scala | 6 ++-- .../http/api/v0/routes/InfoRoutes.scala | 6 ++-- .../http/api/v0/routes/SearchRoutes.scala | 4 ++- .../http/api/v0/routes/StatsRoutes.scala | 4 ++- .../api/v0/routes/TransactionsRoutes.scala | 14 ++++---- .../http/api/v1/defs/BoxesEndpointDefs.scala | 10 +++--- .../api/v1/models/BlockExtensionInfo.scala | 1 - .../http/api/v1/models/DataInputInfo.scala | 1 - .../http/api/v1/models/InputInfo.scala | 1 - .../http/api/v1/models/OutputInfo.scala | 1 - .../http/api/v1/models/UDataInputInfo.scala | 1 - .../http/api/v1/models/UInputInfo.scala | 1 - .../http/api/v1/models/UOutputInfo.scala | 1 - .../http/api/v1/routes/AddressesRoutes.scala | 10 +++--- .../http/api/v1/routes/AssetsRoutes.scala | 6 ++-- .../http/api/v1/routes/BlocksRoutes.scala | 6 ++-- .../http/api/v1/routes/BoxesRoutes.scala | 36 ++++++++++--------- .../http/api/v1/routes/DocsRoutes.scala | 6 ++-- .../http/api/v1/routes/EpochsRoutes.scala | 4 ++- .../http/api/v1/routes/MempoolRoutes.scala | 6 ++-- .../http/api/v1/routes/StatsRoutes.scala | 8 +++-- .../http/api/v1/routes/TokensRoutes.scala | 10 +++--- .../api/v1/routes/TransactionsRoutes.scala | 6 ++-- .../explorer/db/models/BlockExtension.scala | 9 +---- .../explorer/protocol/ergoInstances.scala | 7 +--- .../db/repositories/TestOutputRepo.scala | 10 +++--- .../explorer/services/ErgoNetworkSpec.scala | 3 +- project/versions.scala | 2 +- 45 files changed, 163 insertions(+), 122 deletions(-) create mode 100644 docker-compose.yaml diff --git a/.gitignore b/.gitignore index aa7a66c05..57ee990f0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ .metals .bloop target +data /modules/*/target/ /target/ /project/target/ diff --git a/build.sbt b/build.sbt index 4b65f3066..d94f7987c 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ lazy val commonSettings = Seq( scalacOptions ++= commonScalacOptions, scalaVersion := "2.12.15", organization := "org.ergoplatform", - version := "9.6.0", + version := "9.6.3", resolvers += Resolver.sonatypeRepo("public"), resolvers += Resolver.sonatypeRepo("snapshots"), libraryDependencies ++= dependencies.Testing ++ dependencies.CompilerPlugins, diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..c56ec9b1c --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,20 @@ +version: '3.4' + +services: + postgres: + image: postgres:11-alpine + shm_size: 4g + environment: + POSTGRES_PASSWORD: foo + ports: + - "5432:5432" + volumes: + - ./data/postgres:/var/lib/postgresql/data:rw + redis: + image: redis:latest + restart: always + command: ["redis-server"] + ports: + - "127.0.0.1:6379:6379" + volumes: + - ./data/redis:/usr/local/etc/redis diff --git a/modules/explorer-api/src/main/resources/application.conf b/modules/explorer-api/src/main/resources/application.conf index b7ca0b7d7..c435d885e 100644 --- a/modules/explorer-api/src/main/resources/application.conf +++ b/modules/explorer-api/src/main/resources/application.conf @@ -12,7 +12,7 @@ utx-cache.transaction-ttl = 48h requests.max-entities-per-request = 500 requests.max-entities-per-heavy-request = 100 -requests.max-epochs-per-request = 1536 +requests.max-blocks-per-request = 1536 service.chunk-size = 100 protocol { diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/HttpApi.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/HttpApi.scala index 07e67bf33..db6346dd4 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/HttpApi.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/HttpApi.scala @@ -5,15 +5,13 @@ import cats.effect.{ConcurrentEffect, ContextShift, Resource, Timer} import cats.syntax.semigroupk._ import dev.profunktor.redis4cats.algebra.RedisCommands import org.ergoplatform.ErgoAddressEncoder -import org.ergoplatform.explorer.CRaise -import org.ergoplatform.explorer.Err.{RefinementFailed, RequestProcessingErr} import org.ergoplatform.explorer.db.Trans import org.ergoplatform.explorer.db.algebra.LiftConnectionIO import org.ergoplatform.explorer.http.api.streaming.CompileStream import org.ergoplatform.explorer.http.api.v0.routes.RoutesV0Bundle import org.ergoplatform.explorer.http.api.v1.routes.RoutesV1Bundle import org.ergoplatform.explorer.settings.ApiSettings -import org.http4s.server.blaze.BlazeServerBuilder +import org.http4s.blaze.server.BlazeServerBuilder import org.http4s.server.middleware._ import org.http4s.server.{Router, Server} import org.http4s.syntax.kleisli._ @@ -36,7 +34,7 @@ object HttpApi { ec: ExecutionContext, encoder: ErgoAddressEncoder, opts: Http4sServerOptions[F, F] - ): Resource[F, Server[F]] = + ): Resource[F, Server] = for { v0 <- Resource.eval(RoutesV0Bundle(settings.protocol, settings.utxCache, redis)(trans)) v1 <- Resource.eval(RoutesV1Bundle(settings.service, settings.requests, settings.utxCache, redis)(trans)) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/commonDirectives.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/commonDirectives.scala index ed07a3a84..65e27ebe4 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/commonDirectives.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/commonDirectives.scala @@ -37,7 +37,7 @@ object commonDirectives { defaultFieldOpt: Option[String] = None ): EndpointInput[Sorting] = (query[Option[String]]("sortBy").validate( - Validator.`enum`(none :: allowedFields.keys.toNonEmptyList.toList.map(_.some)) + Validator.enumeration(none :: allowedFields.keys.toNonEmptyList.toList.map(_.some)) ) and query[Option[Sorting.SortOrder]]("sortDirection")) .map { input => val (fieldOpt, orderOpt) = input diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/models/Items.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/models/Items.scala index c9f637457..ece61c6dd 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/models/Items.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/models/Items.scala @@ -9,6 +9,10 @@ final case class Items[A](items: List[A], total: Int) object Items { - implicit def schema[A: Schema]: Schema[Items[A]] = Schema.derived[Items[A]] + implicit def schema[A: Schema]: Schema[Items[A]] = + Schema.derived[Items[A]] + .modify(_.items)(_.description("Items in selection")) + .modify(_.total)(_.description("Total qty of items")) + implicit def validator[A: Schema]: Validator[Items[A]] = schema.validator } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/BlockExtensionInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/BlockExtensionInfo.scala index eaf38ecac..93f9b2e35 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/BlockExtensionInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/BlockExtensionInfo.scala @@ -20,7 +20,6 @@ object BlockExtensionInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("fields"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/OutputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/OutputInfo.scala index d221cd51a..739ca521e 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/OutputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/OutputInfo.scala @@ -43,7 +43,6 @@ object OutputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/SpendingProofInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/SpendingProofInfo.scala index 32c407bb9..8b1d6a672 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/SpendingProofInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/SpendingProofInfo.scala @@ -24,7 +24,6 @@ object SpendingProofInfo { implicit private def extensionSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("ProofExtension"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/UOutputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/UOutputInfo.scala index 6b556653c..0f3bcef36 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/UOutputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/models/UOutputInfo.scala @@ -42,7 +42,6 @@ object UOutputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AddressesRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AddressesRoutes.scala index 22303f006..be0c636a6 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AddressesRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AddressesRoutes.scala @@ -24,17 +24,19 @@ final class AddressesRoutes[ import org.ergoplatform.explorer.http.api.v0.defs.AddressesEndpointDefs._ + private def interpreter = Http4sServerInterpreter(opts) + val routes: HttpRoutes[F] = getAddressR <+> getTxsByAddressR <+> getAssetHoldersR <+> getBalancesR def getAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getAddressDef) { + interpreter.toRoutes(getAddressDef) { case (address, minConfirmations) => addressesService.getAddressInfo(address, minConfirmations).adaptThrowable.value } def getTxsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getTxsByAddressDef) { + interpreter.toRoutes(getTxsByAddressDef) { case (address, paging) => transactionsService .getTxsInfoByAddress(address, paging) @@ -43,7 +45,7 @@ final class AddressesRoutes[ } def getAssetHoldersR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getAssetHoldersDef) { + interpreter.toRoutes(getAssetHoldersDef) { case (tokenId, paging) => addressesService .getAssetHoldersAddresses(tokenId, paging) @@ -54,7 +56,7 @@ final class AddressesRoutes[ } def getBalancesR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getBalancesDef) { paging => + interpreter.toRoutes(getBalancesDef) { paging => addressesService.balances(paging).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AssetsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AssetsRoutes.scala index c7da2cf62..40c208f4b 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AssetsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/AssetsRoutes.scala @@ -22,8 +22,10 @@ final class AssetsRoutes[ val routes: HttpRoutes[F] = getAllIssuingBoxesR <+> getIssuingBoxR + private def interpreter = Http4sServerInterpreter(opts) + private def getAllIssuingBoxesR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getAllIssuingBoxesDef) { paging => + interpreter.toRoutes(getAllIssuingBoxesDef) { paging => service .getAllIssuingBoxes(paging) .adaptThrowable @@ -31,7 +33,7 @@ final class AssetsRoutes[ } private def getIssuingBoxR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getIssuingBoxDef) { tokenId => + interpreter.toRoutes(getIssuingBoxDef) { tokenId => service .getIssuingBoxes(NonEmptyList.one(tokenId)) .compile diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BlocksRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BlocksRoutes.scala index 151fa2515..3fc7c85b5 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BlocksRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BlocksRoutes.scala @@ -23,8 +23,10 @@ final class BlocksRoutes[ val routes: HttpRoutes[F] = getBlocksR <+> getBlockSummaryByIdR <+> getBlockIdsAtHeightR + private def interpreter = Http4sServerInterpreter(opts) + private def getBlocksR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getBlocksDef) { + interpreter.toRoutes(getBlocksDef) { case (paging, sorting) => service .getBlocks(paging, sorting) @@ -33,7 +35,7 @@ final class BlocksRoutes[ } private def getBlockSummaryByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getBlockSummaryByIdDef) { id => + interpreter.toRoutes(getBlockSummaryByIdDef) { id => service .getBlockSummaryById(id) .adaptThrowable @@ -42,7 +44,7 @@ final class BlocksRoutes[ } private def getBlockIdsAtHeightR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getBlockIdsAtHeightDef) { height => + interpreter.toRoutes(getBlockIdsAtHeightDef) { height => service .getBlockIdsAtHeight(height) .adaptThrowable diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BoxesRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BoxesRoutes.scala index 3f5c4cb8f..54b3472c1 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BoxesRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/BoxesRoutes.scala @@ -22,8 +22,10 @@ final class BoxesRoutes[ getOutputByIdR <+> getOutputsByErgoTreeR <+> getUnspentOutputsByErgoTreeR <+> getOutputsByAddressR <+> getUnspentOutputsByAddressR + private def interpreter = Http4sServerInterpreter(opts) + private def getOutputByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getOutputByIdDef) { id => + interpreter.toRoutes(getOutputByIdDef) { id => service .getOutputById(id) .adaptThrowable @@ -32,22 +34,22 @@ final class BoxesRoutes[ } private def getOutputsByErgoTreeR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getOutputsByErgoTreeDef) { tree => + interpreter.toRoutes(getOutputsByErgoTreeDef) { tree => service.getOutputsByErgoTree(tree).compile.toList.adaptThrowable.value } private def getUnspentOutputsByErgoTreeR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnspentOutputsByErgoTreeDef) { tree => + interpreter.toRoutes(getUnspentOutputsByErgoTreeDef) { tree => service.getUnspentOutputsByErgoTree(tree).compile.toList.adaptThrowable.value } private def getOutputsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getOutputsByAddressDef) { address => + interpreter.toRoutes(getOutputsByAddressDef) { address => service.getOutputsByAddress(address).compile.toList.adaptThrowable.value } private def getUnspentOutputsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnspentOutputsByAddressDef) { address => + interpreter.toRoutes(getUnspentOutputsByAddressDef) { address => service.getUnspentOutputsByAddress(address).compile.toList.adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/ChartsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/ChartsRoutes.scala index a57a93518..076697e25 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/ChartsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/ChartsRoutes.scala @@ -23,48 +23,50 @@ final class ChartsRoutes[ getAvgTxsNumPerBlockR <+> getTotalTxsNumR <+> getAvgDifficultyR <+> getMinersRevenuR <+> getHashRateR <+> getHashRateDistributionR + private def interpreter = Http4sServerInterpreter(opts) + private def getTotalCoinsAmtR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getTotalCoinsAmtDef) { timespan => + interpreter.toRoutes(getTotalCoinsAmtDef) { timespan => service.getTotalCoins(timespan).adaptThrowable.value } private def getAvgBlockSizeR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getAvgBlockSizeDef) { timespan => + interpreter.toRoutes(getAvgBlockSizeDef) { timespan => service.getAvgBlockSize(timespan).adaptThrowable.value } private def getBlockChainSizeR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getBlockChainSizeDef) { timespan => + interpreter.toRoutes(getBlockChainSizeDef) { timespan => service.getBlockChainSize(timespan).adaptThrowable.value } private def getAvgTxsNumPerBlockR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getAvgTxsNumPerBlockDef) { timespan => + interpreter.toRoutes(getAvgTxsNumPerBlockDef) { timespan => service.getAvgTxsNumPerBlock(timespan).adaptThrowable.value } private def getTotalTxsNumR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getTotalTxsNumDef) { timespan => + interpreter.toRoutes(getTotalTxsNumDef) { timespan => service.getTransactionsNum(timespan).adaptThrowable.value } private def getAvgDifficultyR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getAvgDifficultyDef) { timespan => + interpreter.toRoutes(getAvgDifficultyDef) { timespan => service.getAvgDifficulty(timespan).adaptThrowable.value } private def getMinersRevenuR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getMinersRevenueDef) { timespan => + interpreter.toRoutes(getMinersRevenueDef) { timespan => service.getMinersRevenue(timespan).adaptThrowable.value } private def getHashRateR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getHashRateDef) { timespan => + interpreter.toRoutes(getHashRateDef) { timespan => service.getHashRate(timespan).adaptThrowable.value } private def getHashRateDistributionR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getHashRateDistributionDef) { _ => + interpreter.toRoutes(getHashRateDistributionDef) { _ => service.getHashRateDistribution(24.hours).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DexRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DexRoutes.scala index 58735ba9b..9be6e1a09 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DexRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DexRoutes.scala @@ -21,8 +21,10 @@ final class DexRoutes[ val routes: HttpRoutes[F] = getUnspentSellOrdersR <+> getUnspentBuyOrdersR + private def interpreter = Http4sServerInterpreter(opts) + private def getUnspentSellOrdersR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnspentSellOrdersDef) { + interpreter.toRoutes(getUnspentSellOrdersDef) { case (tokenId, paging) => service .getUnspentSellOrders(tokenId, paging) @@ -33,7 +35,7 @@ final class DexRoutes[ } private def getUnspentBuyOrdersR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnspentBuyOrdersDef) { + interpreter.toRoutes(getUnspentBuyOrdersDef) { case (tokenId, paging) => service .getUnspentBuyOrders(tokenId, paging) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DocsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DocsRoutes.scala index aebbe6fc6..bb2f3f64d 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DocsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/DocsRoutes.scala @@ -20,6 +20,8 @@ final class DocsRoutes[F[_]: Concurrent: ContextShift: Timer](implicit opts: Htt val routes: HttpRoutes[F] = openApiSpecR <+> redocApiSpecR + private def interpreter = Http4sServerInterpreter(opts) + private def allEndpoints = AddressesEndpointDefs.endpoints ++ AssetsEndpointDefs.endpoints ++ @@ -46,13 +48,13 @@ final class DocsRoutes[F[_]: Concurrent: ContextShift: Timer](implicit opts: Htt Nil private val docsAsYaml = - OpenAPIDocsInterpreter + OpenAPIDocsInterpreter() .toOpenAPI(allEndpoints, "Ergo Explorer API v0", "1.0") .tags(tags) .toYaml private def openApiSpecR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(apiSpecDef) { _ => + interpreter.toRoutes(apiSpecDef) { _ => docsAsYaml .asRight[ApiErr] .pure[F] diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/InfoRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/InfoRoutes.scala index 26c3bd7c8..eff388d53 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/InfoRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/InfoRoutes.scala @@ -20,11 +20,13 @@ final class InfoRoutes[ val routes: HttpRoutes[F] = getCurrentStatsR <+> getCurrentSupplyR + private def interpreter = Http4sServerInterpreter(opts) + private def getCurrentStatsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getBlockChainInfoDef)(_ => service.getBlockChainInfo.adaptThrowable.value) + interpreter.toRoutes(getBlockChainInfoDef)(_ => service.getBlockChainInfo.adaptThrowable.value) private def getCurrentSupplyR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getCurrentSupplyDef) { _ => + interpreter.toRoutes(getCurrentSupplyDef) { _ => service.getBlockChainInfo .map { info => BigDecimal diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/SearchRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/SearchRoutes.scala index 9f2894cda..ab0cc8c22 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/SearchRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/SearchRoutes.scala @@ -17,8 +17,10 @@ final class SearchRoutes[ val routes: HttpRoutes[F] = searchR + private def interpreter = Http4sServerInterpreter(opts) + private def searchR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(searchDef) { q => + interpreter.toRoutes(searchDef) { q => search.search(q).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/StatsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/StatsRoutes.scala index 83455ca01..0c2d327be 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/StatsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/StatsRoutes.scala @@ -17,8 +17,10 @@ final class StatsRoutes[ val routes: HttpRoutes[F] = getCurrentStatsR + private def interpreter = Http4sServerInterpreter(opts) + private def getCurrentStatsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getCurrentStatsDef) { _ => + interpreter.toRoutes(getCurrentStatsDef) { _ => service.getCurrentStats.adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/TransactionsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/TransactionsRoutes.scala index 8b4e17b80..970f11181 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/TransactionsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v0/routes/TransactionsRoutes.scala @@ -23,8 +23,10 @@ final class TransactionsRoutes[ getUnconfirmedTxsByAddressR <+> getUnconfirmedTxByIdR <+> getUnconfirmedTxsR <+> getTxsSinceR <+> sendTransactionR <+> getTxByIdR + private def interpreter = Http4sServerInterpreter(opts) + private def getTxByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getTxByIdDef) { txId => + interpreter.toRoutes(getTxByIdDef) { txId => txsService .getTxInfo(txId) .adaptThrowable @@ -33,7 +35,7 @@ final class TransactionsRoutes[ } private def getUnconfirmedTxsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnconfirmedTxsDef) { paging => + interpreter.toRoutes(getUnconfirmedTxsDef) { paging => offChainService .getUnconfirmedTxs(paging) .adaptThrowable @@ -41,7 +43,7 @@ final class TransactionsRoutes[ } private def getUnconfirmedTxByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnconfirmedTxByIdDef) { txId => + interpreter.toRoutes(getUnconfirmedTxByIdDef) { txId => offChainService .getUnconfirmedTxInfo(txId) .adaptThrowable @@ -50,7 +52,7 @@ final class TransactionsRoutes[ } private def getUnconfirmedTxsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getUnconfirmedTxsByAddressDef) { case (paging, address) => + interpreter.toRoutes(getUnconfirmedTxsByAddressDef) { case (paging, address) => offChainService .getUnconfirmedTxsByAddress(address, paging) .adaptThrowable @@ -58,7 +60,7 @@ final class TransactionsRoutes[ } private def getTxsSinceR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(getTxsSinceDef) { case (paging, height) => + interpreter.toRoutes(getTxsSinceDef) { case (paging, height) => txsService .getTxsSince(height, paging) .adaptThrowable @@ -66,7 +68,7 @@ final class TransactionsRoutes[ } private def sendTransactionR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(sendTransactionDef) { tx => + interpreter.toRoutes(sendTransactionDef) { tx => offChainService.submitTransaction(tx).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/defs/BoxesEndpointDefs.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/defs/BoxesEndpointDefs.scala index b847ba000..03acc13ff 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/defs/BoxesEndpointDefs.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/defs/BoxesEndpointDefs.scala @@ -39,20 +39,20 @@ final class BoxesEndpointDefs[F[_]](settings: RequestsSettings) { baseEndpointDef.get .in(PathPrefix / "unspent" / "stream") .in(blocksSlicing(settings.maxBlocksPerRequest)) - .out(streamListBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) + .out(streamBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) def streamUnspentOutputsByEpochsDef: Endpoint[Int, ApiErr, fs2.Stream[F, Byte], Fs2Streams[F]] = baseEndpointDef.get .in(PathPrefix / "unspent" / "byLastEpochs" / "stream") .in(lastBlocks(settings.maxBlocksPerRequest)) - .out(streamListBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) + .out(streamBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) def streamUnspentOutputsByGixDef: Endpoint[(Long, Int), ApiErr, fs2.Stream[F, Byte], Fs2Streams[F]] = baseEndpointDef.get .in(PathPrefix / "unspent" / "byGlobalIndex" / "stream") .in(query[Long]("minGix").validate(Validator.min(0L)).description("Min global index (in blockchain) of a box")) .in(limit(settings.maxEntitiesPerRequest)) - .out(streamListBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) + .out(streamBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) .description("Get a stream of unspent outputs ordered by global index") def streamOutputsByErgoTreeTemplateHashDef @@ -60,7 +60,7 @@ final class BoxesEndpointDefs[F[_]](settings: RequestsSettings) { baseEndpointDef.get .in(PathPrefix / "byErgoTreeTemplateHash" / path[ErgoTreeTemplateHash] / "stream") .in(blocksSlicing(settings.maxBlocksPerRequest)) - .out(streamListBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) + .out(streamBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) .description("Get a stream of unspent outputs by a hash of the given ErgoTreeTemplate") def streamUnspentOutputsByErgoTreeTemplateHashDef @@ -68,7 +68,7 @@ final class BoxesEndpointDefs[F[_]](settings: RequestsSettings) { baseEndpointDef.get .in(PathPrefix / "unspent" / "byErgoTreeTemplateHash" / path[ErgoTreeTemplateHash] / "stream") .in(blocksSlicing(settings.maxBlocksPerRequest)) - .out(streamListBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) + .out(streamBody(Fs2Streams[F])(Schema.derived[List[OutputInfo]], CodecFormat.Json(), None)) def outputsByTokenIdDef: Endpoint[(TokenId, Paging), ApiErr, Items[OutputInfo], Any] = baseEndpointDef.get diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/BlockExtensionInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/BlockExtensionInfo.scala index 8fc6d6cdd..56ce8037d 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/BlockExtensionInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/BlockExtensionInfo.scala @@ -17,7 +17,6 @@ object BlockExtensionInfo { implicit private def fieldsSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("ExtensionFields"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/DataInputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/DataInputInfo.scala index 0dadb0ca0..d9870da3b 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/DataInputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/DataInputInfo.scala @@ -41,7 +41,6 @@ object DataInputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/InputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/InputInfo.scala index 2740749ce..0b132bca2 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/InputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/InputInfo.scala @@ -43,7 +43,6 @@ object InputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/OutputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/OutputInfo.scala index 8ba9c9e75..c513c9c43 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/OutputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/OutputInfo.scala @@ -49,7 +49,6 @@ object OutputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UDataInputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UDataInputInfo.scala index bfb674059..4cd4ee0e2 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UDataInputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UDataInputInfo.scala @@ -41,7 +41,6 @@ object UDataInputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UInputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UInputInfo.scala index ac1093ac1..28649c98f 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UInputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UInputInfo.scala @@ -43,7 +43,6 @@ object UInputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UOutputInfo.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UOutputInfo.scala index d5ba3ff3e..306cb52eb 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UOutputInfo.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/models/UOutputInfo.scala @@ -42,7 +42,6 @@ object UOutputInfo { implicit private def registersSchema: Schema[Json] = Schema( SchemaType.SOpenProduct( - SchemaType.SObjectInfo("AdditionalRegisters"), Schema(SchemaType.SString[Json]()) )(_ => Map.empty) ) diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AddressesRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AddressesRoutes.scala index c5f7b2910..3a7baec94 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AddressesRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AddressesRoutes.scala @@ -16,24 +16,26 @@ final class AddressesRoutes[F[_]: Concurrent: ContextShift: Timer: AdaptThrowabl settings: RequestsSettings, transactions: Transactions[F], addresses: Addresses[F] -) { +)(implicit opts: Http4sServerOptions[F, F]) { val defs = new AddressesEndpointDefs(settings) val routes: HttpRoutes[F] = getTxsByAddressR <+> getConfirmedBalanceR <+> getTotalBalanceR + private def interpreter = Http4sServerInterpreter(opts) + private def getTxsByAddressR = - Http4sServerInterpreter.toRoutes(defs.getTxsByAddressDef) { case (addr, paging) => + interpreter.toRoutes(defs.getTxsByAddressDef) { case (addr, paging) => transactions.getByAddress(addr, paging).adaptThrowable.value } private def getConfirmedBalanceR = - Http4sServerInterpreter.toRoutes(defs.getConfirmedBalanceDef) { case (addr, confirmations) => + interpreter.toRoutes(defs.getConfirmedBalanceDef) { case (addr, confirmations) => addresses.confirmedBalanceOf(addr, confirmations).adaptThrowable.value } private def getTotalBalanceR = - Http4sServerInterpreter.toRoutes(defs.getTotalBalanceDef) { addr => + interpreter.toRoutes(defs.getTotalBalanceDef) { addr => addresses.totalBalanceOf(addr).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AssetsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AssetsRoutes.scala index 4a8a90cf3..363dfab53 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AssetsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/AssetsRoutes.scala @@ -21,13 +21,15 @@ final class AssetsRoutes[ val routes: HttpRoutes[F] = listTokensR <+> searchByTokenIdR + private def interpreter = Http4sServerInterpreter(opts) + private def searchByTokenIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.searchByTokenIdDef) { case (q, paging) => + interpreter.toRoutes(defs.searchByTokenIdDef) { case (q, paging) => assets.getAllLike(q, paging).adaptThrowable.value } private def listTokensR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.listTokensDef) { case (paging, ordering, hideNfts) => + interpreter.toRoutes(defs.listTokensDef) { case (paging, ordering, hideNfts) => tokens.getAll(paging, ordering, hideNfts).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BlocksRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BlocksRoutes.scala index d315f074a..de4022a44 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BlocksRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BlocksRoutes.scala @@ -21,8 +21,10 @@ final class BlocksRoutes[ val routes: HttpRoutes[F] = getBlocksR <+> getBlockSummaryByIdR + private def interpreter = Http4sServerInterpreter(opts) + private def getBlocksR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getBlocksDef) { case (paging, sorting) => + interpreter.toRoutes(defs.getBlocksDef) { case (paging, sorting) => blocks .getBlocks(paging, sorting) .adaptThrowable @@ -30,7 +32,7 @@ final class BlocksRoutes[ } private def getBlockSummaryByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getBlockSummaryByIdDef) { id => + interpreter.toRoutes(defs.getBlockSummaryByIdDef) { id => blocks .getBlockSummaryById(id) .adaptThrowable diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BoxesRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BoxesRoutes.scala index eba3d21c1..78738166d 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BoxesRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/BoxesRoutes.scala @@ -38,43 +38,45 @@ final class BoxesRoutes[ getUnspentOutputsByAddressR <+> getOutputByIdR + private def interpreter = Http4sServerInterpreter(opts) + private def streamUnspentOutputsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.streamUnspentOutputsDef) { epochs => + interpreter.toRoutes(defs.streamUnspentOutputsDef) { epochs => streaming.bytesStream(service.streamUnspentOutputs(epochs)) } private def streamUnspentOutputsByEpochsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.streamUnspentOutputsByEpochsDef) { lastEpochs => + interpreter.toRoutes(defs.streamUnspentOutputsByEpochsDef) { lastEpochs => streaming.bytesStream(service.streamUnspentOutputs(lastEpochs)) } private def streamUnspentOutputsByGixR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.streamUnspentOutputsByGixDef) { case (minGix, limit) => + interpreter.toRoutes(defs.streamUnspentOutputsByGixDef) { case (minGix, limit) => streaming.bytesStream(service.streamUnspentOutputs(minGix, limit)) } private def streamOutputsByErgoTreeTemplateHashR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.streamOutputsByErgoTreeTemplateHashDef) { case (template, epochs) => + interpreter.toRoutes(defs.streamOutputsByErgoTreeTemplateHashDef) { case (template, epochs) => streaming.bytesStream(service.streamOutputsByErgoTreeTemplateHash(template, epochs)) } private def streamUnspentOutputsByErgoTreeTemplateHashR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.streamUnspentOutputsByErgoTreeTemplateHashDef) { case (template, epochs) => + interpreter.toRoutes(defs.streamUnspentOutputsByErgoTreeTemplateHashDef) { case (template, epochs) => streaming.bytesStream(service.streamUnspentOutputsByErgoTreeTemplateHash(template, epochs)) } private def outputsByTokenIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.outputsByTokenIdDef) { case (tokenId, paging) => + interpreter.toRoutes(defs.outputsByTokenIdDef) { case (tokenId, paging) => service.getOutputsByTokenId(tokenId, paging).adaptThrowable.value } private def unspentOutputsByTokenIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.unspentOutputsByTokenIdDef) { case (tokenId, paging, ord) => + interpreter.toRoutes(defs.unspentOutputsByTokenIdDef) { case (tokenId, paging, ord) => service.getUnspentOutputsByTokenId(tokenId, paging, ord).adaptThrowable.value } private def getOutputByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getOutputByIdDef) { id => + interpreter.toRoutes(defs.getOutputByIdDef) { id => service .getOutputById(id) .adaptThrowable @@ -83,47 +85,47 @@ final class BoxesRoutes[ } private def getOutputsByErgoTreeR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getOutputsByErgoTreeDef) { case (tree, paging) => + interpreter.toRoutes(defs.getOutputsByErgoTreeDef) { case (tree, paging) => service.getOutputsByErgoTree(tree, paging).adaptThrowable.value } private def getUnspentOutputsByErgoTreeR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getUnspentOutputsByErgoTreeDef) { case (tree, paging, ord) => + interpreter.toRoutes(defs.getUnspentOutputsByErgoTreeDef) { case (tree, paging, ord) => service.getUnspentOutputsByErgoTree(tree, paging, ord).adaptThrowable.value } private def getOutputsByErgoTreeTemplateHashR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getOutputsByErgoTreeTemplateHashDef) { case (tree, paging) => + interpreter.toRoutes(defs.getOutputsByErgoTreeTemplateHashDef) { case (tree, paging) => service.getOutputsByErgoTreeTemplateHash(tree, paging).adaptThrowable.value } private def getUnspentOutputsByErgoTreeTemplateHashR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getUnspentOutputsByErgoTreeTemplateHashDef) { case (tree, paging) => + interpreter.toRoutes(defs.getUnspentOutputsByErgoTreeTemplateHashDef) { case (tree, paging) => service.getUnspentOutputsByErgoTreeTemplateHash(tree, paging).adaptThrowable.value } private def getOutputsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getOutputsByAddressDef) { case (address, paging) => + interpreter.toRoutes(defs.getOutputsByAddressDef) { case (address, paging) => service.getOutputsByAddress(address, paging).adaptThrowable.value } private def getUnspentOutputsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getUnspentOutputsByAddressDef) { case (address, paging, ord) => + interpreter.toRoutes(defs.getUnspentOutputsByAddressDef) { case (address, paging, ord) => service.getUnspentOutputsByAddress(address, paging, ord).adaptThrowable.value } private def searchOutputsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.searchOutputsDef) { case (query, paging) => + interpreter.toRoutes(defs.searchOutputsDef) { case (query, paging) => service.searchAll(query, paging).adaptThrowable.value } private def searchUnspentOutputsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.searchUnspentOutputsDef) { case (query, paging) => + interpreter.toRoutes(defs.searchUnspentOutputsDef) { case (query, paging) => service.searchUnspent(query, paging).adaptThrowable.value } private def searchUnspentOutputsByAssetsUnionR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.searchUnspentOutputsByTokensUnionDef) { case (query, paging) => + interpreter.toRoutes(defs.searchUnspentOutputsByTokensUnionDef) { case (query, paging) => service.searchUnspentByAssetsUnion(query, paging).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/DocsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/DocsRoutes.scala index 5af5899dc..a5c44e7a1 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/DocsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/DocsRoutes.scala @@ -23,6 +23,8 @@ final class DocsRoutes[F[_]: Concurrent: ContextShift: Timer](settings: Requests val routes: HttpRoutes[F] = openApiSpecR <+> redocApiSpecR + private def interpreter = Http4sServerInterpreter(opts) + private def allEndpoints = new TransactionsEndpointDefs(settings).endpoints ++ new BoxesEndpointDefs(settings).endpoints ++ @@ -44,13 +46,13 @@ final class DocsRoutes[F[_]: Concurrent: ContextShift: Timer](settings: Requests Nil private val docsAsYaml = - OpenAPIDocsInterpreter + OpenAPIDocsInterpreter() .toOpenAPI(allEndpoints, "Ergo Explorer API v1", "1.0") .tags(tags) .toYaml private def openApiSpecR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(apiSpecDef) { _ => + interpreter.toRoutes(apiSpecDef) { _ => docsAsYaml .asRight[ApiErr] .pure[F] diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/EpochsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/EpochsRoutes.scala index ff415da32..7047e9e45 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/EpochsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/EpochsRoutes.scala @@ -20,8 +20,10 @@ final class EpochsRoutes[ val routes: HttpRoutes[F] = getEpochInfoR + private def interpreter = Http4sServerInterpreter(opts) + private def getEpochInfoR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getEpochInfoDef) { _ => + interpreter.toRoutes(defs.getEpochInfoDef) { _ => epochs .getLastEpoch .adaptThrowable diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/MempoolRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/MempoolRoutes.scala index 803bebdc4..48df7b0e0 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/MempoolRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/MempoolRoutes.scala @@ -18,13 +18,15 @@ final class MempoolRoutes[ val routes: HttpRoutes[F] = sendTransactionR <+> getTransactionsByAddressR + private def interpreter = Http4sServerInterpreter(opts) + private def sendTransactionR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.sendTransactionDef) { tx => + interpreter.toRoutes(defs.sendTransactionDef) { tx => service.submit(tx).adaptThrowable.value } private def getTransactionsByAddressR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getTransactionsByAddressDef) { case (address, paging) => + interpreter.toRoutes(defs.getTransactionsByAddressDef) { case (address, paging) => service.getByAddress(address, paging).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/StatsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/StatsRoutes.scala index 9a5f816f7..5cc31d8f6 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/StatsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/StatsRoutes.scala @@ -20,22 +20,24 @@ final class StatsRoutes[ val routes: HttpRoutes[F] = getNetworkInfoR <+> getNetworkStateR <+> getNetworkStatsR + private def interpreter = Http4sServerInterpreter(opts) + private def getNetworkInfoR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getNetworkInfo) { _ => + interpreter.toRoutes(defs.getNetworkInfo) { _ => infos.getState.adaptThrowable .orNotFound(s"Latest network info") .value } private def getNetworkStateR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getNetworkState) { _ => + interpreter.toRoutes(defs.getNetworkState) { _ => infos.getState.adaptThrowable .orNotFound(s"Latest network state") .value } private def getNetworkStatsR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getNetworkStats) { _ => + interpreter.toRoutes(defs.getNetworkStats) { _ => infos.getStats.adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TokensRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TokensRoutes.scala index 717693d20..308dcc16a 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TokensRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TokensRoutes.scala @@ -22,8 +22,10 @@ final class TokensRoutes[ val routes: HttpRoutes[F] = listR <+> searchR <+> getBySymbolR <+> getByIdR + private def interpreter = Http4sServerInterpreter(opts) + private def getByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getByIdDef) { id => + interpreter.toRoutes(defs.getByIdDef) { id => tokens .get(id) .adaptThrowable @@ -32,7 +34,7 @@ final class TokensRoutes[ } private def getBySymbolR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getBySymbolDef) { sym => + interpreter.toRoutes(defs.getBySymbolDef) { sym => tokens .getBySymbol(sym) .adaptThrowable @@ -40,12 +42,12 @@ final class TokensRoutes[ } private def searchR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.searchDef) { case (q, paging) => + interpreter.toRoutes(defs.searchDef) { case (q, paging) => tokens.search(q, paging).adaptThrowable.value } private def listR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.listDef) { case (paging, ordering, hideNfts) => + interpreter.toRoutes(defs.listDef) { case (paging, ordering, hideNfts) => tokens.getAll(paging, ordering, hideNfts).adaptThrowable.value } } diff --git a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TransactionsRoutes.scala b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TransactionsRoutes.scala index d1e459f7e..c70d18518 100644 --- a/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TransactionsRoutes.scala +++ b/modules/explorer-api/src/main/scala/org/ergoplatform/explorer/http/api/v1/routes/TransactionsRoutes.scala @@ -22,8 +22,10 @@ final class TransactionsRoutes[ val routes: HttpRoutes[F] = getByInputsScriptTemplateR <+> getByIdR + private def interpreter = Http4sServerInterpreter(opts) + private def getByIdR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getByIdDef) { txId => + interpreter.toRoutes(defs.getByIdDef) { txId => service .get(txId) .adaptThrowable @@ -32,7 +34,7 @@ final class TransactionsRoutes[ } private def getByInputsScriptTemplateR: HttpRoutes[F] = - Http4sServerInterpreter.toRoutes(defs.getByInputsScriptTemplateDef) { case (template, paging, ordering) => + interpreter.toRoutes(defs.getByInputsScriptTemplateDef) { case (template, paging, ordering) => service.getByInputsScriptTemplate(template, paging, ordering).adaptThrowable.value } } diff --git a/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/db/models/BlockExtension.scala b/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/db/models/BlockExtension.scala index ba98abe2e..f7cf748b4 100644 --- a/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/db/models/BlockExtension.scala +++ b/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/db/models/BlockExtension.scala @@ -20,12 +20,5 @@ object BlockExtension { implicit def schema: Schema[BlockExtension] = Schema.derived[BlockExtension] - //todo: test - implicit private def fieldsSchema: Schema[Json] = - Schema( - SchemaType.SOpenProduct( - SchemaType.SObjectInfo("Fields"), - Schema.schemaForString - )(_ => Map.empty) - ) + implicit private def fieldsSchema: Schema[Json] = Schema.string[Json] } diff --git a/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/protocol/ergoInstances.scala b/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/protocol/ergoInstances.scala index 03e6e6ccf..263b0509f 100644 --- a/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/protocol/ergoInstances.scala +++ b/modules/explorer-core/src/main/scala/org/ergoplatform/explorer/protocol/ergoInstances.scala @@ -28,12 +28,7 @@ object ergoInstances { io.circe.Codec.from(ergoLikeTransactionDecoder, ergoLikeTransactionEncoder) implicit def schemaErgoLikeTx: Schema[ErgoLikeTransaction] = - Schema( - SchemaType.SProduct( - SchemaType.SObjectInfo("ErgoLikeTransaction"), - Iterable.empty[SProductField[ErgoLikeTransaction]].toList - ) - ) // todo: derive schema for the whole ErgoLikeTransaction. + Schema(SchemaType.SProduct(Iterable.empty[SProductField[ErgoLikeTransaction]].toList)) // todo: derive schema for the whole ErgoLikeTransaction. implicit def validatorErgoLikeTx: Validator[ErgoLikeTransaction] = Validator.min(1).contramap[ErgoLikeTransaction](_.inputs.size) diff --git a/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/db/repositories/TestOutputRepo.scala b/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/db/repositories/TestOutputRepo.scala index f403661d3..ea80b6531 100644 --- a/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/db/repositories/TestOutputRepo.scala +++ b/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/db/repositories/TestOutputRepo.scala @@ -37,12 +37,6 @@ final class TestOutputRepo[F[_]: Applicative](val source: Source) extends Output limit: Int ): fs2.Stream[F, ExtendedOutput] = ??? - override def streamUnspentByErgoTree( - ergoTree: HexString, - offset: Int, - limit: Int - ): fs2.Stream[F, ExtendedOutput] = ??? - def countAllByTokenId(tokenId: TokenId): F[Int] = ??? def countUnspentByTokenId(tokenId: TokenId): F[Int] = ??? @@ -130,6 +124,10 @@ final class TestOutputRepo[F[_]: Applicative](val source: Source) extends Output def searchUnspentByAssetsUnion(templateHash: ErgoTreeTemplateHash, assets: List[TokenId], offset: Int, limit: Int): fs2.Stream[F, Output] = ??? def countUnspentByAssetsUnion(templateHash: ErgoTreeTemplateHash, assets: List[TokenId]): F[Int] = ??? + + /** Get unspent main-chain outputs with a given `ergoTree` from persistence. + */ + def streamUnspentByErgoTree(ergoTree: HexString, offset: Int, limit: Int, ord: OrderingString): fs2.Stream[F, ExtendedOutput] = ??? } object TestOutputRepo { diff --git a/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/services/ErgoNetworkSpec.scala b/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/services/ErgoNetworkSpec.scala index 28b934519..c38761309 100644 --- a/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/services/ErgoNetworkSpec.scala +++ b/modules/explorer-core/src/test/scala/org/ergoplatform/explorer/services/ErgoNetworkSpec.scala @@ -10,6 +10,7 @@ import io.circe.syntax._ import io.estatico.newtype.ops._ import org.ergoplatform.explorer.UrlString import org.ergoplatform.explorer.settings.NetworkSettings +import org.http4s.Uri.Path.Segment import org.http4s.client.Client import org.http4s.{Request, Response} import org.scalacheck.Gen.Parameters @@ -24,7 +25,7 @@ class ErgoNetworkSpec extends PropSpec with Matchers { def createFakeClient[F[_]: Sync](bestNode: Ref[F, (UrlString, Int)])(implicit F: BracketThrow[F] ) = Client[F] { - case Request(_, uri, _, _, _, _) if uri.path.contains("info") => + case Request(_, uri, _, _, _, _) if uri.path.segments.contains(Segment("info")) => Resource.eval(bestNode.get).flatMap { case (node, height) => Resource.pure( Response[F]( diff --git a/project/versions.scala b/project/versions.scala index 7e9af08b2..b40a64351 100644 --- a/project/versions.scala +++ b/project/versions.scala @@ -4,7 +4,7 @@ object versions { val ErgoContractsVersion = "1.0.0" val Http4sVersion = "0.21.21" - val TapirVersion = "0.18.0-M4" + val TapirVersion = "0.18.3" val CirceVersion = "0.12.3" val CirceMagniliaDerivationVersion = "0.4.0" val CatsVersion = "2.4.2"