From e55bf514e8036d8492aa306ac3071e3cce005218 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Fri, 5 Mar 2021 19:24:59 +0400 Subject: [PATCH] Dedicated 'category' parameter in catalog search --- include/library.h | 2 ++ src/library.cpp | 9 +++++++++ src/server/internalServer.cpp | 3 +++ test/server.cpp | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/include/library.h b/include/library.h index 53dec415a..86dfafaee 100644 --- a/include/library.h +++ b/include/library.h @@ -52,6 +52,7 @@ class Filter { uint64_t activeFilters; std::vector _acceptTags; std::vector _rejectTags; + std::string _category; std::string _lang; std::string _publisher; std::string _creator; @@ -96,6 +97,7 @@ class Filter { Filter& acceptTags(std::vector tags); Filter& rejectTags(std::vector tags); + Filter& category(std::string category); Filter& lang(std::string lang); Filter& publisher(std::string publisher); Filter& creator(std::string creator); diff --git a/src/library.cpp b/src/library.cpp index 0dad74794..c9855bd94 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -391,6 +391,7 @@ enum filterTypes { MAXSIZE = FLAG(11), QUERY = FLAG(12), NAME = FLAG(13), + CATEGORY = FLAG(14), }; Filter& Filter::local(bool accept) @@ -443,6 +444,13 @@ Filter& Filter::rejectTags(std::vector tags) return *this; } +Filter& Filter::category(std::string category) +{ + _category = category; + activeFilters |= CATEGORY; + return *this; +} + Filter& Filter::lang(std::string lang) { _lang = lang; @@ -502,6 +510,7 @@ bool Filter::accept(const Book& book) const FILTER(_NOREMOTE, !remote) FILTER(MAXSIZE, book.getSize() <= _maxSize) + FILTER(CATEGORY, book.getCategory() == _category) FILTER(LANG, book.getLanguage() == _lang) FILTER(_PUBLISHER, book.getPublisher() == _publisher) FILTER(_CREATOR, book.getCreator() == _creator) diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 4dd343274..c2ccfd742 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -698,6 +698,9 @@ InternalServer::search_catalog(const RequestContext& request, try { filter.name(request.get_argument("name")); } catch (const std::out_of_range&) {} + try { + filter.category(request.get_argument("category")); + } catch (const std::out_of_range&) {} try { filter.lang(request.get_argument("lang")); } catch (const std::out_of_range&) {} diff --git a/test/server.cpp b/test/server.cpp index c1c240157..d4bd59de1 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -769,3 +769,21 @@ TEST_F(LibraryServerTest, catalog_search_by_tag) "\n" ); } + +TEST_F(LibraryServerTest, catalog_search_by_category) +{ + const auto r = zfs1_->GET("/catalog/search?category=jazz"); + EXPECT_EQ(r->status, 200); + EXPECT_EQ(maskVariableOPDSFeedData(r->body), + OPDS_FEED_TAG + " 12345678-90ab-cdef-1234-567890abcdef\n" + " Search result for <Empty query>\n" + " YYYY-MM-DDThh:mm:ssZ\n" + " 1\n" + " 0\n" + " 1\n" + CATALOG_LINK_TAGS + CHARLES_RAY_CATALOG_ENTRY + "\n" + ); +}