diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index 21bf1b464..ebdf0aad2 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -19,6 +19,7 @@ export class User { this.pubkey = json.public_hex this.language = json.language this.publisherId = json.publisher_id + if (json.hasElopage) this.hasElopage = json.hasElopage } @Field(() => String) @@ -74,4 +75,7 @@ export class User { @Field(() => KlickTipp) klickTipp: KlickTipp + + @Field(() => Boolean) + hasElopage?: boolean } diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 820e493c6..bbb609d40 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -242,4 +242,13 @@ export class UserResolver { } return new CheckEmailResponse(result.data) } + + @Query(() => Boolean) + async hasElopage(@Ctx() context: any): Promise { + const result = await apiGet(CONFIG.LOGIN_API_URL + 'hasElopage?session_id=' + context.sessionId) + if (!result.success) { + throw new Error(result.data) + } + return result.data.hasElopage + } } diff --git a/docu/login_server.api.md b/docu/login_server.api.md index 20317c66f..aeac22549 100644 --- a/docu/login_server.api.md +++ b/docu/login_server.api.md @@ -67,6 +67,7 @@ In case of success returns: "username": "" }, "session_id": -127182, + "hasElopage": true, "clientIP":"123.123.123.123" } ``` @@ -86,6 +87,7 @@ In case of success returns: - `role`: role of user currently only "none" or "admin" - `username`: not used yet - `clientIP`: should be the same as where the js-client is running, else maybe a man-in-the-middle attacks is happening or +- `hasElopage`: only present if hasElopage was set to true in request, true if user has an elopage account nginx was wrong configured. - `session_id`: can be also negative @@ -593,3 +595,29 @@ or: "msg": "session not found" } ``` + +## Check if User has an Elopage Account +Check if logged in user has already an elopage account + +### Request +`GET http://localhost/login_api/hasElopage?session_id=-127182` + +### Response +In case of success returns: + +```json +{ + "state":"success", + "hasElopage": true +} +``` + +or: + +```json +{ + "state":"not found", + "msg": "session not found" +} +``` + diff --git a/login_server/src/cpp/JSONInterface/JsonHasElopage.cpp b/login_server/src/cpp/JSONInterface/JsonHasElopage.cpp new file mode 100644 index 000000000..ee66255be --- /dev/null +++ b/login_server/src/cpp/JSONInterface/JsonHasElopage.cpp @@ -0,0 +1,16 @@ +#include "JsonHasElopage.h" +#include "../model/table/ElopageBuy.h" + +Poco::JSON::Object* JsonHasElopage::handle(Poco::Dynamic::Var params) +{ + auto result = checkAndLoadSession(params); + if (result) { + return result; + } + auto elopage_buy = Poco::AutoPtr(new model::table::ElopageBuy); + + result = stateSuccess(); + result->set("hasElopage", elopage_buy->isExistInDB("email", mSession->getNewUser()->getModel()->getEmail())); + + return result; +} \ No newline at end of file diff --git a/login_server/src/cpp/JSONInterface/JsonHasElopage.h b/login_server/src/cpp/JSONInterface/JsonHasElopage.h new file mode 100644 index 000000000..4fc291d5b --- /dev/null +++ b/login_server/src/cpp/JSONInterface/JsonHasElopage.h @@ -0,0 +1,15 @@ +#ifndef __JSON_INTERFACE_JSON_HAS_ELOPAGE_ +#define __JSON_INTERFACE_JSON_HAS_ELOPAGE_ + +#include "JsonRequestHandler.h" + +class JsonHasElopage : public JsonRequestHandler +{ +public: + Poco::JSON::Object* handle(Poco::Dynamic::Var params); + +protected: + +}; + +#endif // __JSON_INTERFACE_JSON_HAS_ELOPAGE_ \ No newline at end of file diff --git a/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp b/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp index 744ac710e..e1998ddd0 100644 --- a/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp +++ b/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp @@ -16,6 +16,7 @@ #include "JsonUnknown.h" #include "JsonGetRunningUserTasks.h" #include "JsonGetUsers.h" +#include "JsonHasElopage.h" #include "JsonLoginViaEmailVerificationCode.h" #include "JsonLogout.h" #include "JsonNetworkInfos.h" @@ -140,6 +141,9 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c else if (url_first_part == "/logout") { return new JsonLogout(client_host); } + else if (url_first_part == "/hasElopage") { + return new JsonHasElopage; + } return new JsonUnknown; } diff --git a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp index 5d337df41..5c06e27b8 100644 --- a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp +++ b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp @@ -8,6 +8,8 @@ #include "../lib/DataTypeConverter.h" +#include "../model/table/ElopageBuy.h" + Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) { @@ -105,6 +107,10 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) USER_COMPLETE, USER_DISABLED */ + // run query for checking if user has already an account async + Poco::AutoPtr hasElopageTask = new model::table::UserHasElopageTask(email); + hasElopageTask->scheduleTask(hasElopageTask); + auto user_state = session->loadUser(email, password); auto user_model = session->getNewUser()->getModel(); Poco::JSON::Array infos; @@ -140,7 +146,9 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) session->setClientIp(mClientIP); if(infos.size() > 0) { result->set("info", infos); - } + } + AWAIT(hasElopageTask) + result->set("hasElopage", hasElopageTask->hasElopage()); return result; default: result->set("state", "error"); diff --git a/login_server/src/cpp/model/table/ElopageBuy.cpp b/login_server/src/cpp/model/table/ElopageBuy.cpp index 05e799a4a..ff79f6a68 100644 --- a/login_server/src/cpp/model/table/ElopageBuy.cpp +++ b/login_server/src/cpp/model/table/ElopageBuy.cpp @@ -9,6 +9,11 @@ namespace model { "product[affiliate_program_id]", "publisher[id]", "order_id", "product_id", "product[price]", "payer[email]", "publisher[email]", "payment_state", "success_date", "event" }; + ElopageBuy::ElopageBuy() + { + + } + ElopageBuy::ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData) : mPayed(false) { @@ -103,6 +108,14 @@ namespace model { return select; } + + // --------------------------- Tasks -------------------------------------------- + int UserHasElopageTask::run() + { + auto elopage_buy = Poco::AutoPtr(new model::table::ElopageBuy); + bool hasElopage = elopage_buy->isExistInDB("payer_email", mEmail); + return 0; + } } } diff --git a/login_server/src/cpp/model/table/ElopageBuy.h b/login_server/src/cpp/model/table/ElopageBuy.h index dec4727a3..008a11a52 100644 --- a/login_server/src/cpp/model/table/ElopageBuy.h +++ b/login_server/src/cpp/model/table/ElopageBuy.h @@ -31,6 +31,7 @@ namespace model { { public: ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData); + ElopageBuy(); // generic db operations const char* getTableName() const { return "elopage_buys"; } @@ -51,6 +52,22 @@ namespace model { Poco::DateTime mSuccessDate; std::string mEvent; }; + + + // check for user existing + class UserHasElopageTask : public UniLib::controller::CPUTask + { + public: + UserHasElopageTask(std::string email) : mEmail(email), mHasElopage(false) {} + + int run(); + const char* getResourceType() const { return "UserHasElopageTask"; }; + bool hasElopage() const { return mHasElopage; } + + protected: + std::string mEmail; + bool mHasElopage; + }; } } diff --git a/login_server/src/cpp/model/table/ModelBase.h b/login_server/src/cpp/model/table/ModelBase.h index 95856087f..98b640178 100644 --- a/login_server/src/cpp/model/table/ModelBase.h +++ b/login_server/src/cpp/model/table/ModelBase.h @@ -171,7 +171,7 @@ namespace model { << " WHERE " << fieldName << " = ?" , Poco::Data::Keywords::into(id), Poco::Data::Keywords::useRef(fieldValue); try { - if (select.execute() == 1) { + if (select.execute() >= 1) { return true; } } diff --git a/login_server/src/cpp/tasks/CPUTask.h b/login_server/src/cpp/tasks/CPUTask.h index e1c1d5cc0..f96e5d9ec 100644 --- a/login_server/src/cpp/tasks/CPUTask.h +++ b/login_server/src/cpp/tasks/CPUTask.h @@ -68,5 +68,7 @@ namespace UniLib { } } +#define AWAIT(task) while (!hasElopageTask->isTaskFinished()) { Poco::Thread::sleep(10); } + #endif //__DR_UNIVERSUM_LIB_CONTROLLER_CPU_TASK_H__ \ No newline at end of file