2025-10-16 16:08:28 +01:00
|
|
|
|
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
|
|
|
|
|
|
//
|
|
|
|
|
|
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
|
|
|
|
|
// You may obtain a copy of the licence at:
|
|
|
|
|
|
//
|
|
|
|
|
|
// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl
|
|
|
|
|
|
//
|
|
|
|
|
|
// The EUPL is a copyleft licence that is compatible with the MIT/X11
|
|
|
|
|
|
// licence used by the original projects; but maintains OSS status,
|
|
|
|
|
|
// where regional copyright law requires ownership to dictate licence terms.
|
|
|
|
|
|
//
|
|
|
|
|
|
// SPDX‑License‑Identifier: EUPL-1.2
|
|
|
|
|
|
//
|
2025-10-10 23:18:02 +01:00
|
|
|
|
|
2025-10-16 16:08:28 +01:00
|
|
|
|
#ifndef BlockByIdController_hpp
|
|
|
|
|
|
#define BlockByIdController_hpp
|
|
|
|
|
|
|
2025-10-16 17:17:18 +01:00
|
|
|
|
#include "modal/block/details.hpp"
|
|
|
|
|
|
#include "modal/transaction/details.hpp"
|
|
|
|
|
|
#include "controller/ApiCoreInfo.hpp"
|
2025-10-10 23:18:02 +01:00
|
|
|
|
|
|
|
|
|
|
#include "oatpp/web/server/api/ApiController.hpp"
|
|
|
|
|
|
#include "oatpp/core/macro/codegen.hpp"
|
|
|
|
|
|
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"
|
|
|
|
|
|
|
2025-10-11 23:35:07 +01:00
|
|
|
|
#include "rpc/core_rpc_server_commands_defs.h"
|
|
|
|
|
|
|
2025-10-10 23:18:02 +01:00
|
|
|
|
#include OATPP_CODEGEN_BEGIN(ApiController)
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-10-16 16:08:28 +01:00
|
|
|
|
* Block-by-ID Controller
|
2025-10-10 23:18:02 +01:00
|
|
|
|
*/
|
2025-10-16 16:08:28 +01:00
|
|
|
|
class BlockByIdController : public oatpp::web::server::api::ApiController {
|
2025-10-11 23:35:07 +01:00
|
|
|
|
private:
|
2025-10-16 17:17:18 +01:00
|
|
|
|
OATPP_COMPONENT(std::shared_ptr<ApiCoreInfo>, m_core_info);
|
2025-10-10 23:18:02 +01:00
|
|
|
|
public:
|
2025-10-16 16:08:28 +01:00
|
|
|
|
explicit BlockByIdController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
2025-10-10 23:18:02 +01:00
|
|
|
|
: oatpp::web::server::api::ApiController(objectMapper)
|
|
|
|
|
|
{}
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
2025-10-16 16:08:28 +01:00
|
|
|
|
ENDPOINT_INFO(getBlockById) {
|
|
|
|
|
|
info->summary = "Get a block by its ID (height)";
|
2025-10-10 23:18:02 +01:00
|
|
|
|
info->addTag("Block");
|
2025-10-16 16:08:28 +01:00
|
|
|
|
info->pathParams["id"].description = "The ID (height) of the block to retrieve";
|
2025-10-16 17:17:18 +01:00
|
|
|
|
info->addResponse<Object<BlockDetailsModel>>(Status::CODE_200, "application/json");
|
2025-10-11 23:35:07 +01:00
|
|
|
|
info->addResponse(Status::CODE_404, "text/plain");
|
2025-10-10 23:18:02 +01:00
|
|
|
|
}
|
2025-10-16 16:08:28 +01:00
|
|
|
|
ENDPOINT("GET", "/block/id/{id}", getBlockById, PATH(UInt64, id)) {
|
2025-10-10 23:18:02 +01:00
|
|
|
|
|
2025-10-11 23:35:07 +01:00
|
|
|
|
currency::block_rpc_extended_info rpc_details;
|
2025-10-16 16:08:28 +01:00
|
|
|
|
if (!m_core_info->getCore().get_blockchain_storage().get_main_block_rpc_details(id, rpc_details)) {
|
2025-10-11 23:35:07 +01:00
|
|
|
|
return createResponse(Status::CODE_404, "Block not found");
|
|
|
|
|
|
}
|
2025-10-16 16:08:28 +01:00
|
|
|
|
|
2025-10-16 17:17:18 +01:00
|
|
|
|
auto blockDetails = BlockDetailsModel::createShared();
|
2025-10-16 16:08:28 +01:00
|
|
|
|
|
2025-10-11 23:35:07 +01:00
|
|
|
|
blockDetails->id = rpc_details.id;
|
|
|
|
|
|
blockDetails->height = rpc_details.height;
|
|
|
|
|
|
blockDetails->timestamp = rpc_details.timestamp;
|
|
|
|
|
|
blockDetails->actual_timestamp = rpc_details.actual_timestamp;
|
|
|
|
|
|
blockDetails->difficulty = rpc_details.difficulty;
|
|
|
|
|
|
blockDetails->prev_id = rpc_details.prev_id;
|
|
|
|
|
|
blockDetails->is_orphan = rpc_details.is_orphan;
|
|
|
|
|
|
blockDetails->base_reward = rpc_details.base_reward;
|
|
|
|
|
|
blockDetails->summary_reward = rpc_details.summary_reward;
|
|
|
|
|
|
blockDetails->total_fee = rpc_details.total_fee;
|
|
|
|
|
|
blockDetails->penalty = rpc_details.penalty;
|
|
|
|
|
|
blockDetails->already_generated_coins = rpc_details.already_generated_coins;
|
|
|
|
|
|
blockDetails->block_cumulative_size = rpc_details.block_cumulative_size;
|
|
|
|
|
|
blockDetails->total_txs_size = rpc_details.total_txs_size;
|
|
|
|
|
|
blockDetails->cumulative_diff_adjusted = rpc_details.cumulative_diff_adjusted;
|
|
|
|
|
|
blockDetails->cumulative_diff_precise = rpc_details.cumulative_diff_precise;
|
|
|
|
|
|
blockDetails->blob = rpc_details.blob;
|
|
|
|
|
|
blockDetails->miner_text_info = rpc_details.miner_text_info;
|
|
|
|
|
|
blockDetails->type = rpc_details.type;
|
2025-10-10 23:18:02 +01:00
|
|
|
|
|
2025-10-16 17:17:18 +01:00
|
|
|
|
auto tx_details_list = oatpp::List<oatpp::Object<TransactionDetailsModel>>::createShared();
|
2025-10-11 23:35:07 +01:00
|
|
|
|
for(const auto& tx_rpc_info : rpc_details.transactions_details) {
|
2025-10-16 17:17:18 +01:00
|
|
|
|
auto tx_model = TransactionDetailsModel::createShared();
|
|
|
|
|
|
tx_model->id = tx_rpc_info.id;
|
|
|
|
|
|
tx_model->fee = tx_rpc_info.fee;
|
|
|
|
|
|
tx_model->amount = tx_rpc_info.amount;
|
|
|
|
|
|
tx_model->blob_size = tx_rpc_info.blob_size;
|
|
|
|
|
|
tx_model->keeper_block = tx_rpc_info.keeper_block;
|
|
|
|
|
|
tx_model->timestamp = tx_rpc_info.timestamp;
|
|
|
|
|
|
tx_details_list->push_back(tx_model);
|
2025-10-11 23:35:07 +01:00
|
|
|
|
}
|
|
|
|
|
|
blockDetails->transactions_details = tx_details_list;
|
2025-10-10 23:18:02 +01:00
|
|
|
|
|
|
|
|
|
|
return createDtoResponse(Status::CODE_200, blockDetails);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#include OATPP_CODEGEN_END(ApiController)
|
|
|
|
|
|
|
2025-10-16 16:08:28 +01:00
|
|
|
|
#endif /* BlockByIdController_hpp */
|