diff --git a/conanfile.txt b/conanfile.txt index 703260a39..e2763c275 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -3,6 +3,7 @@ Poco/1.9.4@pocoproject/stable libsodium/1.0.18@bincrafters/stable boost/1.71.0@conan/stable gtest/1.8.1@bincrafters/stable +mpfr/4.1.0 [generators] cmake diff --git a/skeema/gradido_login/hedera_topics.sql b/skeema/gradido_login/hedera_topics.sql index 3e0160daf..43e2529ef 100644 --- a/skeema/gradido_login/hedera_topics.sql +++ b/skeema/gradido_login/hedera_topics.sql @@ -12,6 +12,5 @@ CREATE TABLE `hedera_topics` ( `running_hash` VARBINARY(64) DEFAULT NULL, `running_hash_version` int unsigned DEFAULT 0, `updated` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `topic_hedera_id` (`topic_hedera_id`) + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/src/cpp/HTTPInterface/AdminTopicPage.cpp b/src/cpp/HTTPInterface/AdminTopicPage.cpp index ccb33a5a2..effbc004c 100644 --- a/src/cpp/HTTPInterface/AdminTopicPage.cpp +++ b/src/cpp/HTTPInterface/AdminTopicPage.cpp @@ -46,8 +46,9 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: Profiler hedera_time; std::string name = ""; + std::string topic_id_string = ""; int auto_renew_account = 0; - int auto_renew_period = 604800; // 7 Tage + int auto_renew_period = 7890000; // 3 Monate int group_id = 0; @@ -94,30 +95,41 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: else if(!form.empty()) { name = form.get("topic-name", ""); + topic_id_string = form.get("topic-id", ""); auto auto_renew_account_string = form.get("topic-auto-renew-account", "0"); - auto auto_renew_period_string = form.get("topic-auto-renew-period", "604800"); + auto auto_renew_period_string = form.get("topic-auto-renew-period", "7890000"); auto group_id_string = form.get("topic-group", "-1"); + Poco::AutoPtr topic_id; - if(name != "" && !sm->isValid(name, VALIDATE_NAME)) { - addError(new Error("Topic", "Name not valid, at least 3 Character")); - } - - if(!sm->isValid(auto_renew_account_string, VALIDATE_ONLY_INTEGER)) { - addError(new Error("Topic", "auto renew account id not an integer")); + if(topic_id_string != "" && sm->isValid(topic_id_string, VALIDATE_HEDERA_ID)) { + topic_id = controller::HederaId::create(topic_id_string); + if(topic_id.isNull()) { + addError(new Error("Hedera Id", "cannot parse hedera id")); + } + } else { - if(DataTypeConverter::strToInt(auto_renew_account_string, auto_renew_account) != DataTypeConverter::NUMBER_PARSE_OKAY) { - addError(new Error("Int convert error", "Error converting auto renew account id to int")); + + if(name != "" && !sm->isValid(name, VALIDATE_NAME)) { + addError(new Error("Topic", "Name not valid, at least 3 Character")); + } + + if(!sm->isValid(auto_renew_account_string, VALIDATE_ONLY_INTEGER)) { + addError(new Error("Topic", "auto renew account id not an integer")); + } else { + if(DataTypeConverter::strToInt(auto_renew_account_string, auto_renew_account) != DataTypeConverter::NUMBER_PARSE_OKAY) { + addError(new Error("Int convert error", "Error converting auto renew account id to int")); + } + } + + if(!sm->isValid(auto_renew_period_string, VALIDATE_ONLY_INTEGER)) { + addError(new Error("Topic", "auto renew period not an integer")); + } else { + if(DataTypeConverter::strToInt(auto_renew_period_string, auto_renew_period) != DataTypeConverter::NUMBER_PARSE_OKAY) { + addError(new Error("Int convert error", "Error converting auto renew period to int")); + } } } - if(!sm->isValid(auto_renew_period_string, VALIDATE_ONLY_INTEGER)) { - addError(new Error("Topic", "auto renew period not an integer")); - } else { - if(DataTypeConverter::strToInt(auto_renew_period_string, auto_renew_period) != DataTypeConverter::NUMBER_PARSE_OKAY) { - addError(new Error("Int convert error", "Error converting auto renew period to int")); - } - } - if(!sm->isValid(group_id_string, VALIDATE_ONLY_INTEGER)) { addError(new Error("Topic", "group_id not an integer")); } else { @@ -126,23 +138,38 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: } } //const std::string& name, int autoRenewAccountId, int autoRenewPeriod, int groupId - - auto hedera_topic = controller::HederaTopic::create(name, auto_renew_account, auto_renew_period, group_id); - if(!hedera_topic->getModel()->insertIntoDB(true)) { - addError(new Error("Topic", "error saving into db")); - } else { - auto payer = controller::HederaAccount::load(auto_renew_account); - if(payer.isNull()) { - addError(new Error("Payer", "payer account not found")); + + // add or create topic? + // add topic + if(!topic_id.isNull()) { + if(topic_id->getModel()->insertIntoDB(true)) { + auto hedera_topic = controller::HederaTopic::loadFromHedera(topic_id, group_id, user); + if(!hedera_topic.isNull()) { + hedera_topic->getModel()->insertIntoDB(false); + } else { + addError(new Error("Hedera Topic", "error load topic from hedera")); + } } else { - auto hedera_task = hedera_topic->createTopic(payer, user); - if(hedera_task.isNull()) { - addError(new Error("Create Topic", "Failed")); - getErrors(hedera_topic); + addError(new Error("Hedera Id", "Error saving hedera id")); + } + // create topic + } else { + auto hedera_topic = controller::HederaTopic::create(name, auto_renew_account, auto_renew_period, group_id); + if(!hedera_topic->getModel()->insertIntoDB(true)) { + addError(new Error("Topic", "error saving into db")); + } else { + auto payer = controller::HederaAccount::load(auto_renew_account); + if(payer.isNull()) { + addError(new Error("Payer", "payer account not found")); + } else { + auto hedera_task = hedera_topic->createTopic(payer, user); + if(hedera_task.isNull()) { + addError(new Error("Create Topic", "Failed")); + getErrors(hedera_topic); + } } } } - } @@ -227,7 +254,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "\t}\n"; responseStream << "\t\n"; responseStream << "\n"; -#line 152 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 180 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "
\n"; @@ -240,7 +267,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "\t\t
\t\n"; responseStream << "\t\t
\n"; responseStream << "\t\t\t
\n"; - responseStream << "\t\t\t\t
Topic ID
\t\t\t\n"; + responseStream << "\t\t\t\t
Topic ID
\t\t\t\n"; responseStream << "\t\t\t\t
Name
\n"; responseStream << "\t\t\t\t
Network Type
\n"; responseStream << "\t\t\t\t
Auto Renew Account Balance
\n"; @@ -252,7 +279,7 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "\t\t\t\t
Aktionen
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t"; -#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 202 "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()); @@ -272,138 +299,192 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "\n"; responseStream << "\t\t\t\t
\n"; - responseStream << "\t\t\t\t\t
"; -#line 193 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" + responseStream << "\t\t\t\t\t
"; +#line 221 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( topic_hedera_id_string ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 194 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 222 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( hedera_topic_model->getName() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 195 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 223 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( model::table::HederaAccount::hederaNetworkTypeToString(renew_account_model->getNetworkType()) ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 196 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 224 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( renew_account_model->getBalanceString() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 197 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 225 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( hedera_topic_model->getAutoRenewPeriodString() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 198 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 226 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( hedera_topic_model->getGroupId() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 199 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 227 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( hedera_topic_model->getCurrentTimeoutString() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 200 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 228 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( hedera_topic_model->getSequenceNumber() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 201 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 229 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" responseStream << ( hedera_topic_model->getUpdatedString() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 202 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 230 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" if(!topic_hedera_id.isNull()) { responseStream << "\n"; responseStream << "\t\t\t\t\t\t\n"; responseStream << "\t\t\t\t\t\t"; -#line 206 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 234 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\t
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t"; -#line 209 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" +#line 237 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" } responseStream << "\n"; responseStream << "\t\t
\n"; responseStream << "\t
\n"; - responseStream << "\t
\n"; - responseStream << "\t

Ein neues Topic anlegen

\n"; + responseStream << "\t\n"; + responseStream << "\t
\n"; + responseStream << "\t \n"; + responseStream << "\t \n"; responseStream << "\t
\n"; - responseStream << "\t
\n"; - responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t

Ein neues Topic anlegen

\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\tName\n"; + responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\t\n"; + responseStream << "\t\t\t\t\t"; +#line 255 "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\n"; - responseStream << "\t\t\t\t"; -#line 225 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" + responseStream << "\t\t\t\t\t"; +#line 259 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" } responseStream << "\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t
\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t\n"; + responseStream << "\t\t\t\t\t"; +#line 266 "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\n"; - responseStream << "\t\t\t\t"; -#line 235 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" + responseStream << "\t\t\t\t\t"; +#line 269 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminTopic.cpsp" } responseStream << "\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\t\n"; - responseStream << "\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t
\n"; + responseStream << "\t
\n"; + responseStream << "\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t

Ein bestehendes Topic eintragen

\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; - responseStream << "\t\t
\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t
\n"; responseStream << "\t
\n"; responseStream << "
\n"; // begin include footer.cpsp @@ -431,9 +512,13 @@ void AdminTopicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: // end include footer.cpsp responseStream << "\n"; responseStream << "\n"; + responseStream << "\n"; responseStream << " +