mirror of https://github.com/qt/qtdoc.git
116 lines
3.2 KiB
C++
116 lines
3.2 KiB
C++
// Copyright (C) 2023 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#include "paginatedresource.h"
|
|
|
|
#include <QtNetwork/qrestaccessmanager.h>
|
|
#include <QtNetwork/qrestreply.h>
|
|
|
|
#include <QtCore/qjsonarray.h>
|
|
#include <QtCore/qjsondocument.h>
|
|
#include <QtCore/qjsonobject.h>
|
|
#include <QtCore/qurlquery.h>
|
|
|
|
using namespace Qt::StringLiterals;
|
|
|
|
static constexpr auto totalPagesField = "total_pages"_L1;
|
|
static constexpr auto currentPageField = "page"_L1;
|
|
static constexpr auto resourceId = "/%1"_L1;
|
|
|
|
PaginatedResource::PaginatedResource(QObject *parent)
|
|
: AbstractResource(parent)
|
|
{
|
|
}
|
|
|
|
QList<QJsonObject> PaginatedResource::data() const
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
int PaginatedResource::pages() const
|
|
{
|
|
return m_pages;
|
|
}
|
|
|
|
int PaginatedResource::page() const
|
|
{
|
|
return m_currentPage;
|
|
}
|
|
|
|
void PaginatedResource::setPage(int page)
|
|
{
|
|
if (m_currentPage == page || page < 1)
|
|
return;
|
|
m_currentPage = page;
|
|
emit pageUpdated();
|
|
refreshCurrentPage();
|
|
}
|
|
|
|
void PaginatedResource::refreshCurrentPage()
|
|
{
|
|
QUrlQuery query{{"page"_L1, QString::number(m_currentPage)}};
|
|
m_manager->get(m_api->createRequest(m_path, query), this, [this](QRestReply &reply) {
|
|
if (const auto json = reply.readJson()) {
|
|
refreshRequestFinished(*json);
|
|
} else {
|
|
refreshRequestFailed();
|
|
}
|
|
});
|
|
}
|
|
|
|
void PaginatedResource::refreshRequestFinished(const QJsonDocument &json)
|
|
{
|
|
m_data.clear();
|
|
const QJsonArray data = json["data"_L1].toArray();
|
|
for (const auto &entry : data)
|
|
m_data.append(entry.toObject());
|
|
m_pages = json[totalPagesField].toInt();
|
|
m_currentPage = json[currentPageField].toInt();
|
|
emit pageUpdated();
|
|
emit pagesUpdated();
|
|
emit dataUpdated();
|
|
}
|
|
|
|
void PaginatedResource::refreshRequestFailed()
|
|
{
|
|
if (m_currentPage != 1) {
|
|
// A failed refresh. If we weren't on page 1, try that.
|
|
// Last resource on currentPage might have been deleted, causing a failure
|
|
setPage(1);
|
|
} else {
|
|
// Refresh failed and we we're already on page 1 => clear data
|
|
m_pages = 0;
|
|
emit pagesUpdated();
|
|
if (!m_data.isEmpty()) {
|
|
m_data.clear();
|
|
emit dataUpdated();
|
|
}
|
|
}
|
|
}
|
|
|
|
void PaginatedResource::update(const QVariantMap &data, int id)
|
|
{
|
|
m_manager->put(m_api->createRequest(m_path + resourceId.arg(QString::number(id))), data,
|
|
this, [this](QRestReply &reply) {
|
|
if (reply.isSuccess())
|
|
refreshCurrentPage();
|
|
});
|
|
}
|
|
|
|
void PaginatedResource::add(const QVariantMap &data)
|
|
{
|
|
m_manager->post(m_api->createRequest(m_path), data, this, [this](QRestReply &reply) {
|
|
if (reply.isSuccess())
|
|
refreshCurrentPage();
|
|
});
|
|
}
|
|
|
|
void PaginatedResource::remove(int id)
|
|
{
|
|
m_manager->deleteResource(m_api->createRequest(m_path + resourceId.arg(QString::number(id))),
|
|
this, [this](QRestReply &reply) {
|
|
if (reply.isSuccess())
|
|
refreshCurrentPage();
|
|
});
|
|
}
|