query for consensus get topic info, currently a invalid account id error is happen

This commit is contained in:
Dario 2020-09-16 18:03:36 +02:00 committed by Ulf Gebhardt
parent a41ea1a6ae
commit e8612bbb49
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
17 changed files with 374 additions and 78 deletions

View File

@ -12,8 +12,13 @@
#include "../controller/Group.h"
#include "../SingletonManager/SessionManager.h"
#include "../ServerConfig.h"
#include "../lib/DataTypeConverter.h"
#include "../lib/Profiler.h"
#include "../lib/Success.h"
#include "Poco/Timespan.h"
#include "Poco/URI.h"
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#include "../ServerConfig.h"
@ -33,11 +38,12 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
if (_compressResponse) response.set("Content-Encoding", "gzip");
Poco::Net::HTMLForm form(request, request.stream());
#line 16 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 21 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
const char* pageName = "Topic";
auto user = mSession->getNewUser();
auto sm = SessionManager::getInstance();
Profiler hedera_time;
std::string name = "";
int auto_renew_account = 0;
@ -45,8 +51,48 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
int group_id = 0;
Poco::URI uri(request.getURI());
auto uri_query = uri.getQueryParameters();
std::string action = "";
Poco::AutoPtr<controller::HederaTopic> query_hedera_topic;
if(!form.empty()) {
// parsing get query params
if(uri_query.size() >= 2) {
if(uri_query[0].first == "action") {
action = uri_query[0].second;
}
if(uri_query[1].first == "topic_id") {
std::string topic_id_from_query;
int topic_id = 0;
topic_id_from_query = uri_query[1].second;
if(DataTypeConverter::strToInt(topic_id_from_query, topic_id) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting topic_id_from_query to int"));
} else {
auto hedera_topic = controller::HederaTopic::load(topic_id);
if(hedera_topic.isNull()) {
addError(new Error("Action", "hedera topic not found"));
} else {
query_hedera_topic = hedera_topic;
}
}
}
}
// actions
if(!query_hedera_topic.isNull())
{
if(action == "getTopicInfos")
{
hedera_time.reset();
if(query_hedera_topic->updateWithGetTopicInfos(user)) {
addNotification(new ParamSuccess("Hedera", "hedera get topic infos success in ", hedera_time.string()));
} else {
addError(new ParamError("Hedera", "hedera get topic infos failed in ", hedera_time.string()));
}
getErrors(query_hedera_topic);
}
}
else if(!form.empty())
{
name = form.get("topic-name", "");
auto auto_renew_account_string = form.get("topic-auto-renew-account", "0");
auto auto_renew_period_string = form.get("topic-auto-renew-period", "604800");
@ -162,7 +208,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
responseStream << "\t}\n";
responseStream << "\t\n";
responseStream << "</style>\n";
#line 87 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 133 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << "<div class=\"content-container info-container\">\n";
@ -187,7 +233,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
responseStream << "\t\t\t\t<div class=\"cell header-cell c5\">Aktionen</div>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t\t";
#line 109 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 155 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
for(auto it = hedera_topics.begin(); it != hedera_topics.end(); it++) {
auto hedera_topic_model = (*it)->getModel();
auto updateUrl = ServerConfig::g_serverPath + "/topic?action=getTopicInfos&topic_id=" + std::to_string(hedera_topic_model->getID());
@ -202,47 +248,47 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
responseStream << "\n";
responseStream << "\t\t\t\t<div class=\"row\">\n";
responseStream << "\t\t\t\t\t<div class=\"cell c2\">";
#line 122 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 168 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( (*it)->getTopicHederaId()->getModel()->toString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 123 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( hedera_topic_model->getName() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 124 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 170 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( model::table::HederaAccount::hederaNetworkTypeToString(renew_account_model->getNetworkType()) );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c4\">";
#line 125 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 171 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( renew_account_model->getBalanceString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c4\">";
#line 126 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 172 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( hedera_topic_model->getAutoRenewPeriodString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 127 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( hedera_topic_model->getGroupId() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3 ";
#line 128 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( timeout_color );
responseStream << "\">";
#line 128 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( hedera_topic_model->getCurrentTimeoutString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c2\">";
#line 129 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 175 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( hedera_topic_model->getSequenceNumber() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c3\">";
#line 130 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( hedera_topic_model->getUpdatedString() );
responseStream << "</div>\n";
responseStream << "\t\t\t\t\t<div class=\"cell c5\">\n";
responseStream << "\t\t\t\t\t\t<button class=\"form-button\" title=\"Query on Hedera, cost some fees\" onclick=\"window.location.href='";
#line 132 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( updateUrl );
responseStream << "'\" >\n";
responseStream << "\t\t\t\t\t\t\tget topic infos\n";
@ -250,7 +296,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
responseStream << "\t\t\t\t\t</div>\n";
responseStream << "\t\t\t\t</div>\n";
responseStream << "\t\t\t";
#line 137 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 183 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
} responseStream << "\n";
responseStream << "\t\t</div>\n";
responseStream << "\t</div>\n";
@ -259,72 +305,72 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
responseStream << "\t</div>\n";
responseStream << "\t<div class=\"center-form-form\">\n";
responseStream << "\t\t<form method=\"POST\" action=\"";
#line 144 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 190 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/topic\">\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"topic-name\">Name</label>\n";
responseStream << "\t\t\t<input type=\"text\" class=\"form-control\" id=\"topic-name\" name=\"topic-name\" value=\"";
#line 146 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 192 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( name );
responseStream << "\">\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"topic-auto-renew-account\">Auto Renew Hedera Account</label>\n";
responseStream << "\t\t\t<select name=\"topic-auto-renew-account\" id=\"topic-auto-renew-account\">\n";
responseStream << "\t\t\t\t";
#line 149 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 195 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
for(auto it = hedera_accounts.begin(); it != hedera_accounts.end(); it++) {
auto model = (*it)->getModel();
responseStream << "\n";
responseStream << "\t\t\t\t\t<option title=\"";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( model->toString() );
responseStream << "\" value=\"";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( model->getID() );
responseStream << "\" ";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
if(auto_renew_account == model->getID()) { responseStream << "selected=\"selected\"";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
} responseStream << ">";
#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( (*it)->toShortSelectOptionName() );
responseStream << "</option>\n";
responseStream << "\t\t\t\t";
#line 153 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 199 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t</select>\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"topic-auto-renew-period\">Auto Renew Period in seconds</label>\n";
responseStream << "\t\t\t<div><input class=\"form-control input-40\" id=\"topic-auto-renew-period\" value=\"";
#line 156 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 202 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( auto_renew_period );
responseStream << "\" type=\"number\" name=\"topic-auto-renew-period\"/><span style=\"margin-left:8px\" id=\"readable-auto-renew-period\"></span><div>\n";
responseStream << "\t\t\t<label class=\"form-label\" for=\"topic-group\">Group</label>\n";
responseStream << "\t\t\t<select class=\"form-control\" name=\"topic-group\" id=\"topic-group\">\t\t\t\n";
responseStream << "\t\t\t\t<option value=\"-1\">Keine Gruppe</option>\n";
responseStream << "\t\t\t\t";
#line 160 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 206 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
for(auto it = groups.begin(); it != groups.end(); it++) {
auto group_model = (*it)->getModel(); responseStream << "\n";
responseStream << "\t\t\t\t\t<option title=\"";
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( group_model->getDescription() );
responseStream << "\" value=\"";
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( group_model->getID() );
responseStream << "\" ";
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
if(group_id == group_model->getID()) { responseStream << "selected=\"selected\"";
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
} responseStream << ">";
#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( group_model->getName() );
responseStream << "</option>\n";
responseStream << "\t\t\t\t";
#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 209 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
} responseStream << "\n";
responseStream << "\t\t\t</select>\n";
responseStream << "\t\t\t\n";
responseStream << "\t\t\t<input class=\"center-form-submit form-button\" type=\"submit\" name=\"submit\" value=\"";
#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 212 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( gettext("Add Topic") );
responseStream << "\">\n";
responseStream << "\t\t</form>\n";
@ -355,7 +401,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::
// end include footer.cpsp
responseStream << "\n";
responseStream << "<script type=\"text/javascript\" src=\"";
#line 171 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
#line 217 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "/js/time_calculations.js\"></script>\n";
responseStream << "<script type=\"text/javascript\">\n";

View File

@ -63,7 +63,15 @@ HederaRequestReturn HederaRequest::request(model::hedera::Query* query, model::h
}
if (status.ok())
{
return HEDERA_REQUEST_RETURN_OK;
auto response_code = response->getResponseCode();
if (response_code) {
addError(new ParamError("Hedera Request", "precheck code: ", proto::ResponseCodeEnum_Name(response_code)));
return HEDERA_REQUEST_PRECHECK_ERROR;
}
else {
return HEDERA_REQUEST_RETURN_OK;
}
}
else if("" != queryName)
{

View File

@ -21,6 +21,7 @@ enum HederaRequestReturn
{
HEDERA_REQUEST_RETURN_OK,
HEDERA_REQUEST_RETURN_PARSE_ERROR,
HEDERA_REQUEST_PRECHECK_ERROR,
HEDERA_REQUEST_RETURN_ERROR,
HEDERA_REQUEST_UNKNOWN_TRANSACTION,
HEDERA_REQUEST_UNKNOWN_QUERY,

View File

@ -1,5 +1,7 @@
#include "HederaTopic.h"
//#include "../model/hedera/Transaction.h"
#include "HederaRequest.h"
#include "../lib/Success.h"
namespace controller {
HederaTopic::HederaTopic(model::table::HederaTopic* dbModel)
@ -37,6 +39,15 @@ namespace controller {
return resultVector;
}
Poco::AutoPtr<HederaTopic> HederaTopic::load(int id)
{
auto db = new model::table::HederaTopic;
if (1 == db->loadFromDB("id", id)) {
return new HederaTopic(db);
}
return nullptr;
}
Poco::AutoPtr<HederaId> HederaTopic::getTopicHederaId()
{
if (mTopicHederaId.isNull()) {
@ -57,4 +68,57 @@ namespace controller {
{
return 0;
}
bool HederaTopic::updateWithGetTopicInfos(Poco::AutoPtr<User> user)
{
auto payer_account = getAutoRenewAccount();
auto node_server = NodeServer::pick(payer_account->getModel()->getNetworkType(), getModel()->getGroupId());
auto query = model::hedera::Query::getTopicInfo(getTopicHederaId(), payer_account->getHederaId(), node_server);
query->setResponseType(proto::ANSWER_ONLY);
model::hedera::Response response;
HederaRequest request;
query->sign(payer_account->getCryptoKey()->getKeyPair(user));
if (HEDERA_REQUEST_RETURN_OK == request.request(query, &response)) {
auto queryCost = response.getQueryCost();
printf("query cost: %d\n", queryCost);
query->setTransactionFee(queryCost);
query->setResponseType(proto::ANSWER_ONLY);
query->sign(payer_account->getCryptoKey()->getKeyPair(user));
if (HEDERA_REQUEST_RETURN_OK == request.request(query, &response)) {
auto consensus_topic_info = response.getConsensusTopicInfo();
addNotification(new ParamSuccess("consensus get topic info", "memo: ", consensus_topic_info->getMemo()));
auto model = getModel();
model->setAutoRenewPeriod(consensus_topic_info->getAutoRenewPeriod().seconds());
model->setCurrentTimeout(consensus_topic_info->getExpirationTime());
model->setSequeceNumber(consensus_topic_info->getSequenceNumber());
std::string fieldNames[] = { "auto_renew_period", "current_timeout", "sequence_number" };
if (model->updateIntoDB(
fieldNames,
model->getAutoRenewPeriod(),
model->getCurrentTimeout(),
model->getSequenceNumber()
) != 1) {
addError(new Error("DB", "error saving changes in DB"));
getErrors(model);
return false;
}
return true;
}
else {
addError(new Error("Hedera Query", "Error by query for consensus get topic info"));
}
}
else {
addError(new Error("Hedera Query", "Error by getting costs for consensus get topic info"));
}
getErrors(&request);
return false;
}
}

View File

@ -17,7 +17,7 @@
namespace controller {
class HederaTopic : public TableControllerBase
class HederaTopic : public TableControllerBase, public NotificationList
{
public:
@ -25,13 +25,17 @@ namespace controller {
static Poco::AutoPtr<HederaTopic> create(const std::string& name, int autoRenewAccountId, int autoRenewPeriod, int groupId);
static std::vector<Poco::AutoPtr<HederaTopic>> listAll();
static Poco::AutoPtr<HederaTopic> load(int id);
//! \brief hedera call to create a hedera topic
Poco::UInt64 hederaCreateTopic();
bool updateWithGetTopicInfos(Poco::AutoPtr<User> user);
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }
Poco::AutoPtr<HederaId> getTopicHederaId();
Poco::AutoPtr<HederaAccount> getAutoRenewAccount();
inline Poco::AutoPtr<model::table::HederaTopic> getModel() { return _getModel<model::table::HederaTopic>(); }

View File

@ -73,6 +73,13 @@ namespace controller {
ORDER BY RAND()
LIMIT 1;
*/
NodeServerConnection NodeServer::pick(model::table::HederaNetworkType type, int group_id /*= 0*/)
{
model::table::NodeServerType node_server_type = model::table::NODE_SERVER_NONE;
if (model::table::HEDERA_MAINNET) node_server_type = model::table::NODE_SERVER_HEDERA_MAINNET_NODE;
else if (model::table::HEDERA_TESTNET) node_server_type = model::table::NODE_SERVER_HEDERA_TESTNET_NODE;
return pick(node_server_type, group_id);
}
NodeServerConnection NodeServer::pick(model::table::NodeServerType type, int group_id/* = 0*/)
{
auto cm = ConnectionManager::getInstance();

View File

@ -41,6 +41,7 @@ namespace controller {
static std::vector<Poco::AutoPtr<NodeServer>> load(model::table::NodeServerType type, int group_id = 0);
static std::vector<Poco::AutoPtr<NodeServer>> listAll();
// pick server randomly
static NodeServerConnection pick(model::table::HederaNetworkType type, int group_id = 0);
static NodeServerConnection pick(model::table::NodeServerType type, int group_id = 0);
inline bool deleteFromDB() { return mDBModel->deleteFromDB(); }

View File

@ -1,15 +0,0 @@
#include "ConsensusGetTopicInfoResponse.h"
namespace model {
namespace hedera {
ConsensusGetTopicInfoResponse::ConsensusGetTopicInfoResponse()
{
}
ConsensusGetTopicInfoResponse::~ConsensusGetTopicInfoResponse()
{
}
}
}

View File

@ -1,22 +0,0 @@
#ifndef __GRADIDO_LOGIN_SERVER_MODEL_HEDERA_CONSENSUS_GET_TOPIC_INFO_RESPONSE_H
#define __GRADIDO_LOGIN_SERVER_MODEL_HEDERA_CONSENSUS_GET_TOPIC_INFO_RESPONSE_H
#include "../proto/hedera/ConsensusGetTopicInfo.pb.h"
namespace model
{
namespace hedera
{
class ConsensusGetTopicInfoResponse
{
public:
ConsensusGetTopicInfoResponse();
~ConsensusGetTopicInfoResponse();
protected:
proto::ConsensusGetTopicInfoResponse mProto;
};
}
}
#endif //__GRADIDO_LOGIN_SERVER_MODEL_HEDERA_CONSENSUS_GET_TOPIC_INFO_RESPONSE_H

View File

@ -0,0 +1,26 @@
#include "ConsensusTopicInfo.h"
namespace model {
namespace hedera {
ConsensusTopicInfo::ConsensusTopicInfo(const proto::ConsensusTopicInfo& consensusTopicInfo)
: mProto(consensusTopicInfo)
{
int zahl = 1;
}
ConsensusTopicInfo::~ConsensusTopicInfo()
{
}
MemoryBin* ConsensusTopicInfo::getRunningHashCopy() const
{
auto mm = MemoryManager::getInstance();
auto running_hash = mProto.runninghash();
auto running_hash_bin = mm->getFreeMemory(running_hash.size());
memcpy(*running_hash_bin, running_hash.data(), running_hash.size());
return running_hash_bin;
}
}
}

View File

@ -0,0 +1,31 @@
#ifndef __GRADIDO_LOGIN_SERVER_MODEL_HEDERA_CONSENSUS_GET_TOPIC_INFO_RESPONSE_H
#define __GRADIDO_LOGIN_SERVER_MODEL_HEDERA_CONSENSUS_GET_TOPIC_INFO_RESPONSE_H
#include "../proto/hedera/ConsensusTopicInfo.pb.h"
#include "../SingletonManager/MemoryManager.h"
#include "../../lib/DataTypeConverter.h"
#include "Poco/DateTime.h"
namespace model
{
namespace hedera
{
class ConsensusTopicInfo
{
public:
ConsensusTopicInfo(const proto::ConsensusTopicInfo& consensusTopicInfo);
~ConsensusTopicInfo();
inline std::string getMemo() const { return mProto.memo(); }
MemoryBin* getRunningHashCopy() const;
Poco::UInt64 getSequenceNumber() const { return mProto.sequencenumber(); }
inline Poco::DateTime getExpirationTime() const { return DataTypeConverter::convertFromProtoTimestamp(mProto.expirationtime());}
inline Poco::Timespan getAutoRenewPeriod() const { return DataTypeConverter::convertFromProtoDuration(mProto.autorenewperiod()); }
protected:
proto::ConsensusTopicInfo mProto;
};
}
}
#endif //__GRADIDO_LOGIN_SERVER_MODEL_HEDERA_CONSENSUS_GET_TOPIC_INFO_RESPONSE_H

View File

@ -27,6 +27,8 @@ namespace model {
assert(!accountId.isNull() && accountId->getModel());
printf("[Query::getBalance] account id: %s\n", accountId->getModel()->toString().data());
auto query = new Query;
auto get_account_balance = query->mQueryProto.mutable_cryptogetaccountbalance();
accountId->copyToProtoAccountId(get_account_balance->mutable_accountid());
@ -53,6 +55,9 @@ namespace model {
assert(!topicId.isNull() && topicId->getModel());
assert(!payerAccountId.isNull() && payerAccountId->getModel());
printf("[Query::getBalance] topic id: %s\n", topicId->getModel()->toString().data());
printf("[Query::getBalance] payer account id: %s\n", payerAccountId->getModel()->toString().data());
auto query = new Query;
auto get_topic_info = query->mQueryProto.mutable_consensusgettopicinfo();
topicId->copyToProtoTopicId(get_topic_info->mutable_topicid());
@ -64,7 +69,7 @@ namespace model {
CryptoTransferTransaction crypto_transaction;
// 0.002809 Hashbars
// fee from https://www.hedera.com/fees
crypto_transaction.addSender(payerAccountId, -2809);
crypto_transaction.addSender(payerAccountId, 2809);
crypto_transaction.addReceiver(connection.hederaId, 2809);
query->mTransactionBody->setCryptoTransfer(crypto_transaction);

View File

@ -20,6 +20,14 @@ namespace model {
return 0;
}
std::unique_ptr<ConsensusTopicInfo> Response::getConsensusTopicInfo()
{
if (mResponseProto.has_consensusgettopicinfo()) {
return std::make_unique<ConsensusTopicInfo>(mResponseProto.consensusgettopicinfo().topicinfo());
}
return nullptr;
}
Poco::UInt64 Response::getQueryCost()
{
proto::ResponseHeader* response_header = nullptr;
@ -41,6 +49,10 @@ namespace model {
auto balance_response = mResponseProto.cryptogetaccountbalance();
return balance_response.header().nodetransactionprecheckcode();
}
else if (mResponseProto.has_consensusgettopicinfo()) {
auto response = mResponseProto.consensusgettopicinfo();
return response.header().nodetransactionprecheckcode();
}
return proto::NOT_SUPPORTED;
}
}

View File

@ -11,7 +11,7 @@
*/
#include "../../proto/hedera/Response.pb.h"
#include "ConsensusGetTopicInfoResponse.h"
#include "ConsensusTopicInfo.h"
#include "Poco/Types.h"
namespace model {
@ -24,9 +24,10 @@ namespace model {
inline proto::Response* getResponsePtr() { return &mResponseProto; }
Poco::UInt64 getAccountBalance();
std::unique_ptr<ConsensusTopicInfo> getConsensusTopicInfo();
Poco::UInt64 getQueryCost();
proto::ResponseCodeEnum getResponseCode();
inline bool isCryptoGetAccountBalanceResponse() { return mResponseProto.has_cryptogetaccountbalance(); }
inline bool isConsensusGetTopicInfoResponse() { return mResponseProto.has_consensusgettopicinfo(); }

View File

@ -36,6 +36,7 @@ namespace model {
inline void setTopicHederaID(Poco::UInt32 topidHederaId) { mTopicHederaId = topidHederaId;}
inline void setSequeceNumber(Poco::UInt64 sequenceNumber) { mSequenceNumber = sequenceNumber; }
inline void setCurrentTimeout(Poco::DateTime currentTimeOut) { mCurrentTimeout = currentTimeOut; }
inline void setAutoRenewPeriod(Poco::UInt32 autoRenewPeriod) { mAutoRenewPeriod = autoRenewPeriod; }
protected:
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);

View File

@ -36,6 +36,10 @@ namespace model {
template<class T>
size_t updateIntoDB(const std::string& fieldName, const T& fieldValue );
template<class T1, class T2>
size_t updateIntoDB(std::string fieldNames[2], const T1& fieldValue1, const T2& fieldValue2);
template<class T1, class T2, class T3>
size_t updateIntoDB(std::string fieldNames[3], const T1& fieldValue1, const T2& fieldValue2, const T3& fieldValue3);
template<class T>
size_t loadFromDB(const std::string& fieldName, const T& fieldValue);
template<class T>
@ -274,6 +278,82 @@ namespace model {
return resultCount;
}
template<class T1, class T2>
size_t ModelBase::updateIntoDB(std::string fieldNames[2], const T1& fieldValue1, const T2& fieldValue2)
{
auto cm = ConnectionManager::getInstance();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
Poco::Data::Statement update(session);
if (mID == 0) {
addError(new Error("ModelBase::updateIntoDB", "id is zero"));
return 0;
}
update << "UPDATE " << getTableName();
for (int i = 0; i < 2; i++) {
update << "SET " << fieldNames[i] << " = ? ";
}
update << "WHERE id = ?"
, Poco::Data::Keywords::bind(fieldValue1), Poco::Data::Keywords::bind(fieldValue2)
, Poco::Data::Keywords::bind(mID);
size_t resultCount = 0;
try {
resultCount = update.execute();
}
catch (Poco::Exception& ex) {
lock();
addError(new ParamError(getTableName(), "mysql error by update 2", ex.displayText()));
for (int i = 0; i < 2; i++) {
addError(new ParamError(getTableName(), "field name for update: ", fieldNames[i]));
}
unlock();
}
return resultCount;
}
template<class T1, class T2, class T3>
size_t ModelBase::updateIntoDB(std::string fieldNames[3], const T1& fieldValue1, const T2& fieldValue2, const T3& fieldValue3)
{
auto cm = ConnectionManager::getInstance();
Poco::ScopedLock<Poco::Mutex> _lock(mWorkMutex);
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
Poco::Data::Statement update(session);
if (mID == 0) {
addError(new Error("ModelBase::updateIntoDB", "id is zero"));
return 0;
}
update << "UPDATE " << getTableName();
for (int i = 0; i < 3; i++) {
update << "SET " << fieldNames[i] << " = ? ";
}
update << "WHERE id = ?"
, Poco::Data::Keywords::bind(fieldValue1), Poco::Data::Keywords::bind(fieldValue2), Poco::Data::Keywords::bind(fieldValue3)
, Poco::Data::Keywords::bind(mID);
size_t resultCount = 0;
try {
resultCount = update.execute();
}
catch (Poco::Exception& ex) {
lock();
addError(new ParamError(getTableName(), "mysql error by update 3", ex.displayText()));
for (int i = 0; i < 3; i++) {
addError(new ParamError(getTableName(), "field name for update: ", fieldNames[i]));
}
unlock();
}
return resultCount;
}
// ******************** Generic Tasks ************************************

View File

@ -10,13 +10,19 @@
#include "../controller/Group.h"
#include "../SingletonManager/SessionManager.h"
#include "../ServerConfig.h"
#include "../lib/DataTypeConverter.h"
#include "../lib/Profiler.h"
#include "../lib/Success.h"
#include "Poco/Timespan.h"
#include "Poco/URI.h"
%>
<%%
const char* pageName = "Topic";
auto user = mSession->getNewUser();
auto sm = SessionManager::getInstance();
Profiler hedera_time;
std::string name = "";
int auto_renew_account = 0;
@ -24,8 +30,48 @@
int group_id = 0;
Poco::URI uri(request.getURI());
auto uri_query = uri.getQueryParameters();
std::string action = "";
Poco::AutoPtr<controller::HederaTopic> query_hedera_topic;
if(!form.empty()) {
// parsing get query params
if(uri_query.size() >= 2) {
if(uri_query[0].first == "action") {
action = uri_query[0].second;
}
if(uri_query[1].first == "topic_id") {
std::string topic_id_from_query;
int topic_id = 0;
topic_id_from_query = uri_query[1].second;
if(DataTypeConverter::strToInt(topic_id_from_query, topic_id) != DataTypeConverter::NUMBER_PARSE_OKAY) {
addError(new Error("Int Convert Error", "Error converting topic_id_from_query to int"));
} else {
auto hedera_topic = controller::HederaTopic::load(topic_id);
if(hedera_topic.isNull()) {
addError(new Error("Action", "hedera topic not found"));
} else {
query_hedera_topic = hedera_topic;
}
}
}
}
// actions
if(!query_hedera_topic.isNull())
{
if(action == "getTopicInfos")
{
hedera_time.reset();
if(query_hedera_topic->updateWithGetTopicInfos(user)) {
addNotification(new ParamSuccess("Hedera", "hedera get topic infos success in ", hedera_time.string()));
} else {
addError(new ParamError("Hedera", "hedera get topic infos failed in ", hedera_time.string()));
}
getErrors(query_hedera_topic);
}
}
else if(!form.empty())
{
name = form.get("topic-name", "");
auto auto_renew_account_string = form.get("topic-auto-renew-account", "0");
auto auto_renew_period_string = form.get("topic-auto-renew-period", "604800");