diff --git a/include/library.h b/include/library.h index 53dec415..86dfafae 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 0dad7479..c9855bd9 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 4dd34327..c2ccfd74 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 c1c24015..d4bd59de 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" + ); +}