From 9e049d84771343740932679af3941d73680f9dc0 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 9 Apr 2021 20:11:24 +0200 Subject: [PATCH] update notifications to also have copy errors to email, instead of move, update protocol, run transactions with enough signatures and without result on startup from pending_tasks table --- .../src/cpp/lib/DataTypeConverter.cpp | 1 + login_server/src/cpp/lib/DataTypeConverter.h | 3 ++ login_server/src/cpp/lib/JsonRequest.cpp | 3 +- login_server/src/cpp/lib/NotificationList.cpp | 14 ++++++-- login_server/src/cpp/lib/NotificationList.h | 2 +- .../src/cpp/model/gradido/Transaction.cpp | 35 ++++++++++++++----- .../src/cpp/model/gradido/Transaction.h | 2 ++ .../src/cpp/model/gradido/TransactionBody.cpp | 2 ++ login_server/src/proto | 2 +- 9 files changed, 51 insertions(+), 13 deletions(-) diff --git a/login_server/src/cpp/lib/DataTypeConverter.cpp b/login_server/src/cpp/lib/DataTypeConverter.cpp index 7850ea178..f99100a2e 100644 --- a/login_server/src/cpp/lib/DataTypeConverter.cpp +++ b/login_server/src/cpp/lib/DataTypeConverter.cpp @@ -332,6 +332,7 @@ namespace DataTypeConverter return microseconds; } + Poco::Timespan convertFromProtoDuration(const proto::Duration& duration) { return Poco::Timespan(duration.seconds(), 0); diff --git a/login_server/src/cpp/lib/DataTypeConverter.h b/login_server/src/cpp/lib/DataTypeConverter.h index 3f02b961d..b3fe436a5 100644 --- a/login_server/src/cpp/lib/DataTypeConverter.h +++ b/login_server/src/cpp/lib/DataTypeConverter.h @@ -63,6 +63,9 @@ namespace DataTypeConverter { void convertToProtoTimestamp(const Poco::Timestamp pocoTimestamp, proto::Timestamp* protoTimestamp); void convertToProtoTimestamp(const Poco::Timestamp pocoTimestamp, proto::gradido::Timestamp* protoTimestamp); Poco::Timestamp convertFromProtoTimestampSeconds(const proto::gradido::TimestampSeconds& timestampSeconds); + inline void convertToProtoTimestampSeconds(const Poco::Timestamp pocoTimestamp, proto::gradido::TimestampSeconds* protoTimestampSeconds) { + protoTimestampSeconds->set_seconds(pocoTimestamp.epochTime()); + } Poco::Timespan convertFromProtoDuration(const proto::Duration& duration); //! \brief go through json object and replace every string entry in base64 format into hex format diff --git a/login_server/src/cpp/lib/JsonRequest.cpp b/login_server/src/cpp/lib/JsonRequest.cpp index 746e8b154..9feba3824 100644 --- a/login_server/src/cpp/lib/JsonRequest.cpp +++ b/login_server/src/cpp/lib/JsonRequest.cpp @@ -236,7 +236,8 @@ JsonRequestReturn JsonRequest::requestGRPCRelay(const Poco::Net::NameValueCollec if (!object.isNull("details")) { addError(new ParamError(functionName, "details:", object.get("details").convert().data())); } - sendErrorsAsEmail(); + // send copy of errors as email, to have result also in db + sendErrorsAsEmail("", true); return JSON_REQUEST_RETURN_ERROR; } ss.clear(); diff --git a/login_server/src/cpp/lib/NotificationList.cpp b/login_server/src/cpp/lib/NotificationList.cpp index 79235feb7..d29774bce 100644 --- a/login_server/src/cpp/lib/NotificationList.cpp +++ b/login_server/src/cpp/lib/NotificationList.cpp @@ -184,7 +184,7 @@ std::string NotificationList::getErrorsHtmlNewFormat() */ -void NotificationList::sendErrorsAsEmail(std::string rawHtml/* = ""*/) +void NotificationList::sendErrorsAsEmail(std::string rawHtml/* = ""*/, bool copy/* = false*/) { auto em = EmailManager::getInstance(); /*auto message = new Poco::Net::MailMessage(); @@ -193,12 +193,22 @@ void NotificationList::sendErrorsAsEmail(std::string rawHtml/* = ""*/) message->setSubject("Error from Gradido Login Server"); */ std::string content; + std::stack stack_copy; + if (copy) { + stack_copy = mErrorStack; + } while (mErrorStack.size() > 0) { auto error = mErrorStack.top(); mErrorStack.pop(); content += error->getString(); - delete error; + if (!copy) { + delete error; + } } + if (copy) { + mErrorStack = std::move(stack_copy); + } + auto email = new model::Email(content, model::EMAIL_ERROR); //message->addContent(new Poco::Net::StringPartSource(content)); diff --git a/login_server/src/cpp/lib/NotificationList.h b/login_server/src/cpp/lib/NotificationList.h index e343218bb..2e04ce708 100644 --- a/login_server/src/cpp/lib/NotificationList.h +++ b/login_server/src/cpp/lib/NotificationList.h @@ -47,7 +47,7 @@ public: std::string getErrorsHtmlNewFormat(); std::vector getErrorsArray(); - void sendErrorsAsEmail(std::string rawHtml = ""); + void sendErrorsAsEmail(std::string rawHtml = "", bool copy = false); protected: std::stack mErrorStack; diff --git a/login_server/src/cpp/model/gradido/Transaction.cpp b/login_server/src/cpp/model/gradido/Transaction.cpp index 107375041..9cc9cf658 100644 --- a/login_server/src/cpp/model/gradido/Transaction.cpp +++ b/login_server/src/cpp/model/gradido/Transaction.cpp @@ -317,6 +317,20 @@ namespace model { Poco::AutoPtr transaction = new Transaction(dbModel->getRequestCopy(), dbModel); PendingTasksManager::getInstance()->addTask(transaction); + + // check if transaction was already finished + auto json = transaction->getModel()->getResultJson(); + bool finished = false; + if (!json.isNull()) { + if (!json->get("state").isEmpty()) { + finished = true; + } + } + // try not finished but sign transactions again + if (!finished) { + transaction->ifEnoughSignsProceed(nullptr); + } + return transaction; } @@ -438,10 +452,16 @@ namespace model { mm->releaseMemory(sign); updateRequestInDB(); + + return ifEnoughSignsProceed(user); + } + + bool Transaction::ifEnoughSignsProceed(Poco::AutoPtr user) + { // check if enough signatures exist for next step if (getSignCount() >= mTransactionBody->getTransactionBase()->getMinSignatureCount()) { - if (getTransactionBody()->isTransfer()) { + if (getTransactionBody()->isTransfer() && !user.isNull()) { auto transfer = getTransactionBody()->getTransferTransaction(); if (transfer->isOutbound()) { auto transaction = transfer->createInbound(getTransactionBody()->getMemo()); @@ -453,19 +473,17 @@ namespace model { //Poco::Thread::sleep(1000); } else { - addError(new Error(function_name, "Error creating outbound transaction")); + addError(new Error("Transaction::ifEnoughSignsProceed", "Error creating outbound transaction")); return false; } - + } } UniLib::controller::TaskPtr transaction_send_task(new SendTransactionTask(Poco::AutoPtr(this, true))); transaction_send_task->scheduleTask(transaction_send_task); + return true; } - - //getModel()->updateIntoDB("request", ) - //printf("[Transaction::sign] reference-count: %d\n", mReferenceCount); - return true; + return false; } bool Transaction::updateRequestInDB() @@ -814,7 +832,7 @@ namespace model { getErrors(&json_request); - return 0; + return -1; } std::string Transaction::getTransactionAsJson(bool replaceBase64WithHex/* = false*/) @@ -910,6 +928,7 @@ namespace model { if (1 == result) { //mTransaction->deleteFromDB(); } + return 0; } diff --git a/login_server/src/cpp/model/gradido/Transaction.h b/login_server/src/cpp/model/gradido/Transaction.h index c06e5c045..5988b250e 100644 --- a/login_server/src/cpp/model/gradido/Transaction.h +++ b/login_server/src/cpp/model/gradido/Transaction.h @@ -91,6 +91,8 @@ namespace model { protected: + bool ifEnoughSignsProceed(Poco::AutoPtr user); + int runSendTransactionHedera(); int runSendTransactionMysql(); diff --git a/login_server/src/cpp/model/gradido/TransactionBody.cpp b/login_server/src/cpp/model/gradido/TransactionBody.cpp index b874643d5..da74f32a7 100644 --- a/login_server/src/cpp/model/gradido/TransactionBody.cpp +++ b/login_server/src/cpp/model/gradido/TransactionBody.cpp @@ -7,6 +7,8 @@ namespace model { TransactionBody::TransactionBody() : mTransactionSpecific(nullptr), mType(TRANSACTION_NONE), mBlockchainType(BLOCKCHAIN_NULL) { + auto created = mTransactionBody.mutable_created(); + DataTypeConverter::convertToProtoTimestampSeconds(Poco::Timestamp(), created); } TransactionBody::~TransactionBody() diff --git a/login_server/src/proto b/login_server/src/proto index ff412f735..77dee5685 160000 --- a/login_server/src/proto +++ b/login_server/src/proto @@ -1 +1 @@ -Subproject commit ff412f735667b30233c0ce00d461f209ac7dde7c +Subproject commit 77dee5685ebba543ea1cd2321580ad56c92f5775