diff --git a/login_server/src/cpp/SingletonManager/PendingTasksManager.cpp b/login_server/src/cpp/SingletonManager/PendingTasksManager.cpp index d2ed2af1a..f3faae6bf 100644 --- a/login_server/src/cpp/SingletonManager/PendingTasksManager.cpp +++ b/login_server/src/cpp/SingletonManager/PendingTasksManager.cpp @@ -15,10 +15,10 @@ PendingTasksManager::~PendingTasksManager() Poco::ScopedLock _lock(mWorkMutex); mCheckForFinishedTimer.stop(); - for (auto it = mPendingTasks.begin(); it != mPendingTasks.end(); it++) { + for (auto it = mPendingGradidoTransactions.begin(); it != mPendingGradidoTransactions.end(); it++) { delete it->second; } - mPendingTasks.clear(); + mPendingGradidoTransactions.clear(); } PendingTasksManager* PendingTasksManager::getInstance() @@ -37,31 +37,32 @@ int PendingTasksManager::load() return 0; } -int PendingTasksManager::addTask(Poco::AutoPtr task) + +int PendingTasksManager::addTask(Poco::AutoPtr gradidoTransactionTask) { - if (task.isNull() || !task->getModel()) { + if (gradidoTransactionTask.isNull() || !gradidoTransactionTask->getModel()) { return -1; } - - auto model = task->getModel(); - Poco::ScopedLock _lock(mWorkMutex); - auto pending_task_list = getTaskListForUser(model->getUserId()); - pending_task_list->push_back(task); - return 0; + auto model = gradidoTransactionTask->getModel(); + Poco::ScopedLock _lock(mWorkMutex); + auto pending_task_list = getGradidoTransactionsForUser(model->getUserId()); + pending_task_list->push_back(gradidoTransactionTask); + return 0; } -bool PendingTasksManager::removeTask(Poco::AutoPtr task) + +bool PendingTasksManager::removeTask(Poco::AutoPtr gradidoTransactionTask) { - if (task.isNull() || !task->getModel()) { + if (gradidoTransactionTask.isNull() || !gradidoTransactionTask->getModel()) { return false; } - auto model = task->getModel(); + auto model = gradidoTransactionTask->getModel(); Poco::ScopedLock _lock(mWorkMutex); - auto pending_task_list = getTaskListForUser(model->getUserId()); + auto pending_task_list = getGradidoTransactionsForUser(model->getUserId()); bool removed = false; for (auto it = pending_task_list->begin(); it != pending_task_list->end(); it++) { - if (task.get() == it->get()) { + if (gradidoTransactionTask.get() == it->get()) { pending_task_list->erase(it); removed = true; break; @@ -71,41 +72,42 @@ bool PendingTasksManager::removeTask(Poco::AutoPtr task return removed; } -PendingTasksManager::PendingTaskList* PendingTasksManager::getTaskListForUser(int userId) + +PendingTasksManager::PendingGradidoTaskList* PendingTasksManager::getGradidoTransactionsForUser(int userId) { Poco::ScopedLock _lock(mWorkMutex); - auto it = mPendingTasks.find(userId); - if (it == mPendingTasks.end()) { - auto pending_list = new PendingTaskList; - mPendingTasks.insert(std::pair(userId, pending_list)); + auto it = mPendingGradidoTransactions.find(userId); + if (it == mPendingGradidoTransactions.end()) { + auto pending_list = new PendingGradidoTaskList; + mPendingGradidoTransactions.insert(std::pair(userId, pending_list)); return pending_list; } else { return it->second; } - } -const PendingTasksManager::PendingTaskList* PendingTasksManager::getTaskListForUser(int userId) const + + +const PendingTasksManager::PendingGradidoTaskList* PendingTasksManager::getGradidoTransactionsForUser(int userId) const { Poco::ScopedLock _lock(mWorkMutex); - auto it = mPendingTasks.find(userId); - if (it != mPendingTasks.end()) { + auto it = mPendingGradidoTransactions.find(userId); + if (it != mPendingGradidoTransactions.end()) { return it->second; } return nullptr; } -bool PendingTasksManager::hasPendingTask(Poco::AutoPtr user, model::table::TaskType type) +bool PendingTasksManager::hasPendingGradidoTransaction(Poco::AutoPtr user, model::table::TaskType type) { auto model = user->getModel(); int user_id = model->getID(); Poco::ScopedLock _lock(mWorkMutex); - auto it = mPendingTasks.find(user_id); - if (it != mPendingTasks.end()) { + auto it = mPendingGradidoTransactions.find(user_id); + if (it != mPendingGradidoTransactions.end()) { auto task_list = it->second; - for (auto task = task_list->begin(); task != task_list->end(); it++) { - auto task_model = (*task)->getModel(); - if (type == task_model->getTaskType()) { + for (auto taskIt = task_list->begin(); taskIt != task_list->end(); taskIt++) { + if ((*taskIt)->getModel()->getTaskType() == type) { return true; } } @@ -114,20 +116,21 @@ bool PendingTasksManager::hasPendingTask(Poco::AutoPtr user, m } -std::vector> PendingTasksManager::getPendingTasks(Poco::AutoPtr user, model::table::TaskType type) + +std::vector> PendingTasksManager::getPendingGradidoTransactions(Poco::AutoPtr user, model::table::TaskType type) { auto model = user->getModel(); int user_id = model->getID(); Poco::ScopedLock _lock(mWorkMutex); - std::vector> results; + std::vector> results; - auto it = mPendingTasks.find(user_id); - if (it != mPendingTasks.end()) { + auto it = mPendingGradidoTransactions.find(user_id); + if (it != mPendingGradidoTransactions.end()) { auto task_list = it->second; results.reserve(task_list->size()); for (auto taskIt = task_list->begin(); taskIt != task_list->end(); taskIt++) { auto task_model = (*taskIt)->getModel(); - if (type == task_model->getTaskType()) { + if (task_model->getTaskType() == type) { results.push_back(*taskIt); } } @@ -135,48 +138,42 @@ std::vector> PendingTasksManager::getPend return results; } -std::vector> PendingTasksManager::getTransactionsUserMustSign(Poco::AutoPtr user) +std::vector> PendingTasksManager::getTransactionsUserMustSign(Poco::AutoPtr user) { // TODO: don't use cast here, because can lead to errors Poco::ScopedLock _lock(mWorkMutex); - std::vector> transactions_to_sign; + std::vector> transactions_to_sign; - for (auto map_it = mPendingTasks.begin(); map_it != mPendingTasks.end(); map_it++) + for (auto map_it = mPendingGradidoTransactions.begin(); map_it != mPendingGradidoTransactions.end(); map_it++) { auto list = map_it->second; for (auto list_it = list->begin(); list_it != list->end(); list_it++) { - if ((*list_it)->getModel()->isGradidoTransaction()) { - auto transaction = dynamic_cast(list_it->get()); - if (transaction->mustSign(user)) { - transactions_to_sign.push_back(*list_it); - } + if((*list_it)->mustSign(user)) { + transactions_to_sign.push_back(*list_it); } } } return transactions_to_sign; } -std::vector> PendingTasksManager::getTransactionSomeoneMustSign(Poco::AutoPtr user) +std::vector> PendingTasksManager::getTransactionSomeoneMustSign(Poco::AutoPtr user) { // TODO: don't use cast here, because can lead to errors Poco::ScopedLock _lock(mWorkMutex); - std::vector> transactions_to_sign; + std::vector> transactions_to_sign; if (user->getModel()->getRole() != model::table::ROLE_ADMIN) { return transactions_to_sign; } - for (auto map_it = mPendingTasks.begin(); map_it != mPendingTasks.end(); map_it++) + for (auto map_it = mPendingGradidoTransactions.begin(); map_it != mPendingGradidoTransactions.end(); map_it++) { auto list = map_it->second; for (auto list_it = list->begin(); list_it != list->end(); list_it++) { - if ((*list_it)->getModel()->isGradidoTransaction()) { - auto transaction = dynamic_cast(list_it->get()); - if (transaction->needSomeoneToSign(user)) { - transactions_to_sign.push_back(*list_it); - } + if ((*list_it)->needSomeoneToSign(user)) { + transactions_to_sign.push_back(*list_it); } } } @@ -189,27 +186,25 @@ void PendingTasksManager::checkForFinishedTasks(Poco::Timer& timer) Poco::ScopedLock _lock(mWorkMutex); try { - for (auto map_it = mPendingTasks.begin(); map_it != mPendingTasks.end(); map_it++) + for (auto map_it = mPendingGradidoTransactions.begin(); map_it != mPendingGradidoTransactions.end(); map_it++) { auto list = map_it->second; for (auto list_it = list->begin(); list_it != list->end(); list_it++) { - if ((*list_it)->getModel()->isGradidoTransaction()) { - auto transaction = dynamic_cast(list_it->get()); - auto json = transaction->getModel()->getResultJson(); - bool removeIt = false; - if (!json.isNull()) { - auto state = json->get("state"); - if (!state.isEmpty() && state.toString() == "success") { - removeIt = true; - } - } - if (removeIt) { - transaction->deleteFromDB(); - list_it = list->erase(list_it); - if (!list->size() || list_it == list->end()) break; + auto transaction = *list_it; + auto json = transaction->getModel()->getResultJson(); + bool removeIt = false; + if (!json.isNull()) { + auto state = json->get("state"); + if (!state.isEmpty() && state.toString() == "success") { + removeIt = true; } } + if (removeIt) { + transaction->deleteFromDB(); + list_it = list->erase(list_it); + if (!list->size() || list_it == list->end()) break; + } } } } @@ -224,10 +219,11 @@ void PendingTasksManager::checkForFinishedTasks(Poco::Timer& timer) } } -Poco::AutoPtr PendingTasksManager::getPendingTask(int pendingTaskId) + +Poco::AutoPtr PendingTasksManager::getPendingGradidoTransaction(int pendingTaskId) { Poco::ScopedLock _lock(mWorkMutex); - for (auto map_it = mPendingTasks.begin(); map_it != mPendingTasks.end(); map_it++) + for (auto map_it = mPendingGradidoTransactions.begin(); map_it != mPendingGradidoTransactions.end(); map_it++) { auto list = map_it->second; for (auto list_it = list->begin(); list_it != list->end(); list_it++) diff --git a/login_server/src/cpp/SingletonManager/PendingTasksManager.h b/login_server/src/cpp/SingletonManager/PendingTasksManager.h index 2ee96266a..3d8398eae 100644 --- a/login_server/src/cpp/SingletonManager/PendingTasksManager.h +++ b/login_server/src/cpp/SingletonManager/PendingTasksManager.h @@ -13,9 +13,10 @@ #ifndef GRADIDO_LOGIN_SERVER_SINGLETON_MANAGER_PENDING_TASKS_MANAGER #define GRADIDO_LOGIN_SERVER_SINGLETON_MANAGER_PENDING_TASKS_MANAGER -#include "../controller/PendingTask.h" -#include "../controller/User.h" -#include "../model/gradido/Transaction.h" +#include "controller/PendingTask.h" +#include "model/gradido/Transaction.h" +#include "controller/User.h" +#include "model/gradido/Transaction.h" class UserUpdateGroupPage; @@ -24,6 +25,7 @@ class PendingTasksManager: protected UniLib::lib::MultithreadContainer friend UserUpdateGroupPage; public: typedef std::list> PendingTaskList; + typedef std::list> PendingGradidoTaskList; ~PendingTasksManager(); @@ -34,8 +36,9 @@ public: //! \return -1 task is zero //! \return 0 if added - int addTask(Poco::AutoPtr task); - bool removeTask(Poco::AutoPtr task); + int addTask(Poco::AutoPtr gradidoTransactionTask); + + bool removeTask(Poco::AutoPtr gradidoTransactionTask); //! check if tasks can be removed void checkForFinishedTasks(Poco::Timer& timer); @@ -43,12 +46,12 @@ public: //! by calling this, important is to call lock to prevent vanishing the list while working with it, //! and unlock afterwards //! \return list or nullptr if no list for user exist - const PendingTaskList* getTaskListForUser(int userId) const; - bool hasPendingTask(Poco::AutoPtr user, model::table::TaskType type); - std::vector> getPendingTasks(Poco::AutoPtr user, model::table::TaskType type); - Poco::AutoPtr getPendingTask(int pendingTaskId); - std::vector> getTransactionsUserMustSign(Poco::AutoPtr user); - std::vector> getTransactionSomeoneMustSign(Poco::AutoPtr user); + const PendingGradidoTaskList* getGradidoTransactionsForUser(int userId) const; + bool hasPendingGradidoTransaction(Poco::AutoPtr user, model::table::TaskType type); + std::vector> getPendingGradidoTransactions(Poco::AutoPtr user, model::table::TaskType type); + Poco::AutoPtr getPendingGradidoTransaction(int pendingTaskId); + std::vector> getTransactionsUserMustSign(Poco::AutoPtr user); + std::vector> getTransactionSomeoneMustSign(Poco::AutoPtr user); protected: @@ -58,8 +61,10 @@ protected: std::map mPendingTasks; + std::map mPendingGradidoTransactions; //! \return list for user, creating new list and map entry if not exist PendingTaskList* getTaskListForUser(int userId); + PendingGradidoTaskList* getGradidoTransactionsForUser(int userId); }; diff --git a/login_server/src/cpp/controller/EmailVerificationCode.cpp b/login_server/src/cpp/controller/EmailVerificationCode.cpp index 16fcefbb8..afbc0eb42 100644 --- a/login_server/src/cpp/controller/EmailVerificationCode.cpp +++ b/login_server/src/cpp/controller/EmailVerificationCode.cpp @@ -70,10 +70,13 @@ namespace controller { Poco::AutoPtr EmailVerificationCode::loadOrCreate(int user_id, model::table::EmailOptInType type) { - model::table::EmailOptIn db; + auto db = new model::table::EmailOptIn(); std::vector fields = { "user_id", "email_opt_in_type_id" }; std::vector field_values = { user_id, (int)type }; - auto results = db.loadFromDB(fields, field_values); + auto results = db->loadFromDB(fields, field_values); + db->release(); + db = nullptr; + if (results.size() > 0) { return Poco::AutoPtr(new EmailVerificationCode(new model::table::EmailOptIn(results[0]))); } diff --git a/login_server/src/cpp/controller/User.cpp b/login_server/src/cpp/controller/User.cpp index 955b780d0..576b2b8c8 100644 --- a/login_server/src/cpp/controller/User.cpp +++ b/login_server/src/cpp/controller/User.cpp @@ -136,7 +136,7 @@ namespace controller { { auto db = new model::table::User(); if (0 == db->loadFromDB("id", user_id)) { - delete db; + db->release(); return nullptr; } auto user = new User(db); diff --git a/login_server/src/cpp/model/gradido/Transaction.cpp b/login_server/src/cpp/model/gradido/Transaction.cpp index 00bfc92ac..253d7b5f4 100644 --- a/login_server/src/cpp/model/gradido/Transaction.cpp +++ b/login_server/src/cpp/model/gradido/Transaction.cpp @@ -360,8 +360,8 @@ namespace model { //transaction_send_task->scheduleTask(transaction_send_task); auto pt = PendingTasksManager::getInstance(); - pt->removeTask(Poco::AutoPtr(this, true)); - deleteFromDB(); + // pt->removeTask(Poco::AutoPtr(this, true)); + // deleteFromDB(); return 1 == runSendTransaction(); //return true; } diff --git a/login_server/src/cpp/model/table/AppAccessToken.h b/login_server/src/cpp/model/table/AppAccessToken.h index 821cb6e3c..bbee0568d 100644 --- a/login_server/src/cpp/model/table/AppAccessToken.h +++ b/login_server/src/cpp/model/table/AppAccessToken.h @@ -16,7 +16,7 @@ namespace model { AppAccessToken(int user_id, const Poco::UInt64& code); AppAccessToken(const AppAccessCodeTuple& tuple); AppAccessToken(); - ~AppAccessToken(); + // generic db operations const char* getTableName() const { return "app_access_tokens"; } @@ -32,6 +32,8 @@ namespace model { size_t update(); protected: + ~AppAccessToken(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _insertIntoDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/ElopageBuy.h b/login_server/src/cpp/model/table/ElopageBuy.h index e2b88fb1b..dec4727a3 100644 --- a/login_server/src/cpp/model/table/ElopageBuy.h +++ b/login_server/src/cpp/model/table/ElopageBuy.h @@ -31,14 +31,15 @@ namespace model { { public: ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData); - ~ElopageBuy(); - + // generic db operations const char* getTableName() const { return "elopage_buys"; } std::string toString(); protected: + ~ElopageBuy(); + Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _insertIntoDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/EmailOptIn.h b/login_server/src/cpp/model/table/EmailOptIn.h index c7a21d84c..9e0fc335a 100644 --- a/login_server/src/cpp/model/table/EmailOptIn.h +++ b/login_server/src/cpp/model/table/EmailOptIn.h @@ -26,7 +26,7 @@ namespace model { EmailOptIn(const Poco::UInt64& code, EmailOptInType type); EmailOptIn(const EmailOptInTuple& tuple); EmailOptIn(); - ~EmailOptIn(); + // generic db operations const char* getTableName() const { return "email_opt_in"; } @@ -46,6 +46,8 @@ namespace model { static const char* typeToString(EmailOptInType type); static EmailOptInType stringToType(const std::string& typeString); protected: + ~EmailOptIn(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName); diff --git a/login_server/src/cpp/model/table/Group.h b/login_server/src/cpp/model/table/Group.h index 8e0c56e40..e998cfb7c 100644 --- a/login_server/src/cpp/model/table/Group.h +++ b/login_server/src/cpp/model/table/Group.h @@ -15,8 +15,7 @@ namespace model { Group(); Group(const std::string& alias, const std::string& name, const std::string& url, const std::string& host, const std::string& home, const std::string& description); Group(GroupTuple userTuple); - ~Group(); - + // generic db operations const char* getTableName() const { return "groups"; } std::string toString(); @@ -35,6 +34,8 @@ namespace model { inline void setHome(const std::string& home) { UNIQUE_LOCK; mHome = home; } protected: + ~Group(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadAllFromDB(Poco::Data::Session session); Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName); diff --git a/login_server/src/cpp/model/table/ModelBase.h b/login_server/src/cpp/model/table/ModelBase.h index c769dcfd9..95856087f 100644 --- a/login_server/src/cpp/model/table/ModelBase.h +++ b/login_server/src/cpp/model/table/ModelBase.h @@ -32,7 +32,7 @@ namespace model { public: ModelBase(int id) :mID(id), mReferenceCount(1) {} ModelBase() : mID(0), mReferenceCount(1) {} - virtual ~ModelBase(); + virtual const char* getTableName() const = 0; //! called from within of some catch to give more information for debugging, don't lock mutex! @@ -90,6 +90,8 @@ namespace model { void duplicate(); void release(); protected: + virtual ~ModelBase(); + virtual Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session) = 0; virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName) = 0; virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::vector& fieldNames, MysqlConditionType conditionType = MYSQL_CONDITION_AND); @@ -105,6 +107,9 @@ namespace model { mutable std::shared_mutex mSharedMutex; + private: + + }; template diff --git a/login_server/src/cpp/model/table/PendingTask.h b/login_server/src/cpp/model/table/PendingTask.h index ea6aad92b..3e7a0e8d5 100644 --- a/login_server/src/cpp/model/table/PendingTask.h +++ b/login_server/src/cpp/model/table/PendingTask.h @@ -28,7 +28,6 @@ namespace model { PendingTask(int userId, std::string serializedProtoRequest, TaskType type); PendingTask(const PendingTaskTuple& tuple); - ~PendingTask(); // generic db operations const char* getTableName() const { return "pending_tasks"; } @@ -65,6 +64,8 @@ namespace model { static const char* typeToString(TaskType type); protected: + ~PendingTask(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadAllFromDB(Poco::Data::Session session); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/User.h b/login_server/src/cpp/model/table/User.h index dd51d7498..96d85565d 100644 --- a/login_server/src/cpp/model/table/User.h +++ b/login_server/src/cpp/model/table/User.h @@ -38,7 +38,7 @@ namespace model { User(); User(UserTuple tuple); User(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de"); - ~User(); + // generic db operations const char* getTableName() const { return "users"; } @@ -97,6 +97,7 @@ namespace model { Poco::JSON::Object getJson(); protected: + ~User(); Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); diff --git a/login_server/src/cpp/model/table/UserBackup.h b/login_server/src/cpp/model/table/UserBackup.h index c5084b0f7..a2f407fbd 100644 --- a/login_server/src/cpp/model/table/UserBackup.h +++ b/login_server/src/cpp/model/table/UserBackup.h @@ -15,8 +15,7 @@ namespace model { UserBackup(int user_id, const std::string& passphrase, ServerConfig::Mnemonic_Types type); UserBackup(const UserBackupsTuple& tuple); UserBackup(); - ~UserBackup(); - + // generic db operations const char* getTableName() const { return "user_backups"; } std::string toString(); @@ -29,6 +28,7 @@ namespace model { protected: + ~UserBackup(); //! \brief call from constructor if mMnemonicType -1 //! diff --git a/login_server/src/cpp/model/table/UserRole.h b/login_server/src/cpp/model/table/UserRole.h index 7683bff94..1369dbe86 100644 --- a/login_server/src/cpp/model/table/UserRole.h +++ b/login_server/src/cpp/model/table/UserRole.h @@ -23,7 +23,6 @@ namespace model { UserRole(int user_id, RoleType type); UserRole(const UserRolesTuple& tuple); UserRole(); - ~UserRole(); // generic db operations const char* getTableName() const { return "user_roles"; } @@ -35,7 +34,9 @@ namespace model { inline void setUserId(int user_Id) { mUserId = user_Id; } static const char* typeToString(RoleType type); - protected: + protected: + ~UserRole(); + Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session); Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName); diff --git a/login_server/src/cpsp/CheckTransaction.cpsp b/login_server/src/cpsp/CheckTransaction.cpsp index e95629f3d..d866384b7 100644 --- a/login_server/src/cpsp/CheckTransaction.cpsp +++ b/login_server/src/cpsp/CheckTransaction.cpsp @@ -46,10 +46,7 @@ enum PageState { PageState state = PAGE_NO_TRANSACTIONS; - - - Poco::AutoPtr pending_task; - model::gradido::Transaction* transaction = nullptr; + Poco::AutoPtr transaction; Poco::AutoPtr transaction_body; if(!form.empty()) @@ -64,10 +61,9 @@ enum PageState { if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(pending_task_id_string, pending_task_id)) { // load transaction from pending task manager - pending_task = pt->getPendingTask(pending_task_id); - if(!pending_task.isNull() && pending_task->getModel()->isGradidoTransaction()) + transaction = pt->getPendingGradidoTransaction(pending_task_id); + if(!transaction.isNull()) { - transaction = dynamic_cast(pending_task.get()); if(transaction->hasSigned(account_user)) { transaction = nullptr; } else { @@ -78,10 +74,11 @@ enum PageState { { //mSession->finalizeTransaction(false, true); // - if(transaction && transaction->getModel()->getUserId() == user_model->getID()) + if(!transaction.isNull() && transaction->getModel()->getUserId() == user_model->getID()) { - pt->removeTask(pending_task); - transaction->deleteFromDB(); + if(pt->removeTask(transaction)) { + transaction->deleteFromDB(); + } transaction = nullptr; } } @@ -110,7 +107,7 @@ enum PageState { } if(!hasErrors) { //mSession->finalizeTransaction(true, false); - if(transaction && transaction->sign(account_user)) { + if(!transaction.isNull() && transaction->sign(account_user)) { transaction = nullptr; } } @@ -129,15 +126,15 @@ enum PageState { } auto transactions_user_must_sign = pt->getTransactionsUserMustSign(account_user); - std::vector> transactions_someone_must_sign; + std::vector> transactions_someone_must_sign; // TODO: work with community server roles if(user_model->getRole() == model::table::ROLE_ADMIN) { transactions_someone_must_sign = pt->getTransactionSomeoneMustSign(account_user); } - std::vector> transactions_to_sign; + std::vector> transactions_to_sign; bool transaction_removeable = false; int transaction_to_sign_index = 0; - if(!transaction) + if(transaction.isNull()) { if(transactions_user_must_sign.size() > skip_count) { transactions_to_sign = transactions_user_must_sign; @@ -146,10 +143,10 @@ enum PageState { transactions_to_sign = transactions_someone_must_sign; transaction_to_sign_index = skip_count - transactions_user_must_sign.size(); } - + if(transactions_to_sign.size() > transaction_to_sign_index) { - transaction = dynamic_cast(transactions_to_sign[transaction_to_sign_index].get()); + transaction = transactions_to_sign[transaction_to_sign_index]; transaction_body = transaction->getTransactionBody(); // user can only delete there own transactions // TODO: Auto timeout for community transactions @@ -181,7 +178,7 @@ enum PageState { { enableLogout = false; } - if(PAGE_NO_TRANSACTIONS == state && transaction && !transaction_body.isNull()) + if(PAGE_NO_TRANSACTIONS == state && !transaction.isNull() && !transaction_body.isNull()) { auto transactionType = transaction_body->getType(); memo = transaction_body->getMemo(); @@ -203,8 +200,6 @@ enum PageState { } } - - %><%@ include file="include/header_navi_chr.cpsp" %> <%= getErrorsHtml() %>
@@ -270,18 +265,19 @@ enum PageState {
<% } else if(PAGE_TRANSACTION_GROUP_ADD_MEMBER == state) { - auto groupMemberUpdateTransaction = transaction_body->getGroupMemberUpdate(); - auto groups = controller::Group::load(groupMemberUpdateTransaction->getTargetGroupAlias()); - Poco::AutoPtr group_model; - Poco::AutoPtr user; - if(groups.size() == 1 && !groups[0].isNull()) group_model = groups[0]->getModel(); - auto user_id = transaction->getModel()->getUserId(); - if(user_id == user_model->getID()) { - user = account_user; - } else { - user = controller::User::sload(user_id); - } - %> + auto groupMemberUpdateTransaction = transaction_body->getGroupMemberUpdate(); + auto groups = controller::Group::load(groupMemberUpdateTransaction->getTargetGroupAlias()); + Poco::AutoPtr group_model; + Poco::AutoPtr user; + if(groups.size() == 1 && !groups[0].isNull()) group_model = groups[0]->getModel(); + auto user_id = transaction->getModel()->getUserId(); + if(user_id == user_model->getID()) { + user = account_user; + } else { + user = controller::User::sload(user_id); + } + + %>

<%= gettext("Benutzer zu einer Gruppe hinzufügen") %>

<% if(!user.isNull()) { %> @@ -326,7 +322,7 @@ enum PageState {

- <% if(transaction) { %> + <% if(!transaction.isNull()) { %> <% } %> diff --git a/login_server/src/cpsp/UserUpdateGroup.cpsp b/login_server/src/cpsp/UserUpdateGroup.cpsp index c83c1e977..64dcf86a3 100644 --- a/login_server/src/cpsp/UserUpdateGroup.cpsp +++ b/login_server/src/cpsp/UserUpdateGroup.cpsp @@ -73,15 +73,14 @@ enum PageState { pt->lock("userUpdateGroup Page"); - auto has_pending_group_add_member_task = pt->hasPendingTask(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); + auto has_pending_group_add_member_task = pt->hasPendingGradidoTransaction(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); auto referer_was_checkTransaction = refererString.find("checkTransactions") != std::string::npos; if(has_pending_group_add_member_task) { state = PAGE_STATE_REQUEST_IS_RUNNING; - std::vector> tasks = pt->getPendingTasks(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); + auto tasks = pt->getPendingGradidoTransactions(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); // should be only one - Poco::AutoPtr transaction = tasks[0].cast(); + auto transaction = tasks[0]; if(transaction->getSignCount() == 0) { - pt->unlock(); response.redirect(getBaseUrl() + "/checkTransactions"); return;