Nouvelle version de sw.js pour prendre en compte les nouvelles version (pb de cache sinon) + nouveaux accès pour passer de l'API Poc à la version définitive
This commit is contained in:
+51
-113
@@ -2,13 +2,57 @@
|
||||
#include <QNetworkRequest>
|
||||
#include <QNetworkReply>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QUrl>
|
||||
#include <QUrlQuery>
|
||||
|
||||
#ifdef Q_OS_WASM
|
||||
#include <emscripten/val.h>
|
||||
#endif
|
||||
|
||||
DataProvider::DataProvider(QObject *parent) : QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Adresse de l'API (synthèse §49) : "/api" sur l'ORIGINE de la page qui a chargé le wasm (protocole + hôte + port),
|
||||
// lue dans window.location.origin :
|
||||
// - à distance : https://b<N>.ship2net.fr/api -> Traefik (session Live vérifiée à chaque requête) -> nginx du CM5
|
||||
// -> API (port 8080). Même origine que la page : le cookie de session est joint automatiquement par le
|
||||
// navigateur, et il n'y a plus de requête entre origines (CORS).
|
||||
// - en local : https://<IP du CM5>/api -> nginx du CM5 -> API.
|
||||
// Hors navigateur (exécution native pour la mise au point) : variable d'environnement SHIPHEART_API, ou l'API locale.
|
||||
// ----------------------------------------------------------------------------
|
||||
QString DataProvider::adresseApi()
|
||||
{
|
||||
#ifdef Q_OS_WASM
|
||||
const std::string origine = emscripten::val::global("location")["origin"].as<std::string>();
|
||||
return QString::fromStdString(origine) + QStringLiteral("/api");
|
||||
#else
|
||||
return qEnvironmentVariable("SHIPHEART_API", QStringLiteral("http://127.0.0.1:8080"));
|
||||
#endif
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Traitement commun d'une réponse en erreur. Une réponse 401 vient du vérificateur du Live (session expirée, ou accès
|
||||
// suspendu/révoqué depuis le portail) : elle est signalée à part (sessionExpiree), car elle ne se résoudra pas seule -
|
||||
// contrairement à une coupure réseau, qui relève du simple "hors ligne".
|
||||
// Retour : true si la réponse est en erreur (déjà signalée : l'appelant n'a plus qu'à sortir).
|
||||
// ----------------------------------------------------------------------------
|
||||
bool DataProvider::reponseEnErreur(QNetworkReply *reply)
|
||||
{
|
||||
if (reply->error() == QNetworkReply::NoError) return false;
|
||||
|
||||
const int statut = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
if (statut == 401 && !m_sessionExpiree) {
|
||||
m_sessionExpiree = true;
|
||||
emit sessionExpireeChange();
|
||||
}
|
||||
signalerEchec();
|
||||
emit erreur(reply->errorString());
|
||||
return true;
|
||||
}
|
||||
|
||||
void DataProvider::signalerSucces()
|
||||
{
|
||||
m_connecte = true;
|
||||
@@ -18,6 +62,8 @@ void DataProvider::signalerSucces()
|
||||
|
||||
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();
|
||||
@@ -26,28 +72,15 @@ void DataProvider::signalerEchec()
|
||||
|
||||
void DataProvider::get_familles(const QString &type)
|
||||
{
|
||||
if (m_replyFamillesEnCours) m_replyFamillesEnCours->abort();
|
||||
|
||||
QUrl url(m_baseUrl + "/elements/familles");
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("type", type);
|
||||
url.setQuery(query);
|
||||
|
||||
QNetworkRequest request(url);
|
||||
request.setTransferTimeout(5000);
|
||||
|
||||
auto reply = m_manager.get(request);
|
||||
m_replyFamillesEnCours = reply;
|
||||
|
||||
auto reply = m_manager.get(QNetworkRequest(url));
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply, type]() {
|
||||
reply->deleteLater();
|
||||
if (m_replyFamillesEnCours == reply) m_replyFamillesEnCours = nullptr;
|
||||
if (reply->error() == QNetworkReply::OperationCanceledError) return;
|
||||
if (reply->error() != QNetworkReply::NoError) {
|
||||
signalerEchec();
|
||||
emit erreur(reply->errorString());
|
||||
return;
|
||||
}
|
||||
if (reponseEnErreur(reply)) return;
|
||||
const auto doc = QJsonDocument::fromJson(reply->readAll());
|
||||
const auto obj = doc.object();
|
||||
if (obj["status"].toString() != "ok") {
|
||||
@@ -62,29 +95,16 @@ void DataProvider::get_familles(const QString &type)
|
||||
|
||||
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(5000);
|
||||
|
||||
auto reply = m_manager.get(request);
|
||||
m_replyElementsEnCours = reply;
|
||||
|
||||
auto reply = m_manager.get(QNetworkRequest(url));
|
||||
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;
|
||||
}
|
||||
if (reponseEnErreur(reply)) return;
|
||||
const auto doc = QJsonDocument::fromJson(reply->readAll());
|
||||
const auto obj = doc.object();
|
||||
if (obj["status"].toString() != "ok") {
|
||||
@@ -102,7 +122,6 @@ 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(5000);
|
||||
|
||||
QJsonObject body;
|
||||
body["consigne"] = consigne;
|
||||
@@ -111,89 +130,8 @@ void DataProvider::set_circuit(int id, int consigne)
|
||||
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);
|
||||
const bool succes = !reponseEnErreur(reply);
|
||||
if (succes) signalerSucces();
|
||||
else {
|
||||
signalerEchec();
|
||||
emit erreur(reply->errorString());
|
||||
}
|
||||
emit circuitModifie(id, succes);
|
||||
});
|
||||
}
|
||||
|
||||
void DataProvider::get_mesures(const QString &type, int id, int periode, const QString &variable)
|
||||
{
|
||||
if (m_replyMesuresEnCours) m_replyMesuresEnCours->abort();
|
||||
|
||||
QUrl url(m_baseUrl + "/mesures");
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("type", type);
|
||||
query.addQueryItem("id", QString::number(id));
|
||||
query.addQueryItem("periode", QString::number(periode));
|
||||
if (!variable.isEmpty()) query.addQueryItem("variable", variable);
|
||||
url.setQuery(query);
|
||||
|
||||
QNetworkRequest request(url);
|
||||
request.setTransferTimeout(8000); // Requête potentiellement plus lourde (jusqu'à 200 points) qu'un simple /elements - délai un peu plus généreux.
|
||||
|
||||
auto reply = m_manager.get(request);
|
||||
m_replyMesuresEnCours = reply;
|
||||
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply, type, id, periode, variable]() {
|
||||
reply->deleteLater();
|
||||
if (m_replyMesuresEnCours == reply) m_replyMesuresEnCours = 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 mesuresRecues(type, id, periode, variable, obj);
|
||||
});
|
||||
}
|
||||
|
||||
void DataProvider::get_energie(const QString &type, int id, int periode)
|
||||
{
|
||||
if (m_replyEnergieEnCours) m_replyEnergieEnCours->abort();
|
||||
|
||||
QUrl url(m_baseUrl + "/energie");
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("type", type);
|
||||
query.addQueryItem("id", QString::number(id));
|
||||
query.addQueryItem("periode", QString::number(periode));
|
||||
url.setQuery(query);
|
||||
|
||||
QNetworkRequest request(url);
|
||||
request.setTransferTimeout(8000);
|
||||
|
||||
auto reply = m_manager.get(request);
|
||||
m_replyEnergieEnCours = reply;
|
||||
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply, type, id, periode]() {
|
||||
reply->deleteLater();
|
||||
if (m_replyEnergieEnCours == reply) m_replyEnergieEnCours = 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 energieRecue(type, id, periode, obj);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user