File indexing completed on 2024-05-12 04:42:32

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "accessibilitycloudbackend.h"
0008 #include "accessibilitycloudparser.h"
0009 #include "cache.h"
0010 
0011 #include <KPublicTransport/Location>
0012 #include <KPublicTransport/LocationRequest>
0013 #include <KPublicTransport/LocationReply>
0014 
0015 #include <QDebug>
0016 #include <QNetworkRequest>
0017 #include <QNetworkReply>
0018 #include <QNetworkAccessManager>
0019 #include <QUrl>
0020 #include <QUrlQuery>
0021 
0022 using namespace KPublicTransport;
0023 
0024 AccessibilityCloudBackend::AccessibilityCloudBackend() = default;
0025 AccessibilityCloudBackend::~AccessibilityCloudBackend() = default;
0026 
0027 AbstractBackend::Capabilities AccessibilityCloudBackend::capabilities() const
0028 {
0029     return AbstractBackend::Secure; // hardcoded below
0030 }
0031 
0032 bool AccessibilityCloudBackend::queryLocation(const LocationRequest &req, LocationReply *reply, QNetworkAccessManager *nam) const
0033 {
0034     if ((req.types() & Location::Equipment) == 0 || !req.hasCoordinate()) {
0035         return false;
0036     }
0037 
0038     QUrl url;
0039     url.setScheme(QStringLiteral("https"));
0040     url.setHost(QStringLiteral("accessibility-cloud.freetls.fastly.net"));
0041     url.setPath(QStringLiteral("/equipment-infos"));
0042     QUrlQuery query;
0043     query.addQueryItem(QStringLiteral("latitude"), QString::number(req.latitude()));
0044     query.addQueryItem(QStringLiteral("longitude"), QString::number(req.longitude()));
0045     query.addQueryItem(QStringLiteral("accuracy"), QString::number(req.maximumDistance()));
0046     query.addQueryItem(QStringLiteral("appToken"), m_token);
0047     url.setQuery(query);
0048 
0049     QNetworkRequest netReq(url);
0050     netReq.setRawHeader("Accept", "application/json");
0051     logRequest(req, netReq);
0052 
0053     auto netReply = nam->get(netReq);
0054     netReply->setParent(reply);
0055     QObject::connect(netReply, &QNetworkReply::finished, reply, [this, netReply, reply] {
0056         netReply->deleteLater();
0057         const auto data = netReply->readAll();
0058         logReply(reply, netReply, data);
0059         if (netReply->error()) {
0060             addError(reply, Reply::NetworkError, netReply->errorString());
0061             return;
0062         }
0063 
0064         AccessibilityCloudParser parser;
0065         if (parser.parseLocations(data)) {
0066             if (parser.locations.empty()) {
0067                 addError(reply, Reply::NotFoundError, {});
0068             } else {
0069                 Cache::addLocationCacheEntry(backendId(), reply->request().cacheKey(), parser.locations, parser.attributions, std::chrono::minutes(5));
0070                 addAttributions(reply, std::move(parser.attributions));
0071                 addResult(reply, std::move(parser.locations));
0072             }
0073         } else {
0074             addError(reply, Reply::UnknownError, {});
0075         }
0076     });
0077 
0078     return true;
0079 }