File indexing completed on 2025-02-02 05:02:27

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "documentmanager.h"
0008 
0009 #include "jsonio.h"
0010 #include "logging.h"
0011 
0012 #include <KItinerary/CreativeWork>
0013 #include <KItinerary/File>
0014 #include <KItinerary/JsonLdDocument>
0015 
0016 #include <QDebug>
0017 #include <QDir>
0018 #include <QDirIterator>
0019 #include <QJsonObject>
0020 #include <QStandardPaths>
0021 #include <QVariant>
0022 
0023 using namespace KItinerary;
0024 
0025 DocumentManager::DocumentManager(QObject* parent)
0026     : QObject(parent)
0027 {
0028 }
0029 
0030 DocumentManager::~DocumentManager() = default;
0031 
0032 QVector<QString> DocumentManager::documents() const
0033 {
0034     QVector<QString> docs;
0035 
0036     QDirIterator it(basePath(), QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
0037     while (it.hasNext()) {
0038         it.next();
0039         docs.push_back(it.fileName());
0040     }
0041 
0042     return docs;
0043 }
0044 
0045 bool DocumentManager::hasDocument(const QString& id) const
0046 {
0047     return QDir(basePath() + id).exists();
0048 }
0049 
0050 QVariant DocumentManager::documentInfo(const QString &id) const
0051 {
0052     const QString filePath = basePath() + id + QLatin1StringView("/meta.json");
0053     QFile f(filePath);
0054     if (!f.open(QFile::ReadOnly)) {
0055         qCWarning(Log) << "Failed to load document meta data" << filePath << f.errorString();
0056         return {};
0057     }
0058     return JsonLdDocument::fromJsonSingular(JsonIO::read(f.readAll()).toObject());
0059 }
0060 
0061 QString DocumentManager::documentFilePath(const QString &id) const
0062 {
0063     const auto info = documentInfo(id);
0064     const auto fileName = JsonLdDocument::readProperty(info, "name").toString();
0065     return basePath() + id + QLatin1Char('/') + fileName;
0066 }
0067 
0068 void DocumentManager::addDocument(const QString &id, const QVariant &info, const QByteArray &data)
0069 {
0070     if (!JsonLd::canConvert<CreativeWork>(info)) {
0071         qCWarning(Log) << "Invalid document meta data" << info;
0072         return;
0073     }
0074     if (id.isEmpty()) {
0075         qCWarning(Log) << "Trying to add a document with an empty identifier!";
0076         return;
0077     }
0078 
0079     const QString path = basePath() + id + QLatin1Char('/');
0080     QDir().mkpath(path);
0081 
0082     const auto fileName = File::normalizeDocumentFileName(JsonLdDocument::readProperty(info, "name").toString());
0083     auto normalizedDocInfo = info;
0084     JsonLdDocument::writeProperty(normalizedDocInfo, "name", fileName);
0085 
0086     QFile dataFile(path + fileName);
0087     if (!dataFile.open(QFile::WriteOnly)) {
0088         qCWarning(Log) << "Failed to store document to" << path << fileName << dataFile.errorString();
0089         // TODO error message for the ui
0090         return;
0091     }
0092     dataFile.write(data);
0093     dataFile.close();
0094 
0095     QFile metaFile(path + QLatin1StringView("meta.json"));
0096     if (!metaFile.open(QFile::WriteOnly)) {
0097         qCWarning(Log) << "Failed to store document meta data" << path << metaFile.errorString();
0098         // TODO error message for the ui
0099         return;
0100     }
0101     metaFile.write(JsonIO::write(JsonLdDocument::toJson(normalizedDocInfo)));
0102     metaFile.close();
0103     Q_EMIT documentAdded(id);
0104 }
0105 
0106 void DocumentManager::addDocument(const QString& id, const QVariant& info, const QString& filePath)
0107 {
0108     if (!JsonLd::canConvert<CreativeWork>(info)) {
0109         qCWarning(Log) << "Invalid document meta data" << info;
0110         return;
0111     }
0112     if (id.isEmpty()) {
0113         qCWarning(Log) << "Trying to add a document with an empty identifier!";
0114         return;
0115     }
0116 
0117     const QString path = basePath() + id + QLatin1Char('/');
0118     QDir().mkpath(path);
0119 
0120     const auto fileName = File::normalizeDocumentFileName(JsonLdDocument::readProperty(info, "name").toString());
0121     auto normalizedDocInfo = info;
0122     JsonLdDocument::writeProperty(normalizedDocInfo, "name", fileName);
0123 
0124     if (!QFile::copy(filePath, path + fileName)) {
0125         qCWarning(Log) << "Failed to copy document from" << filePath << "to" << path << fileName;
0126         // TODO error message for the ui
0127         return;
0128     }
0129 
0130     QFile metaFile(path + QLatin1StringView("meta.json"));
0131     if (!metaFile.open(QFile::WriteOnly)) {
0132         qCWarning(Log) << "Failed to store document meta data" << path << metaFile.errorString();
0133         // TODO error message for the ui
0134         return;
0135     }
0136     metaFile.write(JsonIO::write(JsonLdDocument::toJson(normalizedDocInfo)));
0137     metaFile.close();
0138     Q_EMIT documentAdded(id);
0139 }
0140 
0141 void DocumentManager::removeDocument(const QString& id)
0142 {
0143     const QString path = basePath() + id;
0144     QDir docDir(path);
0145     if (!docDir.removeRecursively()) {
0146         qCWarning(Log) << "Failed to delete directory" << path;
0147     }
0148     Q_EMIT documentRemoved(id);
0149 }
0150 
0151 QString DocumentManager::basePath() const
0152 {
0153     return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QLatin1StringView("/documents/");
0154 }
0155 
0156 #include "moc_documentmanager.cpp"