From 65e0a73eeca0ea1bac6ec3f5582284d3e96f6a30 Mon Sep 17 00:00:00 2001 From: TheDude Date: Tue, 1 Nov 2022 12:06:51 +0000 Subject: [PATCH] Added an endpoint to get a list of raw transactions by ids. Only supports stored raw transactions. Closes #166 --- .../Controllers/QueryController.cs | 26 ++++++++++++++++++- .../Storage/IStorage.cs | 2 ++ .../Storage/Mongo/MongoData.cs | 12 +++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Blockcore.Indexer.Core/Controllers/QueryController.cs b/src/Blockcore.Indexer.Core/Controllers/QueryController.cs index 9ebdcecf..5e71f5e8 100644 --- a/src/Blockcore.Indexer.Core/Controllers/QueryController.cs +++ b/src/Blockcore.Indexer.Core/Controllers/QueryController.cs @@ -1,7 +1,11 @@ using System; +using System.Collections; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; using System.Threading.Tasks; using Blockcore.Indexer.Core.Paging; +using Blockcore.Indexer.Core.Settings; using Blockcore.Indexer.Core.Storage; using Blockcore.Indexer.Core.Storage.Types; using Microsoft.AspNetCore.Mvc; @@ -17,14 +21,16 @@ public class QueryController : Controller { private readonly IPagingHelper paging; private readonly IStorage storage; + protected readonly IndexerSettings configuration; /// /// Initializes a new instance of the class. /// - public QueryController(IPagingHelper paging, IStorage storage) + public QueryController(IPagingHelper paging, IStorage storage, IndexerSettings configuration) { this.paging = paging; this.storage = storage; + this.configuration = configuration; } /// @@ -118,6 +124,24 @@ public IActionResult GetTransactionHex(string transactionId) return OkItem(storage.GetRawTransaction(transactionId)); } + /// + /// Get a list of transactions in hex format based on the transaction IDs (hash). + /// + /// + /// + [HttpPost] + [Route("transactions/hex")] + public IActionResult GetTransactionsHex(IEnumerable transactionIds) + { + if (!configuration.StoreRawTransactions) + return Forbid(); + + if (transactionIds.Count() > 20) + return BadRequest(); + + return OkItem(storage.GetRawTransactions(transactionIds)); + } + /// /// Returns blocks based on the offset and limit. The blocks are sorted from from lowest to highest index. You can use the "link" HTTP header to get dynamic paging links. diff --git a/src/Blockcore.Indexer.Core/Storage/IStorage.cs b/src/Blockcore.Indexer.Core/Storage/IStorage.cs index ed23c990..a17a19cc 100644 --- a/src/Blockcore.Indexer.Core/Storage/IStorage.cs +++ b/src/Blockcore.Indexer.Core/Storage/IStorage.cs @@ -22,6 +22,8 @@ public interface IStorage string GetRawTransaction(string transactionId); + IEnumerable GetRawTransactions(IEnumerable transactionId); + QueryTransaction GetTransaction(string transactionId); QueryResult TransactionsByBlock(string hash, int offset, int limit); diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs index f80b49fe..a8730564 100644 --- a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs +++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs @@ -370,6 +370,18 @@ public string GetRawTransaction(string transactionId) return null; } + public IEnumerable GetRawTransactions(IEnumerable transactionId) + { + FilterDefinition filter = Builders.Filter.In(info => info.TransactionId, transactionId); + + var transactions = mongoDb.TransactionTable.Find(filter) + .ToList(); + + return transactions.Any() + ? transactions.Select(t => Encoders.Hex.EncodeData(t.RawTransaction)) + : null; + } + public string GetRawBlock(string blockHash) { IBlockchainClient client = clientFactory.Create(syncConnection);