From b5c1b26761e62f71e19b89b3f8003f5d08c165c4 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 16 May 2021 01:10:43 +0400 Subject: [PATCH] OpdsCatalog::getSearchUrl() --- include/opds_catalog.h | 33 ++++++++++++++++ src/meson.build | 3 +- src/opds_catalog.cpp | 74 ++++++++++++++++++++++++++++++++++++ test/meson.build | 1 + test/opds_catalog.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 include/opds_catalog.h create mode 100644 src/opds_catalog.cpp create mode 100644 test/opds_catalog.cpp diff --git a/include/opds_catalog.h b/include/opds_catalog.h new file mode 100644 index 000000000..47d03fb0c --- /dev/null +++ b/include/opds_catalog.h @@ -0,0 +1,33 @@ +/* + * Copyright 2021 Veloman Yunkan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef KIWIX_OPDS_CATALOG_H +#define KIWIX_OPDS_CATALOG_H + + +#include "library.h" + +namespace kiwix +{ + +std::string getSearchUrl(const Filter& f); + +} // namespace kiwix + +#endif // KIWIX_OPDS_CATALOG_H diff --git a/src/meson.build b/src/meson.build index d4c4f9697..7d6dab9c1 100644 --- a/src/meson.build +++ b/src/meson.build @@ -26,7 +26,8 @@ kiwix_sources = [ 'server/request_context.cpp', 'server/response.cpp', 'server/internalServer.cpp', - 'server/internalServer_catalog_v2.cpp' + 'server/internalServer_catalog_v2.cpp', + 'opds_catalog.cpp' ] kiwix_sources += lib_resources diff --git a/src/opds_catalog.cpp b/src/opds_catalog.cpp new file mode 100644 index 000000000..ee7dacb3e --- /dev/null +++ b/src/opds_catalog.cpp @@ -0,0 +1,74 @@ +/* + * Copyright 2021 Veloman Yunkan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include "opds_catalog.h" +#include "tools/stringTools.h" + +#include + +namespace kiwix +{ + +namespace +{ +const char opdsSearchEndpoint[] = "/catalog/v2/entries"; + +enum Separator { AMP }; + +std::ostringstream& operator<<(std::ostringstream& oss, Separator sep) +{ + if ( oss.tellp() > 0 ) + oss << "&"; + return oss; +} + +std::string buildSearchString(const Filter& f) +{ + std::ostringstream oss; + if ( f.hasQuery() ) + oss << AMP << "q=" << urlEncode(f.getQuery()); + + if ( f.hasCategory() ) + oss << AMP << "category=" << urlEncode(f.getCategory()); + + if ( f.hasLang() ) + oss << AMP << "lang=" << urlEncode(f.getLang()); + + if ( f.hasName() ) + oss << AMP << "name=" << urlEncode(f.getName()); + + if ( !f.getAcceptTags().empty() ) + oss << AMP << "tag=" << urlEncode(join(f.getAcceptTags(), ";")); + + return oss.str(); +} + +} // unnamed namespace + +std::string getSearchUrl(const Filter& f) +{ + const std::string searchString = buildSearchString(f); + + if ( searchString.empty() ) + return opdsSearchEndpoint; + else + return opdsSearchEndpoint + ("?" + searchString); +} + +} // namespace kiwix diff --git a/test/meson.build b/test/meson.build index 15d878e55..924202088 100644 --- a/test/meson.build +++ b/test/meson.build @@ -8,6 +8,7 @@ tests = [ 'kiwixserve', 'book', 'manager', + 'opds_catalog', ] if build_machine.system() != 'windows' diff --git a/test/opds_catalog.cpp b/test/opds_catalog.cpp new file mode 100644 index 000000000..6647d5a32 --- /dev/null +++ b/test/opds_catalog.cpp @@ -0,0 +1,85 @@ +/* + * Copyright 2021 Veloman Yunkan + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and + * NON-INFRINGEMENT. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "../include/opds_catalog.h" + +#include "gtest/gtest.h" + +using namespace kiwix; + +TEST(OpdsCatalog, getSearchUrl) +{ + #define EXPECT_SEARCH_URL(url) EXPECT_EQ(url, getSearchUrl(f)) + { + Filter f; + EXPECT_SEARCH_URL("/catalog/v2/entries"); + } + { + Filter f; + f.query("abc"); + EXPECT_SEARCH_URL("/catalog/v2/entries?q=abc"); + } + { + Filter f; + f.query("abc def"); + EXPECT_SEARCH_URL("/catalog/v2/entries?q=abc%20def"); + } + { + Filter f; + f.category("ted"); + EXPECT_SEARCH_URL("/catalog/v2/entries?category=ted"); + } + { + Filter f; + f.lang("eng"); + EXPECT_SEARCH_URL("/catalog/v2/entries?lang=eng"); + } + { + Filter f; + f.name("second"); + EXPECT_SEARCH_URL("/catalog/v2/entries?name=second"); + } + { + Filter f; + f.acceptTags({"paper", "plastic"}); + EXPECT_SEARCH_URL("/catalog/v2/entries?tag=paper;plastic"); + } + { + Filter f; + f.query("abc"); + f.category("ted"); + EXPECT_SEARCH_URL("/catalog/v2/entries?q=abc&category=ted"); + } + { + Filter f; + f.category("ted"); + f.query("abc"); + EXPECT_SEARCH_URL("/catalog/v2/entries?q=abc&category=ted"); + } + { + Filter f; + f.query("peru"); + f.category("scifi"); + f.lang("html"); + f.name("edsonarantesdonascimento"); + f.acceptTags({"body", "script"}); + EXPECT_SEARCH_URL("/catalog/v2/entries?q=peru&category=scifi&lang=html&name=edsonarantesdonascimento&tag=body;script"); + } + #undef EXPECT_SEARCH_URL +}