mirror of
https://gitlab.com/comunic/comunicwatcher
synced 2024-11-21 21:09:26 +00:00
Send request to server
This commit is contained in:
parent
9ad4255207
commit
4a54dfcaed
@ -1,6 +1,4 @@
|
|||||||
QT += core gui
|
QT += core gui widgets network
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
|
||||||
|
|
||||||
CONFIG += c++11
|
CONFIG += c++11
|
||||||
|
|
||||||
@ -16,10 +14,15 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
|
apirequest.cpp \
|
||||||
|
apiresponse.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
loginwindow.cpp
|
loginwindow.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
|
apirequest.h \
|
||||||
|
apiresponse.h \
|
||||||
|
config.h \
|
||||||
loginwindow.h
|
loginwindow.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
|
54
apirequest.cpp
Normal file
54
apirequest.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include "apirequest.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <QHttpPart>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
|
||||||
|
QNetworkAccessManager APIRequest::mNetworkManager;
|
||||||
|
|
||||||
|
APIRequest::APIRequest(const QString &uri, QObject *parent) : QObject(parent), mURI(uri)
|
||||||
|
{
|
||||||
|
addString("serviceName", API_SERVICE_NAME);
|
||||||
|
addString("serviceToken", API_SERVICE_TOKEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIRequest::addString(const QString &name, const QString &value)
|
||||||
|
{
|
||||||
|
mArgs[name] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIRequest::exec()
|
||||||
|
{
|
||||||
|
QUrl url;
|
||||||
|
url.setScheme(API_SERVER_SCHEME);
|
||||||
|
url.setHost(API_HOST);
|
||||||
|
url.setPath(API_BASE_PATH + mURI);
|
||||||
|
|
||||||
|
QNetworkRequest req(url);
|
||||||
|
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
|
||||||
|
|
||||||
|
QString query = "";
|
||||||
|
for(QString val : mArgs.keys()) {
|
||||||
|
if(!query.isEmpty())
|
||||||
|
query += "&";
|
||||||
|
|
||||||
|
query += QUrl::toPercentEncoding(val) + "=" + QUrl::toPercentEncoding(mArgs[val]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Execute request
|
||||||
|
mReply = mNetworkManager.post(req, query.toUtf8());
|
||||||
|
mReply->setParent(this);
|
||||||
|
connect(mReply, &QNetworkReply::finished, this, &APIRequest::onResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIRequest::onResponse()
|
||||||
|
{
|
||||||
|
int code = mReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||||
|
QByteArray content = mReply->readAll();
|
||||||
|
|
||||||
|
emit done(APIResponse(code, content));
|
||||||
|
deleteLater();
|
||||||
|
|
||||||
|
qDebug("Request: %s - %d - %s", mURI.toStdString().c_str(), code, content.toStdString().c_str());
|
||||||
|
}
|
43
apirequest.h
Normal file
43
apirequest.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* Simple API request
|
||||||
|
*
|
||||||
|
* @author Pierre Hubert
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "apiresponse.h"
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QMap>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
|
||||||
|
class APIRequest : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit APIRequest(const QString &uri, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new parameter to this request
|
||||||
|
*/
|
||||||
|
void addString(const QString &name, const QString &value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the request
|
||||||
|
*/
|
||||||
|
void exec();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void done(APIResponse response);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onResponse();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString mURI;
|
||||||
|
QMap<QString, QString> mArgs;
|
||||||
|
static QNetworkAccessManager mNetworkManager;
|
||||||
|
QNetworkReply *mReply;
|
||||||
|
};
|
||||||
|
|
22
apiresponse.cpp
Normal file
22
apiresponse.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include "apiresponse.h"
|
||||||
|
|
||||||
|
APIResponse::APIResponse(int code, QByteArray content) :
|
||||||
|
mCode(code), mContent(content)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int APIResponse::getCode() const
|
||||||
|
{
|
||||||
|
return mCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray APIResponse::getContent() const
|
||||||
|
{
|
||||||
|
return mContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool APIResponse::isError()
|
||||||
|
{
|
||||||
|
return mCode != 200;
|
||||||
|
}
|
25
apiresponse.h
Normal file
25
apiresponse.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* This class contains the response to an API request
|
||||||
|
*
|
||||||
|
* @author Pierre Hubert
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QByteArray>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class APIResponse
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
APIResponse(int mCode, QByteArray content);
|
||||||
|
|
||||||
|
int getCode() const;
|
||||||
|
|
||||||
|
QByteArray getContent() const;
|
||||||
|
|
||||||
|
bool isError();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int mCode;
|
||||||
|
QByteArray mContent;
|
||||||
|
};
|
29
config.h
Normal file
29
config.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Configuration
|
||||||
|
*
|
||||||
|
* @author Pierre Hubert
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release configuration
|
||||||
|
*/
|
||||||
|
#ifdef QT_NO_DEBUG
|
||||||
|
// TODO : complete
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug configuration
|
||||||
|
*/
|
||||||
|
#ifndef QT_NO_DEBUG
|
||||||
|
|
||||||
|
#define API_SERVER_SCHEME "https"
|
||||||
|
#define API_HOST "devweb.local"
|
||||||
|
#define API_BASE_PATH "/comunic/api-v2/"
|
||||||
|
#define API_SERVICE_NAME "ComunicWatcher"
|
||||||
|
#define API_SERVICE_TOKEN "ComunicWatcher"
|
||||||
|
|
||||||
|
#endif
|
@ -1,3 +1,4 @@
|
|||||||
|
#include "apirequest.h"
|
||||||
#include "loginwindow.h"
|
#include "loginwindow.h"
|
||||||
#include "ui_loginwindow.h"
|
#include "ui_loginwindow.h"
|
||||||
|
|
||||||
@ -8,8 +9,8 @@ LoginWindow::LoginWindow(QWidget *parent)
|
|||||||
, ui(new Ui::LoginWindow)
|
, ui(new Ui::LoginWindow)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
setWindowFlag(Qt::FramelessWindowHint);
|
setWindowFlag(Qt::FramelessWindowHint);
|
||||||
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoginWindow::~LoginWindow()
|
LoginWindow::~LoginWindow()
|
||||||
@ -47,9 +48,51 @@ void LoginWindow::submitForm()
|
|||||||
QMessageBox::warning(this, tr("Error"), tr("Please specify your password!"));
|
QMessageBox::warning(this, tr("Error"), tr("Please specify your password!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
|
auto req = new APIRequest("account/login");
|
||||||
|
req->addString("userMail", ui->emailEdit->text());
|
||||||
|
req->addString("userPassword", ui->passwordEdit->text());
|
||||||
|
req->exec();
|
||||||
|
connect(req, &APIRequest::done, this, &LoginWindow::onResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoginWindow::onResponse(APIResponse res)
|
||||||
|
{
|
||||||
|
if(res.isError()) {
|
||||||
|
QString msg;
|
||||||
|
|
||||||
|
switch(res.getCode()) {
|
||||||
|
case 401:
|
||||||
|
msg = tr("Invalid credentials!");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 429:
|
||||||
|
msg = tr("Too many login attempt, please try again later!");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
msg = tr("An error occured while trying to sign you in!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoading(false);
|
||||||
|
QMessageBox::warning(this, tr("Login failed"), msg);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QMessageBox::information(this, "ok", "success");
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoginWindow::on_submitButton_clicked()
|
void LoginWindow::on_submitButton_clicked()
|
||||||
{
|
{
|
||||||
submitForm();
|
submitForm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoginWindow::setLoading(bool loading)
|
||||||
|
{
|
||||||
|
ui->loginProgress->setVisible(loading);
|
||||||
|
ui->loginFormContainer->setVisible(!loading);
|
||||||
|
}
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "apiresponse.h"
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
|
|
||||||
@ -31,11 +33,16 @@ private slots:
|
|||||||
*/
|
*/
|
||||||
void submitForm();
|
void submitForm();
|
||||||
|
|
||||||
|
void onResponse(APIResponse res);
|
||||||
|
|
||||||
void on_closeButton_clicked();
|
void on_closeButton_clicked();
|
||||||
|
|
||||||
void on_submitButton_clicked();
|
void on_submitButton_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void setLoading(bool loading);
|
||||||
|
|
||||||
|
// Class members
|
||||||
Ui::LoginWindow *ui;
|
Ui::LoginWindow *ui;
|
||||||
QPoint mOldPos;
|
QPoint mOldPos;
|
||||||
};
|
};
|
||||||
|
@ -122,34 +122,50 @@ QToolButton:hover:!pressed {
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QProgressBar" name="loginProgress">
|
||||||
<property name="text">
|
<property name="maximum">
|
||||||
<string>Email address</string>
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="emailEdit"/>
|
<widget class="QWidget" name="loginFormContainer" native="true">
|
||||||
</item>
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Password</string>
|
<string>Email address</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="passwordEdit">
|
<widget class="QLineEdit" name="emailEdit"/>
|
||||||
<property name="echoMode">
|
</item>
|
||||||
<enum>QLineEdit::Password</enum>
|
<item>
|
||||||
</property>
|
<widget class="QLabel" name="label_3">
|
||||||
</widget>
|
<property name="text">
|
||||||
</item>
|
<string>Password</string>
|
||||||
<item alignment="Qt::AlignHCenter">
|
</property>
|
||||||
<widget class="QPushButton" name="submitButton">
|
</widget>
|
||||||
<property name="text">
|
</item>
|
||||||
<string>Login</string>
|
<item>
|
||||||
</property>
|
<widget class="QLineEdit" name="passwordEdit">
|
||||||
|
<property name="echoMode">
|
||||||
|
<enum>QLineEdit::Password</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item alignment="Qt::AlignHCenter">
|
||||||
|
<widget class="QPushButton" name="submitButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Login</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
5
main.cpp
5
main.cpp
@ -6,6 +6,11 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
|
// Initialize configuration
|
||||||
|
QCoreApplication::setOrganizationName("Comuniquons");
|
||||||
|
QCoreApplication::setOrganizationDomain("communiquons.org");
|
||||||
|
QCoreApplication::setApplicationName("ComunicWatcher");
|
||||||
|
|
||||||
LoginWindow w;
|
LoginWindow w;
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user