update support for multiple transactions with one request

This commit is contained in:
Dario 2019-12-05 16:18:11 +01:00
parent 2b1f0f1b2d
commit 436765ed63
4 changed files with 72 additions and 13 deletions

View File

@ -1,5 +1,6 @@
#include "JsonTransaction.h"
#include "Poco/URI.h"
#include "Poco/Dynamic/Struct.h"
#include "../SingletonManager/SessionManager.h"
@ -29,25 +30,50 @@ Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params)
}
int balance = 0;
paramJsonObject->get("balance").convert(balance);
if (balance) {
auto u = session->getUser();
if (u) {
u->setBalance(balance);
if (!paramJsonObject->isNull("balance")) {
paramJsonObject->get("balance").convert(balance);
if (balance) {
auto u = session->getUser();
if (u) {
u->setBalance(balance);
}
}
}
std::string transactionBase64String;
paramJsonObject->get("transaction_base64").convert(transactionBase64String);
Poco::Dynamic::Var transaction_base64 = paramJsonObject->get("transaction_base64");
int alreadyEnlisted = 0;
if (transaction_base64.isString()) {
paramJsonObject->get("transaction_base64").convert(transactionBase64String);
if (!session->startProcessingTransaction(transactionBase64String)) {
auto lastError = session->getLastError();
if (lastError) delete lastError;
result->set("state", "error");
result->set("msg", "already enlisted");
return result;
if (!session->startProcessingTransaction(transactionBase64String)) {
auto lastError = session->getLastError();
if (lastError) delete lastError;
result->set("state", "error");
result->set("msg", "already enlisted");
return result;
}
} else {
Poco::DynamicStruct ds = *paramJsonObject;
for (int i = 0; i < ds["transaction_base64"].size(); i++) {
ds["transaction_base64"][i].convert(transactionBase64String);
if (!session->startProcessingTransaction(transactionBase64String)) {
auto lastError = session->getLastError();
if (lastError) delete lastError;
alreadyEnlisted++;
}
}
if (alreadyEnlisted > 0) {
result->set("state", "warning");
result->set("msg", std::to_string(alreadyEnlisted) + " already enlisted");
return result;
}
}
result->set("state", "success");
return result;
}
@ -55,6 +81,10 @@ Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params)
}
catch (Poco::Exception& ex) {
printf("[JsonTransaction::handle] try to use params as jsonObject: %s\n", ex.displayText().data());
result->set("state", "error");
result->set("msg", "json exception");
result->set("details", ex.displayText());
return result;
}
}
else if (params.isVector()) {

View File

@ -367,6 +367,30 @@ void Session::finalizeTransaction(bool sign, bool reject)
unlock();
}
size_t Session::getProcessingTransactionCount()
{
size_t count = 0;
lock();
for (auto it = mProcessingTransactions.begin(); it != mProcessingTransactions.end(); it++) {
(*it)->lock();
if ((*it)->errorCount() > 0) {
(*it)->sendErrorsAsEmail();
(*it)->unlock();
it = mProcessingTransactions.erase(it);
if (it == mProcessingTransactions.end()) break;
}
else {
(*it)->unlock();
}
}
count = mProcessingTransactions.size();
unlock();
return count;
}
bool Session::isPwdValid(const std::string& pwd)
{
if (mSessionUser) {

View File

@ -105,7 +105,7 @@ public:
//! \param working if set will filled with transaction running
Poco::AutoPtr<ProcessingTransaction> getNextReadyTransaction(size_t* working = nullptr);
void finalizeTransaction(bool sign, bool reject);
inline size_t getProcessingTransactionCount() { lock(); auto ret = mProcessingTransactions.size(); unlock(); return ret; }
size_t getProcessingTransactionCount();
inline LanguageCatalog* getLanguageCatalog() { return mLanguageCatalog.isNull() ? nullptr : mLanguageCatalog; }
void setLanguage(Languages lang);

View File

@ -3,6 +3,8 @@
#include "../SingletonManager/ErrorManager.h"
#include "../SingletonManager/MemoryManager.h"
#include "../lib/Profiler.h"
#include "../proto/gradido/Transaction.pb.h"
#include "sodium.h"
@ -124,6 +126,7 @@ int SigningTransaction::run() {
// 443 = HTTPS Default
// TODO: adding port into ServerConfig
try {
Profiler phpRequestTime;
Poco::Net::HTTPSClientSession httpsClientSession(ServerConfig::g_php_serverHost, 443);
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/TransactionJsonRequestHandler");
@ -140,6 +143,8 @@ int SigningTransaction::run() {
for (std::string line; std::getline(request_stream, line); ) {
responseStringStream << line << std::endl;
}
Poco::Logger& speedLog= Poco::Logger::get("SpeedLog");
speedLog.information("[putTransaction] php server time: %s", phpRequestTime.string());
// extract parameter from request
Poco::JSON::Parser jsonParser;