forked from lthn/blockchain
adds Block-by-Hash and Block-by-ID controllers with enhanced block retrieval functionality
This commit is contained in:
parent
a4fe9ee9d7
commit
c6e98b6aa9
18 changed files with 493 additions and 83 deletions
2
.idea/cmake.xml
generated
2
.idea/cmake.xml
generated
|
|
@ -2,7 +2,7 @@
|
|||
<project version="4">
|
||||
<component name="CMakeSharedSettings">
|
||||
<configurations>
|
||||
<configuration PROFILE_NAME="Debug" ENABLED="true" GENERATION_DIR="build/release" CONFIG_NAME="Release" GENERATION_OPTIONS="--preset testnet" BUILD_OPTIONS="--preset testnet" NO_GENERATOR="true" />
|
||||
<configuration PROFILE_NAME="Debug" ENABLED="true" GENERATION_DIR="build/release" CONFIG_NAME="Debug" GENERATION_OPTIONS="--preset testnet" BUILD_OPTIONS="--preset testnet --parallel 30" NO_GENERATOR="true" />
|
||||
</configurations>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/copyright/LTHN.xml
generated
Normal file
6
.idea/copyright/LTHN.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<component name="CopyrightManager">
|
||||
<copyright>
|
||||
<option name="notice" value="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 " />
|
||||
<option name="myName" value="LTHN" />
|
||||
</copyright>
|
||||
</component>
|
||||
5
.idea/copyright/profiles_settings.xml
generated
5
.idea/copyright/profiles_settings.xml
generated
|
|
@ -1,7 +1,8 @@
|
|||
<component name="CopyrightManager">
|
||||
<settings default="Lethean">
|
||||
<settings default="LTHN">
|
||||
<module2copyright>
|
||||
<element module="All" copyright="Lethean" />
|
||||
<element module="apiserver" copyright="LTHN" />
|
||||
<element module="Project Files" copyright="Lethean" />
|
||||
</module2copyright>
|
||||
</settings>
|
||||
</component>
|
||||
96
.idea/editor.xml
generated
96
.idea/editor.xml
generated
|
|
@ -244,5 +244,101 @@
|
|||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||
</component>
|
||||
</project>
|
||||
3
.idea/scopes/apiserver.xml
generated
Normal file
3
.idea/scopes/apiserver.xml
generated
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<component name="DependencyValidationManager">
|
||||
<scope name="apiserver" pattern="file[blockchain]:src/api//*" />
|
||||
</component>
|
||||
|
|
@ -1,7 +1,23 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#include "ApiServer.hpp"
|
||||
#include "controller/ApiCoreInfoComponent.hpp"
|
||||
#include "controller/InfoController.hpp"
|
||||
#include "controller/BlockController.hpp"
|
||||
#include "controller/path/info.hpp"
|
||||
#include "controller/path/block.hpp"
|
||||
#include "controller/path/block/hash.hpp"
|
||||
#include "controller/path/block/id.hpp"
|
||||
|
||||
#include "oatpp/network/Server.hpp"
|
||||
#include "oatpp-swagger/Controller.hpp"
|
||||
|
|
@ -49,15 +65,24 @@ void ApiServer::run() {
|
|||
|
||||
auto docEndpoints = std::make_shared<oatpp::web::server::api::Endpoints>();
|
||||
|
||||
/* Create and register controllers */
|
||||
auto infoController = std::make_shared<InfoController>();
|
||||
docEndpoints->append(infoController->getEndpoints());
|
||||
router->addController(infoController);
|
||||
|
||||
auto blockController = std::make_shared<BlockController>();
|
||||
docEndpoints->append(blockController->getEndpoints());
|
||||
|
||||
router->addController(infoController);
|
||||
router->addController(blockController);
|
||||
|
||||
auto blockByHashController = std::make_shared<BlockByHashController>();
|
||||
docEndpoints->append(blockByHashController->getEndpoints());
|
||||
router->addController(blockByHashController);
|
||||
|
||||
auto blockByIdController = std::make_shared<BlockByIdController>();
|
||||
docEndpoints->append(blockByIdController->getEndpoints());
|
||||
router->addController(blockByIdController);
|
||||
|
||||
|
||||
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::swagger::DocumentInfo>, swaggerDocumentInfo)
|
||||
([]
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#ifndef ApiServer_hpp
|
||||
#define ApiServer_hpp
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#ifndef ApiCoreInfoComponent_hpp
|
||||
#define ApiCoreInfoComponent_hpp
|
||||
|
||||
|
|
|
|||
|
|
@ -1,43 +0,0 @@
|
|||
// Copyright (c) 2014-2018 Zano Project
|
||||
// Copyright (c) 2014-2018 The Louisdor Project
|
||||
// Copyright (c) 2012-2013 The Boolberry developers
|
||||
// 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; the MIT terms are therefore
|
||||
// considered “grandfathered” under the EUPL for this code.
|
||||
//
|
||||
// SPDX‑License‑Identifier: EUPL-1.2
|
||||
//
|
||||
|
||||
#ifndef InfoController_hpp
|
||||
#define InfoController_hpp
|
||||
|
||||
#include "oatpp/web/server/api/ApiController.hpp"
|
||||
#include "oatpp/core/macro/codegen.hpp"
|
||||
#include "version.h"
|
||||
#include "dto/VersionDto.hpp"
|
||||
|
||||
#include OATPP_CODEGEN_BEGIN(ApiController)
|
||||
|
||||
/**
|
||||
* Info Controller
|
||||
*/
|
||||
class InfoController : public oatpp::web::server::api::ApiController {
|
||||
public:
|
||||
InfoController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
||||
: oatpp::web::server::api::ApiController(objectMapper)
|
||||
{}
|
||||
public:
|
||||
|
||||
#include "partials/info/version.hpp"
|
||||
};
|
||||
|
||||
#include OATPP_CODEGEN_END(ApiController)
|
||||
|
||||
#endif /* InfoController_hpp */
|
||||
122
src/api/controller/path/block.hpp
Normal file
122
src/api/controller/path/block.hpp
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#ifndef BlockController_hpp
|
||||
#define BlockController_hpp
|
||||
|
||||
#include "dto/BlockDetailsDto.hpp"
|
||||
#include "dto/TransactionDetailsDto.hpp"
|
||||
#include "controller/ApiCoreInfoComponent.hpp"
|
||||
|
||||
#include "oatpp/web/server/api/ApiController.hpp"
|
||||
#include "oatpp/core/macro/codegen.hpp"
|
||||
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"
|
||||
|
||||
#include "rpc/core_rpc_server_commands_defs.h"
|
||||
#include <string> // For std::string and std::stoull
|
||||
|
||||
#include OATPP_CODEGEN_BEGIN(ApiController)
|
||||
|
||||
/**
|
||||
* Block Controller
|
||||
* Acts as a proxy to fetch blocks by hash or by height (ID).
|
||||
*/
|
||||
class BlockController : public oatpp::web::server::api::ApiController {
|
||||
private:
|
||||
OATPP_COMPONENT(std::shared_ptr<ApiCoreInfoComponent>, m_core_info);
|
||||
public:
|
||||
explicit BlockController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
||||
: oatpp::web::server::api::ApiController(objectMapper)
|
||||
{}
|
||||
public:
|
||||
|
||||
ENDPOINT_INFO(getBlock) {
|
||||
info->summary = "Get a block by its hash or height (ID)";
|
||||
info->addTag("Block");
|
||||
info->pathParams["identifier"].description = "The hash (hex string) or height (integer) of the block to retrieve.";
|
||||
info->addResponse<Object<BlockDetailsDto>>(Status::CODE_200, "application/json");
|
||||
info->addResponse(Status::CODE_404, "text/plain");
|
||||
info->addResponse(Status::CODE_400, "text/plain");
|
||||
}
|
||||
ENDPOINT("GET", "/block/{identifier}", getBlock, PATH(String, identifier)) {
|
||||
|
||||
currency::block_rpc_extended_info rpc_details;
|
||||
bool block_found = false;
|
||||
|
||||
// Check if the identifier consists only of digits
|
||||
if (identifier->find_first_not_of("0123456789") == std::string::npos) {
|
||||
// It's a numeric ID (height)
|
||||
try {
|
||||
uint64_t height = std::stoull(identifier->c_str());
|
||||
block_found = m_core_info->getCore().get_blockchain_storage().get_main_block_rpc_details(height, rpc_details);
|
||||
} catch (const std::exception& e) {
|
||||
return createResponse(Status::CODE_400, "Invalid block height format");
|
||||
}
|
||||
} else {
|
||||
// It's a hash
|
||||
crypto::hash block_hash{};
|
||||
if (!epee::string_tools::hex_to_pod(*identifier, block_hash)) {
|
||||
return createResponse(Status::CODE_400, "Invalid block hash format");
|
||||
}
|
||||
block_found = m_core_info->getCore().get_blockchain_storage().get_main_block_rpc_details(block_hash, rpc_details);
|
||||
}
|
||||
|
||||
if (!block_found) {
|
||||
return createResponse(Status::CODE_404, "Block not found");
|
||||
}
|
||||
|
||||
// Common logic to populate the DTO
|
||||
auto blockDetails = BlockDetailsDto::createShared();
|
||||
|
||||
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;
|
||||
|
||||
auto tx_details_list = oatpp::List<oatpp::Object<TransactionDetailsDto>>::createShared();
|
||||
for(const auto& tx_rpc_info : rpc_details.transactions_details) {
|
||||
auto tx_dto = TransactionDetailsDto::createShared();
|
||||
tx_dto->id = tx_rpc_info.id;
|
||||
tx_dto->fee = tx_rpc_info.fee;
|
||||
tx_dto->amount = tx_rpc_info.amount;
|
||||
tx_dto->blob_size = tx_rpc_info.blob_size;
|
||||
tx_dto->keeper_block = tx_rpc_info.keeper_block;
|
||||
tx_dto->timestamp = tx_rpc_info.timestamp;
|
||||
tx_details_list->push_back(tx_dto);
|
||||
}
|
||||
blockDetails->transactions_details = tx_details_list;
|
||||
|
||||
return createDtoResponse(Status::CODE_200, blockDetails);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#include OATPP_CODEGEN_END(ApiController)
|
||||
|
||||
#endif /* BlockController_hpp */
|
||||
|
|
@ -1,9 +1,23 @@
|
|||
#ifndef BlockController_hpp
|
||||
#define BlockController_hpp
|
||||
// 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
|
||||
//
|
||||
|
||||
#include "../dto/BlockDetailsDto.hpp"
|
||||
#include "../dto/TransactionDetailsDto.hpp"
|
||||
#include "ApiCoreInfoComponent.hpp"
|
||||
#ifndef BlockByHashController_hpp
|
||||
#define BlockByHashController_hpp
|
||||
|
||||
#include "dto/BlockDetailsDto.hpp"
|
||||
#include "dto/TransactionDetailsDto.hpp"
|
||||
#include "controller/ApiCoreInfoComponent.hpp"
|
||||
|
||||
#include "oatpp/web/server/api/ApiController.hpp"
|
||||
#include "oatpp/core/macro/codegen.hpp"
|
||||
|
|
@ -14,13 +28,13 @@
|
|||
#include OATPP_CODEGEN_BEGIN(ApiController)
|
||||
|
||||
/**
|
||||
* Block Controller
|
||||
* Block-by-Hash Controller
|
||||
*/
|
||||
class BlockController : public oatpp::web::server::api::ApiController {
|
||||
class BlockByHashController : public oatpp::web::server::api::ApiController {
|
||||
private:
|
||||
OATPP_COMPONENT(std::shared_ptr<ApiCoreInfoComponent>, m_core_info);
|
||||
public:
|
||||
BlockController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
||||
explicit BlockByHashController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
||||
: oatpp::web::server::api::ApiController(objectMapper)
|
||||
{}
|
||||
public:
|
||||
|
|
@ -34,8 +48,9 @@ public:
|
|||
info->addResponse(Status::CODE_400, "text/plain");
|
||||
}
|
||||
ENDPOINT("GET", "/block/{hash}", getBlockByHash, PATH(String, hash)) {
|
||||
|
||||
crypto::hash block_hash;
|
||||
|
||||
crypto::hash block_hash{};
|
||||
|
||||
if (!epee::string_tools::hex_to_pod(*hash, block_hash)) {
|
||||
return createResponse(Status::CODE_400, "Invalid block hash format");
|
||||
}
|
||||
|
|
@ -44,9 +59,9 @@ public:
|
|||
if (!m_core_info->getCore().get_blockchain_storage().get_main_block_rpc_details(block_hash, rpc_details)) {
|
||||
return createResponse(Status::CODE_404, "Block not found");
|
||||
}
|
||||
|
||||
|
||||
auto blockDetails = BlockDetailsDto::createShared();
|
||||
|
||||
|
||||
blockDetails->id = rpc_details.id;
|
||||
blockDetails->height = rpc_details.height;
|
||||
blockDetails->timestamp = rpc_details.timestamp;
|
||||
|
|
@ -87,4 +102,4 @@ public:
|
|||
|
||||
#include OATPP_CODEGEN_END(ApiController)
|
||||
|
||||
#endif /* BlockController_hpp */
|
||||
#endif /* BlockByHashController_hpp */
|
||||
98
src/api/controller/path/block/id.hpp
Normal file
98
src/api/controller/path/block/id.hpp
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#ifndef BlockByIdController_hpp
|
||||
#define BlockByIdController_hpp
|
||||
|
||||
#include "dto/BlockDetailsDto.hpp"
|
||||
#include "dto/TransactionDetailsDto.hpp"
|
||||
#include "controller/ApiCoreInfoComponent.hpp"
|
||||
|
||||
#include "oatpp/web/server/api/ApiController.hpp"
|
||||
#include "oatpp/core/macro/codegen.hpp"
|
||||
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"
|
||||
|
||||
#include "rpc/core_rpc_server_commands_defs.h"
|
||||
|
||||
#include OATPP_CODEGEN_BEGIN(ApiController)
|
||||
|
||||
/**
|
||||
* Block-by-ID Controller
|
||||
*/
|
||||
class BlockByIdController : public oatpp::web::server::api::ApiController {
|
||||
private:
|
||||
OATPP_COMPONENT(std::shared_ptr<ApiCoreInfoComponent>, m_core_info);
|
||||
public:
|
||||
explicit BlockByIdController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
||||
: oatpp::web::server::api::ApiController(objectMapper)
|
||||
{}
|
||||
public:
|
||||
|
||||
ENDPOINT_INFO(getBlockById) {
|
||||
info->summary = "Get a block by its ID (height)";
|
||||
info->addTag("Block");
|
||||
info->pathParams["id"].description = "The ID (height) of the block to retrieve";
|
||||
info->addResponse<Object<BlockDetailsDto>>(Status::CODE_200, "application/json");
|
||||
info->addResponse(Status::CODE_404, "text/plain");
|
||||
}
|
||||
ENDPOINT("GET", "/block/id/{id}", getBlockById, PATH(UInt64, id)) {
|
||||
|
||||
currency::block_rpc_extended_info rpc_details;
|
||||
if (!m_core_info->getCore().get_blockchain_storage().get_main_block_rpc_details(id, rpc_details)) {
|
||||
return createResponse(Status::CODE_404, "Block not found");
|
||||
}
|
||||
|
||||
auto blockDetails = BlockDetailsDto::createShared();
|
||||
|
||||
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;
|
||||
|
||||
auto tx_details_list = oatpp::List<oatpp::Object<TransactionDetailsDto>>::createShared();
|
||||
for(const auto& tx_rpc_info : rpc_details.transactions_details) {
|
||||
auto tx_dto = TransactionDetailsDto::createShared();
|
||||
tx_dto->id = tx_rpc_info.id;
|
||||
tx_dto->fee = tx_rpc_info.fee;
|
||||
tx_dto->amount = tx_rpc_info.amount;
|
||||
tx_dto->blob_size = tx_rpc_info.blob_size;
|
||||
tx_dto->keeper_block = tx_rpc_info.keeper_block;
|
||||
tx_dto->timestamp = tx_rpc_info.timestamp;
|
||||
tx_details_list->push_back(tx_dto);
|
||||
}
|
||||
blockDetails->transactions_details = tx_details_list;
|
||||
|
||||
return createDtoResponse(Status::CODE_200, blockDetails);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#include OATPP_CODEGEN_END(ApiController)
|
||||
|
||||
#endif /* BlockByIdController_hpp */
|
||||
57
src/api/controller/path/info.hpp
Normal file
57
src/api/controller/path/info.hpp
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#ifndef InfoController_hpp
|
||||
#define InfoController_hpp
|
||||
|
||||
#include "oatpp/web/server/api/ApiController.hpp"
|
||||
#include "oatpp/core/macro/codegen.hpp"
|
||||
#include "version.h"
|
||||
#include "dto/VersionDto.hpp"
|
||||
|
||||
#include OATPP_CODEGEN_BEGIN(ApiController)
|
||||
|
||||
/**
|
||||
* Info Controller
|
||||
*/
|
||||
class InfoController : public oatpp::web::server::api::ApiController {
|
||||
public:
|
||||
explicit InfoController(OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper))
|
||||
: oatpp::web::server::api::ApiController(objectMapper)
|
||||
{}
|
||||
public:
|
||||
|
||||
ENDPOINT_INFO(version)
|
||||
{
|
||||
info->addTag("Info");
|
||||
info->summary = "Get API version";
|
||||
info->description = "Returns the current version of the API.";
|
||||
info->addResponse<Object<VersionDto>>(Status::CODE_200, "application/json");
|
||||
}
|
||||
ENDPOINT("GET", "/info/version", version)
|
||||
{
|
||||
auto dto = VersionDto::createShared();
|
||||
dto->version = PROJECT_VERSION;
|
||||
dto->version_long = PROJECT_VERSION_LONG;
|
||||
dto->major = PROJECT_MAJOR_VERSION;
|
||||
dto->minor = PROJECT_MINOR_VERSION;
|
||||
dto->revision = PROJECT_REVISION;
|
||||
return createDtoResponse(Status::CODE_200, dto);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#include OATPP_CODEGEN_END(ApiController)
|
||||
|
||||
#endif /* InfoController_hpp */
|
||||
|
|
@ -1,6 +1,3 @@
|
|||
// Copyright (c) 2014-2018 Zano Project
|
||||
// Copyright (c) 2014-2018 The Louisdor Project
|
||||
// Copyright (c) 2012-2013 The Boolberry developers
|
||||
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
|
||||
//
|
||||
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
||||
|
|
@ -9,8 +6,8 @@
|
|||
// 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; the MIT terms are therefore
|
||||
// considered “grandfathered” under the EUPL for this code.
|
||||
// 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
|
||||
//
|
||||
|
|
@ -1,6 +1,3 @@
|
|||
// Copyright (c) 2014-2018 Zano Project
|
||||
// Copyright (c) 2014-2018 The Louisdor Project
|
||||
// Copyright (c) 2012-2013 The Boolberry developers
|
||||
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
|
||||
//
|
||||
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
||||
|
|
@ -9,8 +6,8 @@
|
|||
// 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; the MIT terms are therefore
|
||||
// considered “grandfathered” under the EUPL for this code.
|
||||
// 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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
// Copyright (c) 2014-2018 Zano Project
|
||||
// Copyright (c) 2014-2018 The Louisdor Project
|
||||
// Copyright (c) 2012-2013 The Boolberry developers
|
||||
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
|
||||
//
|
||||
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
||||
|
|
@ -9,8 +6,8 @@
|
|||
// 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; the MIT terms are therefore
|
||||
// considered “grandfathered” under the EUPL for this code.
|
||||
// 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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
// Copyright (c) 2014-2018 Zano Project
|
||||
// Copyright (c) 2014-2018 The Louisdor Project
|
||||
// Copyright (c) 2012-2013 The Boolberry developers
|
||||
// Copyright (c) 2017-2025 Lethean (https://lt.hn)
|
||||
//
|
||||
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
||||
|
|
@ -9,8 +6,8 @@
|
|||
// 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; the MIT terms are therefore
|
||||
// considered “grandfathered” under the EUPL for this code.
|
||||
// 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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,3 +1,17 @@
|
|||
// 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
|
||||
//
|
||||
|
||||
#include "ApiServer.hpp"
|
||||
#include "oatpp/core/base/Environment.hpp"
|
||||
#include "common/util.h"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue