move gradido transaction wrapper classes in own folder and sub-namespace under model

This commit is contained in:
Dario 2020-10-12 14:53:03 +02:00 committed by Ulf Gebhardt
parent e9000f51cc
commit c9874394b3
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
24 changed files with 457 additions and 213 deletions

View File

@ -33,6 +33,7 @@ FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp")
FILE(GLOB MODEL_TABLE "src/cpp/model/table/*.h" "src/cpp/model/table/*.cpp")
FILE(GLOB MODEL_EMAIL "src/cpp/model/email/*.h" "src/cpp/model/email/*.cpp")
FILE(GLOB MODEL_HEDERA "src/cpp/model/hedera/*.h" "src/cpp/model/hedera/*.cpp")
FILE(GLOB MODEL_GRADIDO "src/cpp/model/gradido/*.h" "src/cpp/model/gradido/*.cpp")
FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp")
FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h")
FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/*.h" "src/cpp/MySQL/Poco/*.h")
@ -48,7 +49,8 @@ FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controll
SET(LOCAL_SRCS
${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface}
${JSONInterface} ${CRYPTO} ${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL} ${MODEL_HEDERA}
${JSONInterface} ${CRYPTO}
${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL} ${MODEL_HEDERA} ${MODEL_GRADIDO}
${SINGLETON_MANAGER} ${LIB_SRC} ${MYSQL} ${TASKS}
${PROTO_GRADIDO} ${PROTO_HEDERA}
)
@ -68,6 +70,7 @@ if(MSVC)
source_group("model\\table" FILES ${MODEL_TABLE})
source_group("model\\email" FILES ${MODEL_EMAIL})
source_group("model\\hedera" FILES ${MODEL_HEDERA})
source_group("model\\gradido" FILES ${MODEL_GRADIDO})
source_group("model" FILES ${MODEL})
source_group("mysql" FILES ${MYSQL})
source_group("SingletonManager" FILES ${SINGLETON_MANAGER})

View File

@ -10,8 +10,8 @@
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/SingletonTaskObserver.h"
#include "../SingletonManager/EmailManager.h"
#include "../model/TransactionCreation.h"
#include "../model/TransactionTransfer.h"
#include "../model/gradido/TransactionCreation.h"
#include "../model/gradido/TransactionTransfer.h"
#include "Poco/Thread.h"

View File

@ -5,14 +5,14 @@
#include "Poco/DeflatingStream.h"
#line 7 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
#include "sodium.h"
#include "../proto/gradido/TransactionBody.pb.h"
#include "../controller/User.h"
#include "../model/TransactionBase.h"
#include "../model/TransactionCreation.h"
#line 1 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\header_old.cpsp"
#include "../model/gradido/TransactionBase.h"
#include "../model/gradido/TransactionCreation.h"
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
#include "../ServerConfig.h"
@ -31,7 +31,7 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
if (_compressResponse) response.set("Content-Encoding", "gzip");
Poco::Net::HTMLForm form(request, request.stream());
#line 14 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
const char* pageName = "Decode Transaction";
proto::gradido::TransactionBody transactionBody;
@ -99,12 +99,12 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n";
responseStream << "<title>Gradido Login Server: ";
#line 9 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\header_old.cpsp"
#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<!--<link rel=\"stylesheet\" type=\"text/css\" href=\"css/styles.min.css\">-->\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 11 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\header_old.cpsp"
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "/css/styles.css\">\n";
responseStream << "<style type=\"text/css\" >\n";
@ -149,7 +149,7 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "<div class=\"versionstring dev-info\">\n";
responseStream << "\t<p class=\"grd_small\">Login Server in Entwicklung</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha ";
#line 53 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\header_old.cpsp"
#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp"
responseStream << ( ServerConfig::g_versionString );
responseStream << "</p>\n";
responseStream << "</div>\n";
@ -158,35 +158,35 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "<div class=\"grd_container\">\n";
responseStream << "\t<h1>Transaktion dekodieren</h1>\n";
responseStream << "\t";
#line 72 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 72 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << "\t<form method=\"POST\">\n";
responseStream << "\t\t<fieldset class=\"grd_container_small\">\n";
responseStream << "\t\t\t<legend>Transaktion dekodieren</legend>\n";
responseStream << "\t\t\t<textarea style=\"width:100%;height:100px\" name=\"transaction\">";
#line 76 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 76 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( !form.empty() ? form.get("transaction", "") : "" );
responseStream << "</textarea>\n";
responseStream << "\t\t</fieldset>\n";
responseStream << "\t\t<input class=\"grd-form-bn grd-form-bn-succeed\" type=\"submit\" name=\"submit\" value=\"Dekodieren\">\n";
responseStream << "\t</form>\n";
responseStream << "\t";
#line 80 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 80 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
if(decoded) { responseStream << "\n";
responseStream << "\t\t<p><b>Verwendungszweck:</b></p>\n";
responseStream << "\t\t<p>";
#line 82 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 82 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( transactionBody.memo() );
responseStream << "</p>\n";
responseStream << "\t\t";
#line 83 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
if(transactionBody.has_transfer()) {
auto transfer = transactionBody.transfer();
char hex[65]; memset(hex, 0, 65);
responseStream << "\n";
responseStream << "\t\t\t";
#line 87 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 87 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
if(transfer.has_local()) {
auto local_transfer = transfer.local();
auto sender_pubkey = local_transfer.sender().pubkey();
@ -195,32 +195,33 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << "\n";
responseStream << "\t\t\t\t<h3>Local Transfer</h3>\n";
responseStream << "\t\t\t\t<b>From: </b>";
#line 94 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 94 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( hex );
responseStream << "\n";
responseStream << "\t\t\t\t";
#line 95 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
sodium_bin2hex(hex, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size()); responseStream << "\n";
responseStream << "\t\t\t\t<b>To: </b>";
#line 96 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 96 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( hex );
responseStream << "\n";
responseStream << "\t\t\t\t<b>Amount: </b>";
#line 97 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( TransactionBase::amountToString(local_transfer.sender().amount()) );
#line 97 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
responseStream << ( model::gradido::TransactionBase::amountToString(local_transfer.sender().amount()) );
responseStream << "\n";
responseStream << "\t\t\t";
#line 98 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
} else { responseStream << "\n";
responseStream << "\t\t\t\t<h3>- Not implemented yet (Group Transfer) -</h3>\n";
responseStream << "\t\t\t";
#line 100 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 100 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
} responseStream << "\n";
responseStream << "\t\t";
#line 102 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp"
#line 102 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp"
} else if(transactionBody.has_creation()) {
auto creation = transactionBody.creation();
// model::gradido::TransactionCreation creationObject("", creation);
TransactionCreation creationObject("", creation);
auto receiver = creation.receiver();
char hex[65]; memset(hex, 0, 65);
@ -276,14 +277,14 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request,
responseStream << " </div>\n";
responseStream << " <div class=\"bottomleft\">\n";
responseStream << " ";
#line 6 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\footer.cpsp"
#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( mTimeProfiler.string() );
responseStream << "\n";
responseStream << " </div>\n";
responseStream << " <div class=\"bottomright\">\n";
responseStream << " <p>Login Server in Entwicklung</p>\n";
responseStream << " <p>Alpha ";
#line 10 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\footer.cpsp"
#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( ServerConfig::g_versionString );
responseStream << "</p>\n";
responseStream << " </div>\n";

View File

@ -16,7 +16,7 @@ enum PageState {
PAGE_STATE_REQUEST_IS_RUNNING
};
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#include "../ServerConfig.h"
@ -48,14 +48,14 @@ void UserUpdateGroupPage::handleRequest(Poco::Net::HTTPServerRequest& request, P
auto groups = controller::Group::listAll();
#line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
bool withMaterialIcons = false;
std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
responseStream << "\n";
// begin include header_large.cpsp
// begin include header.cpsp
responseStream << "\n";
responseStream << "<!DOCTYPE html>\n";
responseStream << "<html>\n";
@ -63,48 +63,47 @@ void UserUpdateGroupPage::handleRequest(Poco::Net::HTTPServerRequest& request, P
responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
responseStream << "<title>Gradido Login Server: ";
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/main.css\">\n";
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
if(withMaterialIcons) { responseStream << "\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/materialdesignicons.min.css\">\n";
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
} responseStream << "\n";
responseStream << "</head>\n";
responseStream << "<body>\n";
responseStream << " <div class=\"layout\">\n";
responseStream << "\t\t<div class=\"sidebar1 nav-menu initial\">\n";
responseStream << "\t\t\t<div class=\"nav-vertical\">\n";
responseStream << "\t\t\t\t<ul>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/groups\"><span class=\"link-title\">Gruppen</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/nodes\"><span class=\"link-title\">Node Server</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/hedera_account\"><span class=\"link-title\">Hedera Accounts</span></a></li>\n";
responseStream << "\t\t\t\t\t<li><a href=\"";
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/topic\"><span class=\"link-title\">Hedera Topics</span></a></li>\n";
responseStream << "\t\t\t\t</ul>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</div>\n";
responseStream << "\t\t<div class=\"content\">";
// end include header_large.cpsp
responseStream << " <div class=\"center-form-single\">\n";
responseStream << " <div class=\"center-form-header\">\n";
responseStream << " <a href=\"";
#line 21 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"center-logo\">\n";
responseStream << " <picture>\n";
responseStream << " <source srcset=\"";
#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n";
responseStream << " <source srcset=\"";
#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" type=\"image/png\">\n";
responseStream << " <img src=\"";
#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n";
responseStream << " </picture>\n";
responseStream << " </a>\n";
responseStream << " </div>";
// end include header.cpsp
responseStream << "\n";
#line 30 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp"
responseStream << ( getErrorsHtml() );

View File

@ -54,7 +54,6 @@ Poco::AutoPtr<Poco::Data::SessionImpl> Connector::createSession(const std::strin
void Connector::registerConnector()
{
printf("function pointer address: %d\n", mysql_library_init);
try {
if (mysql_library_init(0, nullptr, nullptr) != 0)
@ -64,9 +63,7 @@ void Connector::registerConnector()
} catch(std::exception &ex) {
printf("mysql exception: \n");
}
printf("after exception\n");
ServerConfig::g_ServerKeySeed->put(4, DRRandom::r64());
printf("instance add new\n");
Poco::Data::SessionFactory::instance().add(new Connector());
}

View File

@ -1,25 +0,0 @@
#include "TransactionBase.h"
#include <iomanip>
TransactionBase::TransactionBase(const std::string& memo)
: mMemo(memo)
{
}
std::string TransactionBase::amountToString(google::protobuf::int64 amount)
{
std::stringstream ss;
double dAmount = amount / 10000.0;
ss << std::fixed << std::setprecision(2) << dAmount;
std::string amountString = ss.str();
if (amountString.find('.') != amountString.npos) {
int pointPlace = amountString.find('.');
if (amountString.substr(pointPlace+1) == "00") {
amountString = amountString.substr(0, pointPlace);
}
}
return amountString;
//return ss.str();
}

View File

@ -1,39 +0,0 @@
/*!
*
* \author: einhornimmond
*
* \date: 25.10.19
*
* \brief: Creation Transaction
*/
#ifndef GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE
#define GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE
#pragma warning(disable:4800)
#include "TransactionBase.h"
#include "../proto/gradido/GradidoCreation.pb.h"
#include "../controller/User.h"
class TransactionCreation : public TransactionBase
{
public:
TransactionCreation(const std::string& memo, const proto::gradido::GradidoCreation& protoCreation);
~TransactionCreation();
int prepare();
inline Poco::AutoPtr<controller::User> getUser() { return mReceiverUser; }
inline google::protobuf::int64 getAmount() { return mProtoCreation.receiver().amount(); }
inline char* getPublicHex() { return mReceiverPublicHex; }
inline std::string getAmountString() { return amountToString(getAmount()); }
std::string getTargetDateString();
protected:
const proto::gradido::GradidoCreation& mProtoCreation;
char mReceiverPublicHex[65];
Poco::AutoPtr<controller::User> mReceiverUser;
};
#endif //GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE

View File

@ -1,51 +0,0 @@
/*!
*
* \author: einhornimmond
*
* \date: 25.10.19
*
* \brief: Creation Transaction
*/
#ifndef GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_TRANSFER_INCLUDE
#define GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_TRANSFER_INCLUDE
#pragma warning(disable:4800)
#include "TransactionBase.h"
#include "../proto/gradido/GradidoTransfer.pb.h"
#include "../controller/User.h"
class TransactionTransfer : public TransactionBase
{
public:
TransactionTransfer(const std::string& memo, const proto::gradido::GradidoTransfer& protoTransfer);
~TransactionTransfer();
int prepare();
inline size_t getKontoTableSize() { lock(); size_t s = mKontoTable.size(); unlock(); return s; }
const std::string& getKontoNameCell(int index);
const std::string& getAmountCell(int index);
protected:
const static std::string mInvalidIndexMessage;
struct KontoTableEntry
{
public:
KontoTableEntry(model::table::User* user, google::protobuf::int64 amount, bool negativeAmount = false);
KontoTableEntry(const std::string& pubkeyHex, google::protobuf::int64 amount, bool negativeAmount = false);
// first name, last name and email or pubkey hex if no user in db found
std::string kontoNameCell;
std::string amountCell;
protected:
void composeAmountCellString(google::protobuf::int64 amount, bool negativeAmount);
};
const proto::gradido::GradidoTransfer& mProtoTransfer;
std::vector<KontoTableEntry> mKontoTable;
};
#endif //GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_TRANSFER_INCLUDE

View File

@ -3,7 +3,7 @@
#include "Poco/Net/MediaType.h"
#include "../TransactionBase.h"
#include "../gradido/TransactionBase.h"
#include "../lib/DataTypeConverter.h"
@ -320,7 +320,7 @@ Gradido Login-Server\n\
static const char* functionName = "Email::replaceAmount";
int findPos = result.find("[amount]");
if (findPos != result.npos) {
result.replace(findPos, 8, TransactionBase::amountToString(gradido_cent));
result.replace(findPos, 8, model::gradido::TransactionBase::amountToString(gradido_cent));
}
else {
addError(new Error(functionName, "no amount placeholder found"));

View File

@ -0,0 +1,30 @@
#include "TransactionBase.h"
#include <iomanip>
namespace model {
namespace gradido {
TransactionBase::TransactionBase(const std::string& memo)
: mMemo(memo)
{
}
std::string TransactionBase::amountToString(google::protobuf::int64 amount)
{
std::stringstream ss;
double dAmount = amount / 10000.0;
ss << std::fixed << std::setprecision(2) << dAmount;
std::string amountString = ss.str();
if (amountString.find('.') != amountString.npos) {
int pointPlace = amountString.find('.');
if (amountString.substr(pointPlace + 1) == "00") {
amountString = amountString.substr(0, pointPlace);
}
}
return amountString;
//return ss.str();
}
}
}

View File

@ -15,17 +15,23 @@
#include "../proto/gradido/BasicTypes.pb.h"
#include "../SingletonManager/MemoryManager.h"
class TransactionBase : public NotificationList, public UniLib::lib::MultithreadContainer
{
public:
TransactionBase(const std::string& memo);
virtual int prepare() = 0;
namespace model {
namespace gradido {
class TransactionBase : public NotificationList, public UniLib::lib::MultithreadContainer
{
public:
TransactionBase(const std::string& memo);
virtual int prepare() = 0;
static std::string amountToString(google::protobuf::int64 amount);
inline const std::string& getMemo() const { return mMemo; }
protected:
std::string mMemo;
};
}
}
static std::string amountToString(google::protobuf::int64 amount);
inline const std::string& getMemo() const { return mMemo; }
protected:
std::string mMemo;
};
#endif //GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_BASE_INCLUDE

View File

@ -0,0 +1,67 @@
#include "TransactionCreation.h"
#include "Poco/DateTimeFormatter.h"
#include <sodium.h>
namespace model {
namespace gradido {
TransactionCreation::TransactionCreation(const std::string& memo, const proto::gradido::GradidoCreation& protoCreation)
: TransactionBase(memo), mProtoCreation(protoCreation)
{
memset(mReceiverPublicHex, 0, 65);
}
TransactionCreation::~TransactionCreation()
{
}
int TransactionCreation::prepare()
{
const static char functionName[] = { "TransactionCreation::prepare" };
if (!mProtoCreation.has_receiver()) {
addError(new Error(functionName, "hasn't receiver amount"));
return -1;
}
auto receiver_amount = mProtoCreation.receiver();
auto receiverPublic = receiver_amount.pubkey();
if (receiverPublic.size() != 32) {
addError(new Error(functionName, "receiver public invalid (size not 32)"));
return -2;
}
mReceiverUser = controller::User::create();
//mReceiverUser = new User((const unsigned char*)receiverPublic.data());
mReceiverUser->load((const unsigned char*)receiverPublic.data());
getErrors(mReceiverUser->getModel());
if (mReceiverUser->getUserState() == USER_EMPTY) {
sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size());
mReceiverUser.assign(nullptr);
}
else {
memcpy(mReceiverPublicHex, mReceiverUser->getModel()->getPublicKeyHex().data(), 64);
// uncomment because not correctly working
/*if (!mReceiverUser->validateIdentHash(mProtoCreation.ident_hash())) {
addError(new Error(functionName, "ident hash isn't the same"));
addError(new ParamError(functionName, "hash calculated from email: ", mReceiverUser->getEmail()));
addError(new ParamError(functionName, "hash: ", std::to_string(mProtoCreation.ident_hash())));
return -3;
}*/
}
//
return 0;
}
std::string TransactionCreation::getTargetDateString()
{
// proto format is seconds, poco timestamp format is microseconds
Poco::Timestamp pocoStamp(mProtoCreation.target_date().seconds() * 1000 * 1000);
//Poco::DateTime(pocoStamp);
return Poco::DateTimeFormatter::format(pocoStamp, "%d. %b %y");
}
}
}

View File

@ -0,0 +1,45 @@
/*!
*
* \author: einhornimmond
*
* \date: 25.10.19
*
* \brief: Creation Transaction
*/
#ifndef GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE
#define GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE
#pragma warning(disable:4800)
#include "TransactionBase.h"
#include "../proto/gradido/GradidoCreation.pb.h"
#include "../controller/User.h"
namespace model {
namespace gradido {
class TransactionCreation : public TransactionBase
{
public:
TransactionCreation(const std::string& memo, const proto::gradido::GradidoCreation& protoCreation);
~TransactionCreation();
int prepare();
inline Poco::AutoPtr<controller::User> getUser() { return mReceiverUser; }
inline google::protobuf::int64 getAmount() { return mProtoCreation.receiver().amount(); }
inline char* getPublicHex() { return mReceiverPublicHex; }
inline std::string getAmountString() { return amountToString(getAmount()); }
std::string getTargetDateString();
protected:
const proto::gradido::GradidoCreation& mProtoCreation;
char mReceiverPublicHex[65];
Poco::AutoPtr<controller::User> mReceiverUser;
};
}
}
#endif //GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE

View File

@ -0,0 +1,148 @@
#include "TransactionTransfer.h"
namespace model {
namespace gradido {
const std::string TransactionTransfer::mInvalidIndexMessage("invalid index");
TransactionTransfer::KontoTableEntry::KontoTableEntry(model::table::User* user, google::protobuf::int64 amount, bool negativeAmount/* = false*/)
{
//<span class="content-cell">Normaler&nbsp;User&nbsp;&lt;info@software-labor.de&gt;</span>
if (!user) return;
composeAmountCellString(amount, negativeAmount);
/*kontoNameCell = "<td>";
kontoNameCell += user->getFirstName();
kontoNameCell += "&nbsp;";
kontoNameCell += user->getLastName();
kontoNameCell += "&nbsp;&lt;";
kontoNameCell += user->getEmail();
kontoNameCell += "&gt;</td>";*/
kontoNameCell = "<span class=\"content-cell\">";
kontoNameCell += user->getNameWithEmailHtml();
kontoNameCell += "</span>";
}
TransactionTransfer::KontoTableEntry::KontoTableEntry(const std::string& pubkeyHex, google::protobuf::int64 amount, bool negativeAmount/* = false*/)
{
composeAmountCellString(amount, negativeAmount);
//kontoNameCell = "<td class=\"small\">0x" + pubkeyHex + "</td>";
kontoNameCell = "<span class = \"content-cell\">" + pubkeyHex + "</span>";
}
void TransactionTransfer::KontoTableEntry::composeAmountCellString(google::protobuf::int64 amount, bool negativeAmount)
{
//<span class="content-cell alert-color">-10 GDD</span>
//<span class="content-cell success-color">10 GDD</span>
amountCell = "<span class=\"content-cell ";
if (negativeAmount) {
amountCell += "alert-color\">-";
}
else {
amountCell += "success-color\">";
}
amountCell += amountToString(amount);
//amountCell += " GDD</td>";
amountCell += " GDD</span>";
}
// ********************************************************************************************************************************
TransactionTransfer::TransactionTransfer(const std::string& memo, const proto::gradido::GradidoTransfer& protoTransfer)
: TransactionBase(memo), mProtoTransfer(protoTransfer)
{
}
TransactionTransfer::~TransactionTransfer()
{
mKontoTable.clear();
}
int TransactionTransfer::prepare()
{
lock();
const static char functionName[] = { "TransactionTransfer::prepare" };
mKontoTable.reserve(2);
//auto receiverAmount = mProtoTransfer.receiveramount();
//auto senderAmount
char pubkeyHexTemp[65];
if (mProtoTransfer.has_local())
{
auto local_transfer = mProtoTransfer.local();
auto sender = local_transfer.sender();
auto sender_pubkey = sender.pubkey();
auto receiver_pubkey = local_transfer.receiver();
auto amount = sender.amount();
auto sender_user = controller::User::create();
auto receiver_user = controller::User::create();
if (!sender_user->load((const unsigned char*)sender_pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, -amount, true));
}
else {
mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), -amount, true));
}
if (!receiver_user->load((const unsigned char*)receiver_pubkey.data())) {
sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size());
mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, true));
}
else {
mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), amount, true));
}
}
// TODO: add version for group transfer
/*
mReceiverUser = new User(receiverPublic.data());
getErrors(mReceiverUser);
if (mReceiverUser->getUserState() == USER_EMPTY) {
sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size());
delete mReceiverUser;
mReceiverUser = nullptr;
}
else {
memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64);
}
//*/
unlock();
return 0;
}
const std::string& TransactionTransfer::getKontoNameCell(int index)
{
lock();
if (index >= mKontoTable.size()) {
unlock();
return mInvalidIndexMessage;
}
unlock();
return mKontoTable[index].kontoNameCell;
}
const std::string& TransactionTransfer::getAmountCell(int index)
{
lock();
if (index >= mKontoTable.size()) {
unlock();
return mInvalidIndexMessage;
}
unlock();
return mKontoTable[index].amountCell;
}
}
}

View File

@ -0,0 +1,57 @@
/*!
*
* \author: einhornimmond
*
* \date: 25.10.19
*
* \brief: Creation Transaction
*/
#ifndef GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_TRANSFER_INCLUDE
#define GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_TRANSFER_INCLUDE
#pragma warning(disable:4800)
#include "TransactionBase.h"
#include "../proto/gradido/GradidoTransfer.pb.h"
#include "../controller/User.h"
namespace model {
namespace gradido {
class TransactionTransfer : public TransactionBase
{
public:
TransactionTransfer(const std::string& memo, const proto::gradido::GradidoTransfer& protoTransfer);
~TransactionTransfer();
int prepare();
inline size_t getKontoTableSize() { lock(); size_t s = mKontoTable.size(); unlock(); return s; }
const std::string& getKontoNameCell(int index);
const std::string& getAmountCell(int index);
protected:
const static std::string mInvalidIndexMessage;
struct KontoTableEntry
{
public:
KontoTableEntry(model::table::User* user, google::protobuf::int64 amount, bool negativeAmount = false);
KontoTableEntry(const std::string& pubkeyHex, google::protobuf::int64 amount, bool negativeAmount = false);
// first name, last name and email or pubkey hex if no user in db found
std::string kontoNameCell;
std::string amountCell;
protected:
void composeAmountCellString(google::protobuf::int64 amount, bool negativeAmount);
};
const proto::gradido::GradidoTransfer& mProtoTransfer;
std::vector<KontoTableEntry> mKontoTable;
};
}
}
#endif //GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_TRANSFER_INCLUDE

View File

@ -1,8 +1,8 @@
#include "ProcessingTransaction.h"
#include <sodium.h>
#include "../model/TransactionCreation.h"
#include "../model/TransactionTransfer.h"
#include "../model/gradido/TransactionCreation.h"
#include "../model/gradido/TransactionTransfer.h"
#include "../SingletonManager/SingletonTaskObserver.h"
@ -108,11 +108,11 @@ int ProcessingTransaction::run()
// check Type
if (mTransactionBody.has_creation()) {
mType = TRANSACTION_CREATION;
mTransactionSpecific = new TransactionCreation(mTransactionBody.memo(), mTransactionBody.creation());
mTransactionSpecific = new model::gradido::TransactionCreation(mTransactionBody.memo(), mTransactionBody.creation());
}
else if (mTransactionBody.has_transfer()) {
mType = TRANSACTION_TRANSFER;
mTransactionSpecific = new TransactionTransfer(mTransactionBody.memo(), mTransactionBody.transfer());
mTransactionSpecific = new model::gradido::TransactionTransfer(mTransactionBody.memo(), mTransactionBody.transfer());
}
if (mTransactionSpecific) {
if (mTransactionSpecific->prepare()) {
@ -158,12 +158,12 @@ std::string ProcessingTransaction::getBodyBytes()
return "<uninitalized>";
}
TransactionCreation* ProcessingTransaction::getCreationTransaction()
model::gradido::TransactionCreation* ProcessingTransaction::getCreationTransaction()
{
return dynamic_cast<TransactionCreation*>(mTransactionSpecific);
return dynamic_cast<model::gradido::TransactionCreation*>(mTransactionSpecific);
}
TransactionTransfer* ProcessingTransaction::getTransferTransaction()
model::gradido::TransactionTransfer* ProcessingTransaction::getTransferTransaction()
{
return dynamic_cast<TransactionTransfer*>(mTransactionSpecific);
return dynamic_cast<model::gradido::TransactionTransfer*>(mTransactionSpecific);
}

View File

@ -5,7 +5,7 @@
#include "../lib/NotificationList.h"
#include "../lib/DRHash.h"
#include "../model/TransactionBase.h"
#include "../model/gradido/TransactionBase.h"
#include "../proto/gradido/TransactionBody.pb.h"
@ -24,10 +24,16 @@ enum TransactionType {
TRANSACTION_TRANSFER
};
class TransactionCreation;
class TransactionTransfer;
namespace model {
namespace gradido {
class TransactionCreation;
class TransactionTransfer;
}
}
class SigningTransaction;
class ProcessingTransaction : public UniLib::controller::CPUTask, public NotificationList
{
friend SigningTransaction;
@ -47,8 +53,8 @@ public:
bool isCreation() { return mType == TRANSACTION_CREATION; }
bool isTransfer() { return mType == TRANSACTION_TRANSFER; }
TransactionCreation* getCreationTransaction();
TransactionTransfer* getTransferTransaction();
model::gradido::TransactionCreation* getCreationTransaction();
model::gradido::TransactionTransfer* getTransferTransaction();
static HASH calculateHash(const std::string& proto_message_base64);
static std::string calculateGenericHash(const std::string& protoMessageBase64);
@ -64,7 +70,7 @@ protected:
std::string mProtoMessageBase64;
proto::gradido::TransactionBody mTransactionBody;
TransactionBase* mTransactionSpecific;
model::gradido::TransactionBase* mTransactionSpecific;
HASH mHash;
DHASH mUserEmailHash;

View File

@ -4,7 +4,6 @@
#include "CPUTask.h"
#include "../lib/NotificationList.h"
#include "../model/TransactionBase.h"
#include "../controller/User.h"
#include "../proto/gradido/GradidoTransaction.pb.h"

View File

@ -8,8 +8,8 @@
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/SingletonTaskObserver.h"
#include "../SingletonManager/EmailManager.h"
#include "../model/TransactionCreation.h"
#include "../model/TransactionTransfer.h"
#include "../model/gradido/TransactionCreation.h"
#include "../model/gradido/TransactionTransfer.h"
#include "Poco/Thread.h"

View File

@ -8,8 +8,8 @@
#include "sodium.h"
#include "../proto/gradido/TransactionBody.pb.h"
#include "../controller/User.h"
#include "../model/TransactionBase.h"
#include "../model/TransactionCreation.h"
#include "../model/gradido/TransactionBase.h"
#include "../model/gradido/TransactionCreation.h"
%>
<%%
const char* pageName = "Decode Transaction";
@ -94,13 +94,14 @@
<b>From: </b><%= hex %>
<% sodium_bin2hex(hex, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size()); %>
<b>To: </b><%= hex %>
<b>Amount: </b><%= TransactionBase::amountToString(local_transfer.sender().amount()) %>
<b>Amount: </b><%= model::gradido::TransactionBase::amountToString(local_transfer.sender().amount()) %>
<% } else { %>
<h3>- Not implemented yet (Group Transfer) -</h3>
<% } %>
<% } else if(transactionBody.has_creation()) {
auto creation = transactionBody.creation();
//model::gradido::TransactionCreation creationObject("", creation);
TransactionCreation creationObject("", creation);
auto receiver = creation.receiver();
char hex[65]; memset(hex, 0, 65);
@ -122,7 +123,7 @@
<p>user: </p>
<p><%= user->getModel()->toHTMLString() %></p>
<% } %>
<p>amount: <%= TransactionBase::amountToString(receiver.amount()) %> GDD</p>
<p>amount: <%= model::gradido::TransactionBase::amountToString(receiver.amount()) %> GDD</p>
<p>target date: <%= creationObject.getTargetDateString() %></p>
<% } %>
<% } %>

View File

@ -34,8 +34,8 @@
<div class="flash-messages" onclick="this.classList.add('hidden')"><%= getErrorsHtmlNewFormat() %></div>
<div class="nav-vertical">
<ul>
<li><a href="<%= ServerConfig::g_php_serverPath %>state-balances/overview" class=""><i class="material-icons-outlined nav-icon " title="Kontoübersicht ( <%= TransactionBase::amountToString(userBalance) %> GDD )">account_balance_wallet</i><span
class="link-title">Kontoübersicht ( <%= TransactionBase::amountToString(userBalance) %> GDD )</span></a></li>
<li><a href="<%= ServerConfig::g_php_serverPath %>state-balances/overview" class=""><i class="material-icons-outlined nav-icon " title="Kontoübersicht ( <%= model::gradido::TransactionBase::amountToString(userBalance) %> GDD )">account_balance_wallet</i><span
class="link-title">Kontoübersicht ( <%= model::gradido::TransactionBase::amountToString(userBalance) %> GDD )</span></a></li>
<li><a href="<%= ServerConfig::g_php_serverPath %>dashboard/index" class=""><i class="material-icons-outlined nav-icon " title="Startseite">home</i><span
class="link-title">Startseite</span></a></li>
<li class=' selected'><a href="<%= ServerConfig::g_php_serverPath %>transaction-send-coins/create" class=""><i class="material-icons-outlined nav-icon "

View File

@ -26,7 +26,7 @@ enum PageState {
auto groups = controller::Group::listAll();
%><%@ include file="header_large.cpsp" %>
%><%@ include file="header.cpsp" %>
<%= getErrorsHtml() %>
<div class="content-list">
<% if(PAGE_STATE_OVERVIEW == state ) { %>