// SPDX-FileCopyrightText: 2023 Yury Gubich // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include namespace Request { class Request : public QObject { Q_OBJECT public: Request (const QUrl& url); virtual ~Request (); void send (QNetworkAccessManager& manager); void cancel (); void setAuthorizationToken(const QString& token); signals: void done (); void success (const QVariantMap& data); void error (const QString& error, const std::optional& data); protected: virtual void aquireRequest (QNetworkAccessManager& manager); virtual void initializeRequest (); virtual void onSuccess (const QVariantMap& data); virtual void onError (const QString& error, const std::optional& data); std::optional validate (); std::optional readResult (); static bool validateResponse (const std::optional& data, const std::map& structure); static QUrl createUrl(QUrl base, const QString& path); bool stateTerminal() const; constexpr static const char * const json = "application/json"; constexpr static const char * const urlEncoded = "application/x-www-form-urlencoded"; private slots: void onFinished (); protected: static const std::map resultStructure; enum class State { initial, sent, responded, cancelled }; struct NetworkReplyDeleter { void operator () (QNetworkReply* reply) { reply->deleteLater(); } }; State state; QNetworkRequest request; std::unique_ptr reply; bool emptyResult; }; }