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"