diff --git a/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp b/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp index 0eed81559..917de70d8 100644 --- a/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp +++ b/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp @@ -10,6 +10,9 @@ #include "../controller/Group.h" #include "../SingletonManager/SessionManager.h" +#include "../SingletonManager/PendingTasksManager.h" +#include "../lib/DataTypeConverter.h" +#include "../model/gradido/Transaction.h" enum PageState { PAGE_STATE_OVERVIEW, @@ -35,17 +38,61 @@ void UserUpdateGroupPage::handleRequest(Poco::Net::HTTPServerRequest& request, P if (_compressResponse) response.set("Content-Encoding", "gzip"); Poco::Net::HTMLForm form(request, request.stream()); -#line 17 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 20 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" const char* pageName = gettext("Gruppe wählen"); auto user = mSession->getNewUser(); auto sm = SessionManager::getInstance(); + auto pt = PendingTasksManager::getInstance(); PageState state = PAGE_STATE_OVERVIEW; + + auto groups = controller::Group::listAll(); + if(!form.empty()) { + auto group_id_string = form.get("group_id", ""); + if(group_id_string == "") { + addError(new Error(gettext("Fehler"), gettext("HTML Form Fehler"))); + } else { + int group_id = 0; + if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(group_id_string, group_id)) { + std::string group_alias = ""; + Poco::AutoPtr choosen_group; + for(auto it = groups.begin(); it != groups.end(); it++) { + auto group_model = (*it)->getModel(); + if(group_model->getID() == group_id) { + choosen_group = *it; + } + } + if(choosen_group.isNull()) { + addError(new Error(gettext("Fehler"), gettext("Interner Fehler"))); + } else { + auto addGroupMemberTransaction = + model::gradido::Transaction::create(user, choosen_group); + response.redirect(ServerConfig::g_serverPath + "/checkTransactions"); + return; + state = PAGE_STATE_REQUEST_IS_RUNNING; + } + } else { + addError(new Error(gettext("Fehler"), gettext("HTML Value Type Fehler"))); + } + } + } else { + pt->lock("userUpdateGroup Page"); + if(pt->hasPendingTask(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER)) { + state = PAGE_STATE_REQUEST_IS_RUNNING; + std::vector> tasks = pt->getPendingTasks(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); + // should be only one + Poco::AutoPtr transaction = tasks[0].cast(); + if(transaction->getSignCount() == 0) { + response.redirect(ServerConfig::g_serverPath + "/checkTransactions"); + return; + } + } + pt->unlock(); } - auto groups = controller::Group::listAll(); + #line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" @@ -105,79 +152,93 @@ void UserUpdateGroupPage::handleRequest(Poco::Net::HTTPServerRequest& request, P responseStream << " "; // end include header.cpsp responseStream << "\n"; -#line 30 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 77 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "
\n"; responseStream << "\t"; -#line 32 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 79 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" if(PAGE_STATE_OVERVIEW == state ) { responseStream << "\n"; responseStream << "
\n"; responseStream << "

"; -#line 34 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 81 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( gettext("Gruppe wählen") ); responseStream << "

\n"; responseStream << "
\n"; responseStream << "\t

"; -#line 36 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( gettext("Bitte wähle die Gruppe/Gemeinschaft aus, zu der du gehörst.") ); responseStream << "

\n"; responseStream << "\t

"; -#line 37 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 84 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( gettext("Du bekommst eine Bestätigungsmail, nachdem dein Beitritt bestätigt wurde.") ); responseStream << "

\n"; responseStream << "\t
\n"; responseStream << "\t\t
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t
"; -#line 41 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 88 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( gettext("Auswahl") ); responseStream << "
\n"; responseStream << "\t\t\t\t
Name
\n"; responseStream << "\t\t\t\t
Alias
\n"; responseStream << "\t\t\t\t
Url
\n"; responseStream << "\t\t\t\t
"; -#line 45 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 92 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( gettext("Description") ); responseStream << "
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t"; -#line 47 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 94 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" for(auto it = groups.begin(); it != groups.end(); it++) { auto group_model = (*it)->getModel(); responseStream << "\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t
getID()); responseStream << "\" />
\n"; responseStream << "\t\t\t\t\t
"; -#line 51 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( group_model->getName() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 52 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 99 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( group_model->getAlias() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 100 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( group_model->getUrl() ); responseStream << "
\n"; responseStream << "\t\t\t\t\t
"; -#line 54 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 101 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" responseStream << ( group_model->getDescription()); responseStream << "
\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t"; -#line 56 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 103 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\n"; responseStream << "\t\t
\n"; responseStream << "\t
\n"; responseStream << "\t"; -#line 60 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" +#line 107 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + } else if(PAGE_STATE_REQUEST_IS_RUNNING == state) { responseStream << "\n"; + responseStream << "\t\t

"; +#line 108 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Deine Beitrittsanfrage wird bearbeitet, du bekommst eine E-Mail wenn sie bestätigt oder abgelehnt wurde.") ); + responseStream << "

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

"; +#line 109 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Abmelden") ); + responseStream << "

\n"; + responseStream << "\t"; +#line 110 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" } responseStream << "\n"; responseStream << "
\n"; // begin include footer.cpsp diff --git a/src/cpp/SingletonManager/PendingTasksManager.cpp b/src/cpp/SingletonManager/PendingTasksManager.cpp index 54fd18402..e90361d75 100644 --- a/src/cpp/SingletonManager/PendingTasksManager.cpp +++ b/src/cpp/SingletonManager/PendingTasksManager.cpp @@ -64,4 +64,44 @@ const PendingTasksManager::PendingTaskList* PendingTasksManager::getTaskListForU return it->second; } return nullptr; -} \ No newline at end of file +} + +bool PendingTasksManager::hasPendingTask(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 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()) { + return true; + } + } + } + return false; + +} + +std::vector> PendingTasksManager::getPendingTasks(Poco::AutoPtr user, model::table::TaskType type) +{ + auto model = user->getModel(); + int user_id = model->getID(); + Poco::ScopedLock _lock(mWorkMutex); + std::vector> results; + + auto it = mPendingTasks.find(user_id); + if (it != mPendingTasks.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()) { + results.push_back(*taskIt); + } + } + } + return results; +} diff --git a/src/cpp/SingletonManager/PendingTasksManager.h b/src/cpp/SingletonManager/PendingTasksManager.h index 3cfbf1b2a..c09c377da 100644 --- a/src/cpp/SingletonManager/PendingTasksManager.h +++ b/src/cpp/SingletonManager/PendingTasksManager.h @@ -14,6 +14,7 @@ #define GRADIDO_LOGIN_SERVER_SINGLETON_MANAGER_PENDING_TASKS_MANAGER #include "../controller/PendingTask.h" +#include "../controller/User.h" class PendingTasksManager: public UniLib::lib::MultithreadContainer { @@ -35,6 +36,8 @@ public: //! 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); protected: PendingTasksManager(); diff --git a/src/cpp/controller/User.h b/src/cpp/controller/User.h index cd213c175..90c42357d 100644 --- a/src/cpp/controller/User.h +++ b/src/cpp/controller/User.h @@ -143,6 +143,9 @@ namespace controller { inline void setBalance(int gradidoBalance) { std::unique_lock _lock(mSharedMutex); mGradidoCurrentBalance = gradidoBalance; } inline int getBalance() { std::shared_lock _lock(mSharedMutex); return mGradidoCurrentBalance; } + + // connection to other tables + protected: diff --git a/src/cpp/model/gradido/GroupMemberUpdate.cpp b/src/cpp/model/gradido/GroupMemberUpdate.cpp index 1d922311f..89f77c68d 100644 --- a/src/cpp/model/gradido/GroupMemberUpdate.cpp +++ b/src/cpp/model/gradido/GroupMemberUpdate.cpp @@ -39,6 +39,7 @@ namespace model { { // no current user in group, at least login server known, so we need only one signature for transaction // TODO: maybe check with node server, but maybe it isn't necessary + // check sequence number in topic db entry, should be <= 1 mMinSignatureCount = 1; } diff --git a/src/cpp/model/gradido/Transaction.cpp b/src/cpp/model/gradido/Transaction.cpp index 0606a0d31..143ce54b5 100644 --- a/src/cpp/model/gradido/Transaction.cpp +++ b/src/cpp/model/gradido/Transaction.cpp @@ -7,7 +7,9 @@ namespace model { Transaction::Transaction(Poco::AutoPtr body) : mTransactionBody(body), mBodyBytesHash(0) { - + auto body_bytes = mTransactionBody->getBodyBytes(); + mBodyBytesHash = DRMakeStringHash(body_bytes.data(), body_bytes.size()); + mProtoTransaction.set_body_bytes(body_bytes); } Transaction::Transaction(const std::string& protoMessageBin, model::table::PendingTask* dbModel) @@ -63,7 +65,7 @@ namespace model { } model->setUserId(user->getModel()->getID()); model->setTaskType(type); - model->setRequest(mProtoTransaction.body_bytes()); + model->setRequest(mProtoTransaction.SerializeAsString()); if (!model->insertIntoDB(true)) { return false; } diff --git a/src/cpp/model/gradido/Transaction.h b/src/cpp/model/gradido/Transaction.h index 21490e4c4..4c2e8ef96 100644 --- a/src/cpp/model/gradido/Transaction.h +++ b/src/cpp/model/gradido/Transaction.h @@ -29,6 +29,7 @@ namespace model { static Poco::AutoPtr load(model::table::PendingTask* dbModel); bool addSign(Poco::AutoPtr user); + int getSignCount() { return mProtoTransaction.sig_map().sigpair_size(); } TransactionValidation validate(); inline Poco::AutoPtr getTransactionBody() { Poco::ScopedLock _lock(mWorkMutex); return mTransactionBody; } diff --git a/src/cpsp/userUpdateGroup.cpsp b/src/cpsp/userUpdateGroup.cpsp index 90bcbcd68..40b13c616 100644 --- a/src/cpsp/userUpdateGroup.cpsp +++ b/src/cpsp/userUpdateGroup.cpsp @@ -7,6 +7,9 @@ #include "../controller/Group.h" #include "../SingletonManager/SessionManager.h" +#include "../SingletonManager/PendingTasksManager.h" +#include "../lib/DataTypeConverter.h" +#include "../model/gradido/Transaction.h" enum PageState { PAGE_STATE_OVERVIEW, @@ -18,12 +21,56 @@ enum PageState { const char* pageName = gettext("Gruppe wählen"); auto user = mSession->getNewUser(); auto sm = SessionManager::getInstance(); + auto pt = PendingTasksManager::getInstance(); PageState state = PAGE_STATE_OVERVIEW; + + auto groups = controller::Group::listAll(); + if(!form.empty()) { + auto group_id_string = form.get("group_id", ""); + if(group_id_string == "") { + addError(new Error(gettext("Fehler"), gettext("HTML Form Fehler"))); + } else { + int group_id = 0; + if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(group_id_string, group_id)) { + std::string group_alias = ""; + Poco::AutoPtr choosen_group; + for(auto it = groups.begin(); it != groups.end(); it++) { + auto group_model = (*it)->getModel(); + if(group_model->getID() == group_id) { + choosen_group = *it; + } + } + if(choosen_group.isNull()) { + addError(new Error(gettext("Fehler"), gettext("Interner Fehler"))); + } else { + auto addGroupMemberTransaction = + model::gradido::Transaction::create(user, choosen_group); + response.redirect(ServerConfig::g_serverPath + "/checkTransactions"); + return; + state = PAGE_STATE_REQUEST_IS_RUNNING; + } + } else { + addError(new Error(gettext("Fehler"), gettext("HTML Value Type Fehler"))); + } + } + } else { + pt->lock("userUpdateGroup Page"); + if(pt->hasPendingTask(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER)) { + state = PAGE_STATE_REQUEST_IS_RUNNING; + std::vector> tasks = pt->getPendingTasks(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); + // should be only one + Poco::AutoPtr transaction = tasks[0].cast(); + if(transaction->getSignCount() == 0) { + response.redirect(ServerConfig::g_serverPath + "/checkTransactions"); + return; + } + } + pt->unlock(); } - auto groups = controller::Group::listAll(); + %><%@ include file="header.cpsp" %> @@ -57,6 +104,9 @@ enum PageState { "/> + <% } else if(PAGE_STATE_REQUEST_IS_RUNNING == state) { %> +

<%= gettext("Deine Beitrittsanfrage wird bearbeitet, du bekommst eine E-Mail wenn sie bestätigt oder abgelehnt wurde.") %>

+

<%= gettext("Abmelden") %>

<% } %> <%@ include file="footer.cpsp" %>