introduce a very simple network job to do API requests
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Wed, 12 Oct 2022 16:02:26 +0000 (18:02 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 17 Oct 2022 07:01:36 +0000 (09:01 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/networkjobs.cpp
src/libsync/networkjobs.h

index 91970b5ced62b539eb97db4f4fb5c322aea49b7c..81d43ffb343a871089caf6313289766fce72ff73 100644 (file)
@@ -54,6 +54,7 @@ Q_LOGGING_CATEGORY(lcAvatarJob, "nextcloud.sync.networkjob.avatar", QtInfoMsg)
 Q_LOGGING_CATEGORY(lcMkColJob, "nextcloud.sync.networkjob.mkcol", QtInfoMsg)
 Q_LOGGING_CATEGORY(lcProppatchJob, "nextcloud.sync.networkjob.proppatch", QtInfoMsg)
 Q_LOGGING_CATEGORY(lcJsonApiJob, "nextcloud.sync.networkjob.jsonapi", QtInfoMsg)
+Q_LOGGING_CATEGORY(lcSimpleApiJob, "nextcloud.sync.networkjob.simpleapi", QtInfoMsg)
 Q_LOGGING_CATEGORY(lcDetermineAuthTypeJob, "nextcloud.sync.networkjob.determineauthtype", QtInfoMsg)
 Q_LOGGING_CATEGORY(lcSimpleFileJob, "nextcloud.sync.networkjob.simplefilejob", QtInfoMsg)
 const int notModifiedStatusCode = 304;
@@ -1183,4 +1184,60 @@ void fetchPrivateLinkUrl(AccountPtr account, const QString &remotePath,
     job->start();
 }
 
+SimpleApiJob::SimpleApiJob(const AccountPtr &account, const QString &path, QObject *parent)
+    : AbstractNetworkJob(account, path, parent)
+{
+}
+
+void SimpleApiJob::setBody(const QByteArray &body)
+{
+    _body = body;
+    qCDebug(lcSimpleApiJob) << "Set body for request:" << _body;
+}
+
+
+void SimpleApiJob::setVerb(Verb value)
+{
+    _verb = value;
+}
+
+
+QByteArray SimpleApiJob::verbToString() const
+{
+    switch (_verb) {
+    case Verb::Get:
+        return "GET";
+    case Verb::Post:
+        return "POST";
+    case Verb::Put:
+        return "PUT";
+    case Verb::Delete:
+        return "DELETE";
+    }
+    return "GET";
+}
+
+void SimpleApiJob::start()
+{
+    qCDebug(lcSimpleApiJob) << "send: " << path() << _body;
+
+    _request.setRawHeader("OCS-APIREQUEST", "true");
+    const auto url = Utility::concatUrlPath(account()->url(), path());
+    const auto httpVerb = verbToString();
+    if (!_body.isEmpty()) {
+        sendRequest(httpVerb, url, _request, _body);
+    } else {
+        sendRequest(httpVerb, url, _request);
+    }
+    AbstractNetworkJob::start();
+}
+
+bool SimpleApiJob::finished()
+{
+    const auto httpStatusCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+    qCDebug(lcSimpleApiJob) << "result: " << path() << errorString() << httpStatusCode;
+    emit resultReceived(httpStatusCode);
+    return true;
+}
+
 } // namespace OCC
index 644244a10a2a7449d7b94e55be7a9c02f6039fc1..c89368c45c3d430bd96f36a5dfbf5ab14e10a735 100644 (file)
@@ -459,6 +459,42 @@ private:
     [[nodiscard]] QByteArray verbToString() const;
 };
 
+class OWNCLOUDSYNC_EXPORT SimpleApiJob : public AbstractNetworkJob
+{
+    Q_OBJECT
+public:
+    enum class Verb {
+        Get,
+        Post,
+        Put,
+        Delete,
+        };
+
+    explicit SimpleApiJob(const AccountPtr &account, const QString &path, QObject *parent = nullptr);
+
+    void setBody(const QByteArray &body);
+
+    void setVerb(Verb value);
+
+public slots:
+    void start() override;
+
+Q_SIGNALS:
+
+    void resultReceived(int statusCode);
+
+protected:
+    bool finished() override;
+
+private:
+    QByteArray _body;
+    QNetworkRequest _request;
+
+    Verb _verb = Verb::Get;
+
+    [[nodiscard]] QByteArray verbToString() const;
+};
+
 /**
  * @brief Checks with auth type to use for a server
  * @ingroup libsync