Can perform user sign in.

This commit is contained in:
Pierre HUBERT
2018-11-28 21:33:27 +01:00
parent 9f568d5ef6
commit 99724f845c
20 changed files with 787 additions and 40 deletions

View File

@ -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);
}

View File

@ -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
View 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
View 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