#include "servercommunicator.h" #include "apiroutes.h" #include #include #include #include using namespace Qt::StringLiterals; ServerCommunicator::ServerCommunicator(QObject* parent) : QObject{parent} { m_netManager.setAutoDeleteReplies(true); m_restManager = std::make_shared(&m_netManager); m_serviceApi = std::make_shared(); } bool ServerCommunicator::sslSupported() { #if QT_CONFIG(ssl) return QSslSocket::supportsSsl(); #else return false; #endif } QUrl ServerCommunicator::url() const { return m_serviceApi->baseUrl(); } void ServerCommunicator::setUrl(const QUrl& url) { if (m_serviceApi->baseUrl() == url) { return; } m_serviceApi->setBaseUrl(url); QHttpHeaders authenticationHeaders; authenticationHeaders.append(QHttpHeaders::WellKnownHeader::ContentType, "application/json"); m_serviceApi->setCommonHeaders(authenticationHeaders); emit urlChanged(); } void ServerCommunicator::setServerConfiguration(const QString url, const QString email, const QString password, const QString authToken) { setUrl(url); m_email = email; m_password = password; m_authToken = authToken; if (!authToken.isEmpty()) { m_serviceApi->setBearerToken(authToken.toLatin1()); } } void ServerCommunicator::fetchItems() { sendGetRequest(ROUTE_ITEMS); } void ServerCommunicator::postItems(const QByteArray& jsonData) { QNetworkReply* reply = m_restManager->post(m_serviceApi->createRequest(ROUTE_ITEMS), jsonData); QObject::connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); const QString message = QString("POST successful! Response: %1").arg(responseData); qInfo() << message; emit postRequestSuccessful(responseData); } else { const QString message = QString("Error: %1").arg(reply->errorString()); qDebug() << message; emit postRequestFailure(message); } reply->deleteLater(); }); } void ServerCommunicator::deleteItem(const QString& id) { const QString deleteRoute = QString("%1/%2").arg(ROUTE_ITEMS, id); QNetworkReply* reply = m_restManager->deleteResource(m_serviceApi->createRequest(deleteRoute)); QObject::connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); const QString message = QString("DELETE successful! Response: %1").arg(responseData); qInfo() << message; emit deleteRequestSuccessful(responseData); } else { const QString message = QString("Error: %1").arg(reply->errorString()); qDebug() << message; emit deleteRequestFailure(message); } reply->deleteLater(); }); } void ServerCommunicator::sendGetRequest(const QString& path) { // TODO check for valid path, instead of emptiness if (path.isEmpty()) { qDebug() << "Empty path -> Not sending a request."; return; } const QNetworkRequest request = m_serviceApi->createRequest(path); m_restManager->get(request, this, [this, path](QRestReply& reply) { if (reply.isSuccess()) { qInfo() << "Request successful."; const QJsonDocument doc = reply.readJson().value(); onGetReplySuccessful(path, doc); } else { if (reply.hasError()) { const QString errorString = reply.errorString(); qWarning() << "Network error:" << errorString; onGetReplyFailure(path, errorString); } else { int statusCode = reply.httpStatus(); qWarning() << "Request not successful:" << statusCode; onGetReplyFailure(path, QString("HTTP status code: %1").arg(statusCode)); } } }); } void ServerCommunicator::onGetReplySuccessful(const QString& path, const QJsonDocument doc) { if (path == ROUTE_ITEMS) { emit itemsFetched(doc.toJson()); } else { qWarning() << "Can't match request path:" << path; } } void ServerCommunicator::onGetReplyFailure(const QString& path, const QString errorString) { if (path == ROUTE_ITEMS) { emit itemsFetchFailure(errorString); } else { qWarning() << "Can't match request path:" << path; } } void ServerCommunicator::onSendPostRequestTriggered(const QString& path, const QByteArray data) {} void ServerCommunicator::onPostReplySuccessful(const QString& path, const QJsonDocument doc) {} void ServerCommunicator::onPostReplyFailure(const QString& path, const QString errorString) {}