Preliminary version of /catalog/v2/languages

This commit is contained in:
Veloman Yunkan
2021-06-11 12:55:04 +04:00
committed by Matthieu Gautier
parent 64b55dbdc7
commit 5f90f5ee2a
7 changed files with 143 additions and 0 deletions

View File

@ -22,6 +22,7 @@
#include "kiwixlib-resources.h"
#include <mustache.hpp>
#include <unicode/locid.h>
#include "tools/stringTools.h"
#include "tools/otherTools.h"
@ -83,6 +84,24 @@ BookData getBookData(const Library* library, const std::vector<std::string>& boo
return bookData;
}
struct LangInfo {
std::string selfName, englishName;
};
std::map<std::string, LangInfo> langMap = {
{"eng", { "English", "English"} },
{"fra", { "Français", "French"} },
{"rus", { "Русский", "Russian"} },
};
std::string getLanguageSelfName(const std::string& lang) {
return langMap.at(lang).selfName;
};
std::string getLanguageEnglishName(const std::string& lang) {
return langMap.at(lang).englishName;
};
} // unnamed namespace
string OPDSDumper::dumpOPDSFeed(const std::vector<std::string>& bookIds, const std::string& query) const
@ -146,4 +165,31 @@ std::string OPDSDumper::categoriesOPDSFeed(const std::vector<std::string>& categ
);
}
std::string OPDSDumper::languagesOPDSFeed() const
{
const auto now = gen_date_str();
kainjow::mustache::list languageData;
for ( const auto& languageCode : library->getBooksLanguages() ) {
const auto languageSelfName = getLanguageSelfName(languageCode);
const auto languageEnglishName = getLanguageEnglishName(languageCode);
languageData.push_back(kainjow::mustache::object{
{"lang_code", languageCode},
{"lang_self_name", languageSelfName},
{"lang_english_name", languageEnglishName},
{"updated", now},
{"id", gen_uuid(libraryId + "/languages/" + languageCode)}
});
}
return render_template(
RESOURCE::templates::catalog_v2_languages_xml,
kainjow::mustache::object{
{"date", now},
{"endpoint_root", rootLocation + "/catalog/v2"},
{"feed_id", gen_uuid(libraryId + "/languages")},
{"languages", languageData }
}
);
}
}

View File

@ -77,6 +77,7 @@ class InternalServer {
std::unique_ptr<Response> handle_catalog_v2_root(const RequestContext& request);
std::unique_ptr<Response> handle_catalog_v2_entries(const RequestContext& request);
std::unique_ptr<Response> handle_catalog_v2_categories(const RequestContext& request);
std::unique_ptr<Response> handle_catalog_v2_languages(const RequestContext& request);
std::unique_ptr<Response> handle_meta(const RequestContext& request);
std::unique_ptr<Response> handle_search(const RequestContext& request);
std::unique_ptr<Response> handle_suggest(const RequestContext& request);

View File

@ -59,6 +59,8 @@ std::unique_ptr<Response> InternalServer::handle_catalog_v2(const RequestContext
return handle_catalog_v2_entries(request);
} else if (url == "categories") {
return handle_catalog_v2_categories(request);
} else if (url == "languages") {
return handle_catalog_v2_languages(request);
} else {
return Response::build_404(*this, request, "", "");
}
@ -107,4 +109,16 @@ std::unique_ptr<Response> InternalServer::handle_catalog_v2_categories(const Req
);
}
std::unique_ptr<Response> InternalServer::handle_catalog_v2_languages(const RequestContext& request)
{
OPDSDumper opdsDumper(mp_library);
opdsDumper.setRootLocation(m_root);
opdsDumper.setLibraryId(m_library_id);
return ContentResponse::build(
*this,
opdsDumper.languagesOPDSFeed(),
"application/atom+xml;profile=opds-catalog;kind=navigation"
);
}
} // namespace kiwix