File indexing completed on 2024-05-12 05:28:51

0001 /*
0002  *   SPDX-FileCopyrightText: 2013 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003  *   SPDX-FileCopyrightText: 2017 Jan Grulich <jgrulich@redhat.com>
0004  *
0005  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  */
0007 
0008 #pragma once
0009 
0010 #include <ReviewsBackend/AbstractReviewsBackend.h>
0011 #include <ReviewsBackend/ReviewsModel.h>
0012 
0013 #include <QJsonDocument>
0014 #include <QMap>
0015 #include <QNetworkReply>
0016 
0017 class KJob;
0018 class AbstractResourcesBackend;
0019 class CachedNetworkAccessManager;
0020 
0021 class DISCOVERCOMMON_EXPORT OdrsReviewsBackend : public AbstractReviewsBackend
0022 {
0023     Q_OBJECT
0024 public:
0025     static QSharedPointer<OdrsReviewsBackend> global();
0026     explicit OdrsReviewsBackend();
0027     ~OdrsReviewsBackend() override;
0028 
0029     void login() override
0030     {
0031     }
0032     void logout() override
0033     {
0034     }
0035     void registerAndLogin() override
0036     {
0037     }
0038 
0039     Rating *ratingForApplication(AbstractResource *resource) const override;
0040     bool hasCredentials() const override
0041     {
0042         return false;
0043     }
0044     bool supportsNameChange() const override
0045     {
0046         return true;
0047     }
0048     void deleteReview(Review *) override
0049     {
0050     }
0051     void fetchReviews(AbstractResource *resource, int page = 1) override;
0052     bool isFetching() const override
0053     {
0054         return m_isFetching;
0055     }
0056     void flagReview(Review *, const QString &, const QString &) override
0057     {
0058     }
0059     void submitUsefulness(Review *review, bool useful) override;
0060     bool isResourceSupported(AbstractResource *resource) const override;
0061     void emitRatingFetched(AbstractResourcesBackend *backend, const QList<AbstractResource *> &resources) const;
0062     QString errorMessage() const override
0063     {
0064         return m_errorMessage;
0065     }
0066 
0067     QVector<Rating *> top() const
0068     {
0069         return m_top;
0070     }
0071 
0072 private Q_SLOTS:
0073     void ratingsFetched(KJob *job);
0074     void reviewsFetched();
0075     void reviewSubmitted(QNetworkReply *reply);
0076     void usefulnessSubmitted();
0077 
0078 Q_SIGNALS:
0079     void ratingsReady();
0080 
0081 protected:
0082     void sendReview(AbstractResource *resource, const QString &summary, const QString &reviewText, const QString &rating, const QString &userName) override;
0083     QString userName() const override;
0084 
0085 private:
0086     void fetchRatings();
0087     void setFetching(bool fetching);
0088     QNetworkAccessManager *nam();
0089     void parseRatings();
0090     void parseReviews(const QJsonDocument &document, AbstractResource *resource);
0091 
0092     QString m_errorMessage;
0093     QHash<QString, Rating *> m_ratings;
0094     bool m_isFetching = false;
0095     CachedNetworkAccessManager *m_delayedNam = nullptr;
0096 
0097     QVector<Rating *> m_top;
0098 };