From 15619ed96cb4026a07819f2e457ef3bf98ac924b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 7 Jan 2024 09:09:22 +0100 Subject: [PATCH 01/14] Load comic number when getting the comics currently being read --- YACReaderLibrary/db_helper.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index c57d3dfe..3d8349dc 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -292,7 +292,7 @@ QList DBHelper::getReading(qulonglong libraryId) { QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlQuery selectQuery(db); - selectQuery.prepare("SELECT c.id,c.parentId,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio " + selectQuery.prepare("SELECT c.id,c.parentId,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio,ci.number " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "WHERE ci.hasBeenOpened = 1 AND ci.read = 0 " "ORDER BY ci.lastTimeOpened DESC"); @@ -301,6 +301,7 @@ QList DBHelper::getReading(qulonglong libraryId) while (selectQuery.next()) { ComicDB comic; + // TODO: use QVariant when possible to keep nulls comic.id = selectQuery.value(0).toULongLong(); comic.parentId = selectQuery.value(1).toULongLong(); comic.name = selectQuery.value(2).toString(); @@ -310,6 +311,7 @@ QList DBHelper::getReading(qulonglong libraryId) comic.info.hash = selectQuery.value(6).toString(); comic.info.read = selectQuery.value(7).toBool(); comic.info.coverSizeRatio = selectQuery.value(8).toFloat(); + comic.info.number = selectQuery.value(9); list.append(comic); } From 9e05f8ea6e8a3c9beb5c4131c62deebfc339e54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 7 Jan 2024 09:18:16 +0100 Subject: [PATCH 02/14] Add function for loading a single folder by id --- YACReaderLibrary/db_helper.cpp | 51 ++++++++++++++++++++++++++++++++++ YACReaderLibrary/db_helper.h | 1 + 2 files changed, 52 insertions(+) diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 3d8349dc..bad74177 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -189,6 +189,57 @@ QString DBHelper::getFolderName(qulonglong libraryId, qulonglong id) QSqlDatabase::removeDatabase(connectionName); return name; } + +Folder DBHelper::getFolder(qulonglong libraryId, qulonglong id) +{ + QString libraryPath = DBHelper::getLibraries().getPath(libraryId); + + Folder folder; + QString connectionName = ""; + + { + QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlQuery selectQuery(db); // TODO check + selectQuery.prepare("SELECT * FROM folder WHERE id = :id"); + selectQuery.bindValue(":id", id); + selectQuery.exec(); + + auto record = selectQuery.record(); + + int name = record.indexOf("name"); + int path = record.indexOf("path"); + int finished = record.indexOf("finished"); + int completed = record.indexOf("completed"); + int id = record.indexOf("id"); + int parentId = record.indexOf("parentId"); + int numChildren = record.indexOf("numChildren"); + int firstChildHash = record.indexOf("firstChildHash"); + int customImage = record.indexOf("customImage"); + int type = record.indexOf("type"); + int added = record.indexOf("added"); + int updated = record.indexOf("updated"); + + if (selectQuery.next()) { + folder = Folder(selectQuery.value(id).toULongLong(), parentId, selectQuery.value(name).toString(), selectQuery.value(path).toString()); + + folder.finished = selectQuery.value(finished).toBool(); + folder.completed = selectQuery.value(completed).toBool(); + if (!selectQuery.value(numChildren).isNull() && selectQuery.value(numChildren).isValid()) { + folder.numChildren = selectQuery.value(numChildren).toInt(); + } + folder.firstChildHash = selectQuery.value(firstChildHash).toString(); + folder.customImage = selectQuery.value(customImage).toString(); + folder.type = selectQuery.value(type).value(); + folder.added = selectQuery.value(added).toLongLong(); + folder.updated = selectQuery.value(updated).toLongLong(); + } + connectionName = db.connectionName(); + } + + QSqlDatabase::removeDatabase(connectionName); + return folder; +} + QList DBHelper::getLibrariesNames() { auto names = getLibraries().getNames(); diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 5f0ace4c..14dad9b1 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -31,6 +31,7 @@ public: static ComicDB getComicInfo(qulonglong libraryId, qulonglong id); static QList getSiblings(qulonglong libraryId, qulonglong parentId); static QString getFolderName(qulonglong libraryId, qulonglong id); + static Folder getFolder(qulonglong libraryId, qulonglong id); static QList getLibrariesNames(); static QString getLibraryName(int id); static QList getLabelComics(qulonglong libraryId, qulonglong labelId); From b4951fcb1ab587cafb1c7d12a9e411f687c43e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 7 Jan 2024 10:26:22 +0100 Subject: [PATCH 03/14] Add convenience method for getting the new uuid from the legacy id --- YACReaderLibrary/yacreader_libraries.cpp | 6 ++++++ YACReaderLibrary/yacreader_libraries.h | 1 + 2 files changed, 7 insertions(+) diff --git a/YACReaderLibrary/yacreader_libraries.cpp b/YACReaderLibrary/yacreader_libraries.cpp index 6067f7fb..da6a0c88 100644 --- a/YACReaderLibrary/yacreader_libraries.cpp +++ b/YACReaderLibrary/yacreader_libraries.cpp @@ -111,6 +111,12 @@ QList YACReaderLibraries::getLibraries() const return libraries; } +QUuid YACReaderLibraries::getLibraryIdFromLegacyId(int legacyId) const +{ + auto library = std::find_if(libraries.cbegin(), libraries.cend(), [legacyId](const YACReaderLibrary &library) { return library.getLegacyId() == legacyId; }); + return library != libraries.cend() ? library->getId() : QUuid(); +} + void YACReaderLibraries::addLibrary(const QString &name, const QString &path) { int legacyId = 0; diff --git a/YACReaderLibrary/yacreader_libraries.h b/YACReaderLibrary/yacreader_libraries.h index 255c4db3..5a425c7e 100644 --- a/YACReaderLibrary/yacreader_libraries.h +++ b/YACReaderLibrary/yacreader_libraries.h @@ -25,6 +25,7 @@ public: int getId(const QString &name); YACReaderLibraries &operator=(const YACReaderLibraries &source); QList getLibraries() const; + QUuid getLibraryIdFromLegacyId(int legacyId) const; public slots: void addLibrary(const QString &name, const QString &path); void load(); From 5728d4bb18f6bfe085a0be240cda77287fddc3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 7 Jan 2024 10:52:27 +0100 Subject: [PATCH 04/14] Add more info to json content + better handling of optionality --- .../v2/comicfullinfocontroller_v2.cpp | 8 +- .../controllers/v2/favoritescontroller_v2.cpp | 5 +- .../v2/foldercontentcontroller_v2.cpp | 7 +- .../v2/readingcomicscontroller_v2.cpp | 5 +- .../v2/readinglistcontentcontroller_v2.cpp | 5 +- .../v2/readinglistscontroller_v2.cpp | 5 +- .../v2/tagcontentcontroller_v2.cpp | 5 +- .../controllers/v2/tagscontroller_v2.cpp | 8 +- .../server/yacreader_server_data_helper.cpp | 163 ++++++++++++------ .../server/yacreader_server_data_helper.h | 10 +- 10 files changed, 148 insertions(+), 73 deletions(-) diff --git a/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp index 344d3a95..8bc43ce6 100644 --- a/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp @@ -4,12 +4,10 @@ #include "db_helper.h" #include "comic_db.h" -#include "folder.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" -#include "qnaturalsorting.h" - #include using stefanfrings::HttpRequest; @@ -35,9 +33,11 @@ void ComicFullinfoController_v2::service(HttpRequest &request, HttpResponse &res void ComicFullinfoController_v2::serviceContent(const int &libraryId, const qulonglong &comicId, HttpResponse &response) { + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(libraryId); + ComicDB comic = DBHelper::getComicInfo(libraryId, comicId); - QJsonObject json = YACReaderServerDataHelper::fullComicToJSON(libraryId, comic); + QJsonObject json = YACReaderServerDataHelper::fullComicToJSON(libraryId, libraryUuid, comic); QJsonDocument output(json); diff --git a/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp index 7717ee84..a7bc39fb 100644 --- a/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp @@ -3,6 +3,7 @@ #include "db_helper.h" #include "comic_db.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" using stefanfrings::HttpRequest; @@ -25,12 +26,14 @@ void FavoritesControllerV2::service(HttpRequest &request, HttpResponse &response void FavoritesControllerV2::serviceContent(const int library, HttpResponse &response) { + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library); + QList comics = DBHelper::getFavorites(library); QJsonArray items; for (const ComicDB &comic : comics) { - items.append(YACReaderServerDataHelper::comicToJSON(library, comic)); + items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic)); } QJsonDocument output(items); diff --git a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp index 9c59f67c..6f99993e 100644 --- a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp @@ -6,6 +6,7 @@ #include "comic_db.h" #include "folder.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" #include "qnaturalsorting.h" @@ -41,6 +42,8 @@ void FolderContentControllerV2::serviceContent(const int &library, const qulongl #ifdef QT_DEBUG auto started = std::chrono::high_resolution_clock::now(); #endif + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library); + QList folderContent = DBHelper::getFolderSubfoldersFromLibrary(library, folderId); QList folderComics = DBHelper::getFolderComicsFromLibrary(library, folderId); @@ -56,10 +59,10 @@ void FolderContentControllerV2::serviceContent(const int &library, const qulongl for (QList::const_iterator itr = folderContent.constBegin(); itr != folderContent.constEnd(); itr++) { if ((*itr)->isDir()) { currentFolder = (Folder *)(*itr); - items.append(YACReaderServerDataHelper::folderToJSON(library, *currentFolder)); + items.append(YACReaderServerDataHelper::folderToJSON(library, libraryUuid, *currentFolder)); } else { currentComic = (ComicDB *)(*itr); - items.append(YACReaderServerDataHelper::comicToJSON(library, *currentComic)); + items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, *currentComic)); } } diff --git a/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp index 6db58772..a63b3d7c 100644 --- a/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp @@ -3,6 +3,7 @@ #include "db_helper.h" #include "comic_db.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" using stefanfrings::HttpRequest; @@ -28,12 +29,14 @@ void ReadingComicsControllerV2::service(HttpRequest &request, HttpResponse &resp void ReadingComicsControllerV2::serviceContent(const int &library, HttpResponse &response) { + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library); + QList readingComics = DBHelper::getReading(library); QJsonArray comics; for (const ComicDB &comic : readingComics) { - comics.append(YACReaderServerDataHelper::comicToJSON(library, comic)); + comics.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic)); } QJsonDocument output(comics); diff --git a/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp index 4a502883..0abb55fc 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp @@ -3,6 +3,7 @@ #include "db_helper.h" #include "comic_db.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" using stefanfrings::HttpRequest; @@ -28,12 +29,14 @@ void ReadingListContentControllerV2::service(HttpRequest &request, HttpResponse void ReadingListContentControllerV2::serviceContent(const int &library, const qulonglong &readingListId, HttpResponse &response) { + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library); + QList comics = DBHelper::getReadingListFullContent(library, readingListId); QJsonArray items; for (const ComicDB &comic : comics) { - items.append(YACReaderServerDataHelper::comicToJSON(library, comic)); + items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic)); } QJsonDocument output(items); diff --git a/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.cpp index a791c121..63da5fab 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.cpp @@ -2,6 +2,7 @@ #include "db_helper.h" #include "reading_list.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" using stefanfrings::HttpRequest; @@ -26,12 +27,14 @@ void ReadingListsControllerV2::service(HttpRequest &request, HttpResponse &respo void ReadingListsControllerV2::serviceContent(const int library, HttpResponse &response) { + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library); + QList readingLists = DBHelper::getReadingLists(library); QJsonArray items; for (QList::const_iterator itr = readingLists.constBegin(); itr != readingLists.constEnd(); itr++) { - items.append(YACReaderServerDataHelper::readingListToJSON(library, *itr)); + items.append(YACReaderServerDataHelper::readingListToJSON(library, libraryUuid, *itr)); } QJsonDocument output(items); diff --git a/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp index 0aa353ec..8aca99cf 100644 --- a/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp @@ -3,6 +3,7 @@ #include "db_helper.h" #include "comic_db.h" +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" #include @@ -30,12 +31,14 @@ void TagContentControllerV2::service(HttpRequest &request, HttpResponse &respons void TagContentControllerV2::serviceContent(const int &library, const qulonglong &tagId, HttpResponse &response) { + auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library); + QList comics = DBHelper::getLabelComics(library, tagId); QJsonArray items; for (const ComicDB &comic : comics) { - items.append(YACReaderServerDataHelper::comicToJSON(library, comic)); + items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic)); } QJsonDocument output(items); diff --git a/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp index 954f1d03..28337ec7 100644 --- a/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp @@ -4,13 +4,9 @@ #include "yacreader_libraries.h" #include "reading_list.h" -#include "../static.h" -#include "yacreader_global.h" #include "yacreader_server_data_helper.h" -#include "QsLog.h" - using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; @@ -26,10 +22,12 @@ void TagsControllerV2::service(HttpRequest &request, HttpResponse &response) QList