mirror of
https://gitlab.com/comunic/comunicmessages
synced 2025-06-20 08:55:17 +00:00
Can perform user sign in.
This commit is contained in:
@ -1,12 +1,60 @@
|
||||
|
||||
#include "accounthelper.h"
|
||||
#include "../data/apirequest.h"
|
||||
#include "../helpers/apihelper.h"
|
||||
|
||||
AccountHelper::AccountHelper(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
mAPIHelper = new APIHelper;
|
||||
}
|
||||
|
||||
bool AccountHelper::signedIn()
|
||||
{
|
||||
return false; //TODO : implement
|
||||
}
|
||||
|
||||
void AccountHelper::login(const AccountLoginRequest &info)
|
||||
{
|
||||
//Create API request
|
||||
APIRequest *request = new APIRequest;
|
||||
request->setURI("account/login");
|
||||
request->addString("userMail", info.emailAddress());
|
||||
request->addString("userPassword", info.password());
|
||||
|
||||
//Make connections
|
||||
connect(request, &APIRequest::success, this, &AccountHelper::requestLoginResult);
|
||||
connect(request, &APIRequest::error, this, &AccountHelper::loginError);
|
||||
|
||||
//Execute request
|
||||
mAPIHelper->execute(request);
|
||||
|
||||
}
|
||||
|
||||
void AccountHelper::loginError(int code)
|
||||
{
|
||||
//Delete API request
|
||||
qobject_cast<APIRequest *>(sender())->deleteLater();
|
||||
|
||||
LoginResult result = LoginResult::OTHER_ERROR;
|
||||
|
||||
if(code < 100)
|
||||
result = LoginResult::NETWORK_ERROR;
|
||||
if(code == 401)
|
||||
result = LoginResult::INVALID_CREDENTIALS;
|
||||
if(code == 429)
|
||||
result = LoginResult::TOO_MANY_REQUEST;
|
||||
|
||||
//Inform about the result
|
||||
emit loginResult(result);
|
||||
}
|
||||
|
||||
void AccountHelper::requestLoginResult(const QJsonDocument &document)
|
||||
{
|
||||
//Delete API request
|
||||
qobject_cast<APIRequest *>(sender())->deleteLater();
|
||||
|
||||
|
||||
|
||||
//Success
|
||||
emit loginResult(LoginResult::LOGIN_SUCCESS);
|
||||
}
|
||||
|
@ -8,6 +8,11 @@
|
||||
#define ACCOUNTHELPER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QJsonDocument>
|
||||
|
||||
class APIHelper;
|
||||
|
||||
#include "../data/accountloginrequest.h"
|
||||
|
||||
class AccountHelper : public QObject
|
||||
{
|
||||
@ -22,9 +27,32 @@ public:
|
||||
*/
|
||||
bool signedIn();
|
||||
|
||||
/**
|
||||
* Perform login
|
||||
*
|
||||
* @param info Request data (user credentials)
|
||||
*/
|
||||
void login(const AccountLoginRequest &info);
|
||||
|
||||
signals:
|
||||
|
||||
/**
|
||||
* This signal is emitted once a login request has been completed
|
||||
*
|
||||
* @param result The state of the request
|
||||
*/
|
||||
void loginResult(LoginResult result);
|
||||
|
||||
public slots:
|
||||
|
||||
private slots:
|
||||
|
||||
//Login request callbacks
|
||||
void loginError(int code);
|
||||
void requestLoginResult(const QJsonDocument &document);
|
||||
|
||||
private:
|
||||
APIHelper *mAPIHelper;
|
||||
};
|
||||
|
||||
#endif // ACCOUNTHELPER_H
|
||||
|
70
helpers/apihelper.cpp
Normal file
70
helpers/apihelper.cpp
Normal file
@ -0,0 +1,70 @@
|
||||
#include <QUrlQuery>
|
||||
#include <QJsonDocument>
|
||||
|
||||
#include "apihelper.h"
|
||||
#include "../config.h"
|
||||
|
||||
APIHelper::APIHelper(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
//Make errors
|
||||
QObject::connect(&mNetworkManager, &QNetworkAccessManager::sslErrors, this, &APIHelper::sslErrors);
|
||||
}
|
||||
|
||||
void APIHelper::execute(APIRequest *request)
|
||||
{
|
||||
//Determine full request URL
|
||||
QString requestURL = API_URL + request->URI();
|
||||
|
||||
//Add API credentials to parameters
|
||||
request->addString("serviceName", API_SERVICE_NAME);
|
||||
request->addString("serviceToken", API_SERVICE_TOKEN);
|
||||
|
||||
//Prepare request
|
||||
//See this SO question to learn more : https://stackoverflow.com/questions/2599423
|
||||
QUrlQuery queryData;
|
||||
for(APIRequestParameter param : request->arguments())
|
||||
queryData.addQueryItem(param.name(), param.value());
|
||||
|
||||
//Send request
|
||||
QNetworkRequest networkRequest((QUrl(requestURL)));
|
||||
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
|
||||
QNetworkReply *reply = mNetworkManager.post(networkRequest, queryData.toString(QUrl::FullyEncoded).toUtf8());
|
||||
|
||||
//Make connections
|
||||
connect(reply, &QNetworkReply::finished, this, &APIHelper::finished);
|
||||
connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), this, &APIHelper::error);
|
||||
|
||||
//Add the request to the list
|
||||
request->setNetworkReply(reply);
|
||||
mRequestsList.append(request);
|
||||
}
|
||||
|
||||
void APIHelper::finished()
|
||||
{
|
||||
if(qobject_cast<QNetworkReply *>(sender())->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 200)
|
||||
return;
|
||||
|
||||
//Get the API request related to this
|
||||
APIRequest *request = mRequestsList.findForReply(qobject_cast<QNetworkReply *>(sender()), true);
|
||||
|
||||
//Process and return response
|
||||
emit request->success(QJsonDocument::fromJson(request->networkReply()->readAll()));
|
||||
}
|
||||
|
||||
void APIHelper::error()
|
||||
{
|
||||
//Get the API request related to this
|
||||
APIRequest *request = mRequestsList.findForReply(qobject_cast<QNetworkReply *>(sender()), true);
|
||||
|
||||
//Try to determine error code
|
||||
int response_code = request->networkReply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
qWarning("An error occurred in an API request! (code: %d)", response_code);
|
||||
|
||||
emit request->error(response_code);
|
||||
}
|
||||
|
||||
void APIHelper::sslErrors()
|
||||
{
|
||||
qWarning("APIHelper: the SSL/TLS session encountered an error!");
|
||||
}
|
45
helpers/apihelper.h
Normal file
45
helpers/apihelper.h
Normal file
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* API Helper - handles the connections between
|
||||
* the server and this application
|
||||
*
|
||||
* @author Pierre HUBERT
|
||||
*/
|
||||
|
||||
#ifndef APIHELPER_H
|
||||
#define APIHELPER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
|
||||
#include "../data/apirequest.h"
|
||||
#include "../data/apirequestslist.h"
|
||||
|
||||
class APIHelper : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit APIHelper(QObject *parent = nullptr);
|
||||
|
||||
/**
|
||||
* Send a request to the server
|
||||
*
|
||||
* @param request The request to execute
|
||||
*/
|
||||
void execute(APIRequest *request);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private slots:
|
||||
void finished();
|
||||
void error();
|
||||
void sslErrors();
|
||||
|
||||
private:
|
||||
QNetworkAccessManager mNetworkManager;
|
||||
APIRequestsList mRequestsList;
|
||||
};
|
||||
|
||||
#endif // APIHELPER_H
|
Reference in New Issue
Block a user