Skip to content
Snippets Groups Projects
ocsapihandler.cpp 7.21 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
#include "ocsapihandler.h"
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
#include <QStringList>
akiraohgaki's avatar
akiraohgaki committed
#include <QJsonValue>

akiraohgaki's avatar
akiraohgaki committed
#include "qtil_ocsapi.h"
akiraohgaki's avatar
akiraohgaki committed

#include "handlers/confighandler.h"

akiraohgaki's avatar
akiraohgaki committed
OcsApiHandler::OcsApiHandler(ConfigHandler *configHandler, QObject *parent)
akiraohgaki's avatar
akiraohgaki committed
    : QObject(parent), configHandler_(configHandler)
{}

akiraohgaki's avatar
akiraohgaki committed
bool OcsApiHandler::addProviders(const QString &providerFileUrl) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto providers = Qtil::OcsApi::getProviderFile(QUrl(providerFileUrl));
akiraohgaki's avatar
akiraohgaki committed
    if (!providers.isEmpty()) {
akiraohgaki's avatar
akiraohgaki committed
        for (const auto providerValue : providers) {
akiraohgaki's avatar
akiraohgaki committed
            auto provider = providerValue.toObject();
akiraohgaki's avatar
akiraohgaki committed
            if (provider.contains("location")) {
                // Use location (API base URL) as unique key
akiraohgaki's avatar
akiraohgaki committed
                auto providerKey = provider["location"].toString();
akiraohgaki's avatar
akiraohgaki committed
                if (configHandler_->setUsrConfigProvidersProvider(providerKey, provider)) {
                    updateCategories(providerKey, true);
                }
            }
        }
        return true;
    }
    return false;
}

akiraohgaki's avatar
akiraohgaki committed
bool OcsApiHandler::removeProvider(const QString &providerKey) const
akiraohgaki's avatar
akiraohgaki committed
{
    if (configHandler_->removeUsrConfigProvidersProvider(providerKey)) {
        configHandler_->removeUsrConfigCategoriesProvider(providerKey);
        return true;
    }
    return false;
}

akiraohgaki's avatar
akiraohgaki committed
bool OcsApiHandler::updateAllCategories(bool force) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto providers = configHandler_->getUsrConfigProviders();
akiraohgaki's avatar
akiraohgaki committed
    if (!providers.isEmpty()) {
akiraohgaki's avatar
akiraohgaki committed
        for (const auto &providerKey : providers.keys()) {
akiraohgaki's avatar
akiraohgaki committed
            updateCategories(providerKey, force);
        }
        return true;
    }
    return false;
}

akiraohgaki's avatar
akiraohgaki committed
bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto providers = configHandler_->getUsrConfigProviders();
akiraohgaki's avatar
akiraohgaki committed

    if (!providers.contains(providerKey)) {
        return false;
    }

akiraohgaki's avatar
akiraohgaki committed
    auto baseUrl = providers[providerKey].toObject()["location"].toString();
akiraohgaki's avatar
akiraohgaki committed
    auto response = Qtil::OcsApi(baseUrl, QUrl(baseUrl)).getContentCategories();
akiraohgaki's avatar
akiraohgaki committed

    if (!response.contains("data")) {
        return false;
    }

    // Data type variation workaround, convert object to array
    QJsonArray responseData;
    if (response["data"].isObject()) {
akiraohgaki's avatar
akiraohgaki committed
        for (const auto dataValue : response["data"].toObject()) {
akiraohgaki's avatar
akiraohgaki committed
            responseData.append(dataValue);
        }
    }
    else {
        responseData = response["data"].toArray();
    }

akiraohgaki's avatar
akiraohgaki committed
    auto installTypes = configHandler_->getAppConfigInstallTypes();
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    auto categories = configHandler_->getUsrConfigCategories();
akiraohgaki's avatar
akiraohgaki committed
    QJsonObject providerCategories;
    if (!force && categories.contains(providerKey)) {
        providerCategories = categories[providerKey].toObject();
    }

    QJsonObject newProviderCategories;
akiraohgaki's avatar
akiraohgaki committed
    for (const auto dataValue : responseData) {
akiraohgaki's avatar
akiraohgaki committed
        auto data = dataValue.toObject();
akiraohgaki's avatar
akiraohgaki committed

        // Data type variation workaround, convert int to string
        QString id;
        if (data["id"].isString()) {
            id = data["id"].toString();
        }
        else {
            id = QString::number(data["id"].toInt());
        }

        // Use category id as unique key
akiraohgaki's avatar
akiraohgaki committed
        auto categoryKey = id;
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
        auto name = data["name"].toString();
akiraohgaki's avatar
akiraohgaki committed
        // display_name: Not compatible to legacy OCS-API
        if (data.contains("display_name") && data["display_name"].toString() != "") {
            name = data["display_name"].toString();
        }

        // parent_id: Not compatible to legacy OCS-API
        QString parentId = "";
        if (data.contains("parent_id") && data["parent_id"].toString() != "") {
            parentId = data["parent_id"].toString();
        }

akiraohgaki's avatar
akiraohgaki committed
        auto installType = configHandler_->getAppConfigApplication()["options"].toObject()["default_install_type"].toString();
akiraohgaki's avatar
akiraohgaki committed
        if (!force && providerCategories.contains(categoryKey)) {
            installType = providerCategories[categoryKey].toObject()["install_type"].toString();
        }
        // xdg_type: Not compatible to legacy OCS-API
        else if (data.contains("xdg_type") && data["xdg_type"].toString() != ""
                && installTypes.contains(data["xdg_type"].toString())) {
            installType = data["xdg_type"].toString();
        }

        QJsonObject category;
        category["id"] = id;
        category["name"] = name;
        category["parent_id"] = parentId;
        category["install_type"] = installType;
        newProviderCategories[categoryKey] = category;
    }

    return configHandler_->setUsrConfigCategoriesProvider(providerKey, newProviderCategories);
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject OcsApiHandler::getContents(const QString &providerKeys, const QString &categoryKeys,
akiraohgaki's avatar
akiraohgaki committed
                                       const QString &xdgTypes, const QString &packageTypes,
akiraohgaki's avatar
akiraohgaki committed
                                       const QString &search, const QString &sortmode, int pagesize, int page) const
akiraohgaki's avatar
akiraohgaki committed
{
    QJsonObject responseSet;

    QStringList providerKeyList;
    if (!providerKeys.isEmpty()) {
        providerKeyList = providerKeys.split(",");
    }

    QStringList categoryKeyList;
    if (!categoryKeys.isEmpty()) {
        categoryKeyList = categoryKeys.split(",");
    }

akiraohgaki's avatar
akiraohgaki committed
    auto providers = configHandler_->getUsrConfigProviders();
    auto categories = configHandler_->getUsrConfigCategories();
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    for (const auto &providerKey : providers.keys()) {
akiraohgaki's avatar
akiraohgaki committed
        if (!providerKeyList.isEmpty() && !providerKeyList.contains(providerKey)) {
            continue;
        }
        QStringList categoryIdList;
akiraohgaki's avatar
akiraohgaki committed
        auto providerCategories = categories[providerKey].toObject();
        for (const auto &categoryKey : providerCategories.keys()) {
akiraohgaki's avatar
akiraohgaki committed
            if (!categoryKeyList.isEmpty() && !categoryKeyList.contains(categoryKey)) {
                continue;
            }
            categoryIdList.append(providerCategories[categoryKey].toObject()["id"].toString());
        }
        if (!categoryIdList.isEmpty()) {
akiraohgaki's avatar
akiraohgaki committed
            auto baseUrl = providers[providerKey].toObject()["location"].toString();
akiraohgaki's avatar
akiraohgaki committed
            QUrlQuery query;
            // categories: Comma-separated list is not compatible to legacy OCS-API
            //query.addQueryItem("categories", categoryIdList.join(","));
            query.addQueryItem("categories", categoryIdList.join("x"));
            // xdg_types: Not compatible to legacy OCS-API
            if (!xdgTypes.isEmpty()) {
                query.addQueryItem("xdg_types", xdgTypes);
            }
            // package_types: Not compatible to legacy OCS-API
            if (!packageTypes.isEmpty()) {
                query.addQueryItem("package_types", packageTypes);
            }
            if (!search.isEmpty()) {
                query.addQueryItem("search", search);
            }
            query.addQueryItem("sortmode", sortmode);
            query.addQueryItem("pagesize", QString::number(pagesize));
            query.addQueryItem("page", QString::number(page));
akiraohgaki's avatar
akiraohgaki committed
            responseSet[providerKey] = Qtil::OcsApi(baseUrl, QUrl(baseUrl)).getContentDataSet(query);
akiraohgaki's avatar
akiraohgaki committed
        }
    }

    return responseSet;
}

akiraohgaki's avatar
akiraohgaki committed
QJsonObject OcsApiHandler::getContent(const QString &providerKey, const QString &contentId) const
akiraohgaki's avatar
akiraohgaki committed
{
    QJsonObject response;
akiraohgaki's avatar
akiraohgaki committed
    auto providers = configHandler_->getUsrConfigProviders();
akiraohgaki's avatar
akiraohgaki committed
    if (providers.contains(providerKey)) {
akiraohgaki's avatar
akiraohgaki committed
        auto baseUrl = providers[providerKey].toObject()["location"].toString();
akiraohgaki's avatar
akiraohgaki committed
        response = Qtil::OcsApi(baseUrl, QUrl(baseUrl)).getContentData(contentId);
akiraohgaki's avatar
akiraohgaki committed
    }
    return response;
}