mirror of
				https://gitlab.com/comunic/comunicmessages
				synced 2025-11-04 12:14:05 +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