Files
shipheart-wasm/dataprovider_OLD.cpp
T

140 lines
4.4 KiB
C++

#include "dataprovider.h"
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QUrl>
#include <QUrlQuery>
DataProvider::DataProvider(QObject *parent) : QObject(parent)
{
}
void DataProvider::signalerSucces()
{
m_connecte = true;
m_derniereConnexionReussie = QDateTime::currentDateTime();
emit etatConnexionChange();
}
void DataProvider::signalerEchec()
{
// Ne touche JAMAIS m_derniereConnexionReussie ici : on veut garder la
// trace du dernier succès réel, pas la remplacer par l'instant de l'échec.
if (m_connecte) {
m_connecte = false;
emit etatConnexionChange();
}
}
void DataProvider::get_familles(const QString &type)
{
if (m_replyFamillesEnCours) {
m_replyFamillesEnCours->abort(); // Requête précédente encore en attente : remplacée par celle-ci
}
QUrl url(m_baseUrl + "/elements/familles");
QUrlQuery query;
query.addQueryItem("type", type);
url.setQuery(query);
QNetworkRequest request(url);
// Sans délai explicite, une requête vers un CM5 devenu injoignable peut
// rester en attente indéfiniment côté navigateur (ni succès ni échec) -
// 'finished' ne se déclencherait alors jamais, empêchant toute détection
// de perte de connexion.
request.setTransferTimeout(TIME_OUT_TRANSFER_DATA);
auto reply = m_manager.get(request);
m_replyFamillesEnCours = reply;
connect(reply, &QNetworkReply::finished, this, [this, reply, type]() {
reply->deleteLater();
if (m_replyFamillesEnCours == reply) m_replyFamillesEnCours = nullptr;
if (reply->error() == QNetworkReply::OperationCanceledError) {
return; // Annulée volontairement (remplacée par une requête plus récente) - pas un vrai échec réseau
}
if (reply->error() != QNetworkReply::NoError) {
signalerEchec();
emit erreur(reply->errorString());
return;
}
const auto doc = QJsonDocument::fromJson(reply->readAll());
const auto obj = doc.object();
if (obj["status"].toString() != "ok") {
signalerEchec();
emit erreur(obj["message"].toString());
return;
}
signalerSucces();
emit famillesRecues(type, obj["familles"].toArray());
});
}
void DataProvider::get_elements(const QString &type, int famille)
{
if (m_replyElementsEnCours) {
m_replyElementsEnCours->abort();
}
QUrl url(m_baseUrl + "/elements");
QUrlQuery query;
query.addQueryItem("type", type);
query.addQueryItem("famille", QString::number(famille));
url.setQuery(query);
QNetworkRequest request(url);
request.setTransferTimeout(TIME_OUT_TRANSFER_DATA);
auto reply = m_manager.get(request);
m_replyElementsEnCours = reply;
connect(reply, &QNetworkReply::finished, this, [this, reply, type, famille]() {
reply->deleteLater();
if (m_replyElementsEnCours == reply) m_replyElementsEnCours = nullptr;
if (reply->error() == QNetworkReply::OperationCanceledError) {
return;
}
if (reply->error() != QNetworkReply::NoError) {
signalerEchec();
emit erreur(reply->errorString());
return;
}
const auto doc = QJsonDocument::fromJson(reply->readAll());
const auto obj = doc.object();
if (obj["status"].toString() != "ok") {
signalerEchec();
emit erreur(obj["message"].toString());
return;
}
signalerSucces();
emit elementsRecus(type, famille, obj["elements"].toArray());
});
}
void DataProvider::set_circuit(int id, int consigne)
{
QUrl url(m_baseUrl + "/elements/circuit/" + QString::number(id));
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setTransferTimeout(TIME_OUT_TRANSFER_DATA);
QJsonObject body;
body["consigne"] = consigne;
const QByteArray data = QJsonDocument(body).toJson();
auto reply = m_manager.sendCustomRequest(request, "PATCH", data);
connect(reply, &QNetworkReply::finished, this, [this, reply, id]() {
reply->deleteLater();
const bool succes = (reply->error() == QNetworkReply::NoError);
if (succes) signalerSucces();
else {
signalerEchec();
emit erreur(reply->errorString());
}
emit circuitModifie(id, succes);
});
}