From e7e06284da6f912712fa691b082ad0f04736f688 Mon Sep 17 00:00:00 2001 From: Silvan Calarco Date: Sat, 6 Jul 2024 18:28:15 +0200 Subject: [PATCH] DistroqueryAPI: getRepositoryPackages: added support for query string --- src/DistroqueryAPI.cpp | 17 ++++++++++++++--- src/DistroqueryAPI.hpp | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/DistroqueryAPI.cpp b/src/DistroqueryAPI.cpp index 5a4ab2d..37919b4 100644 --- a/src/DistroqueryAPI.cpp +++ b/src/DistroqueryAPI.cpp @@ -104,7 +104,7 @@ json DistroqueryAPI::getPackageSourceDetailsById(configTag* ct, long id) { return j; } -json DistroqueryAPI::getRepositoryPackages(string repository, int per_page, int page) { +json DistroqueryAPI::getRepositoryPackages(string repository, int per_page, int page, string query) { json j; string sql; sqlite3_stmt *stmt; @@ -113,6 +113,7 @@ json DistroqueryAPI::getRepositoryPackages(string repository, int per_page, int j["query"]["repository"] = repository; j["query"]["per_page"] = per_page; j["query"]["page"] = page; + j["query"]["q"] = query; if (per_page < 1) { j["error"] = "'per_page' query var must be >= 1"; @@ -136,7 +137,13 @@ json DistroqueryAPI::getRepositoryPackages(string repository, int per_page, int return j; } - sql = "SELECT COUNT(*) OVER() AS total_count,* FROM sources ORDER BY name COLLATE NOCASE ASC" + string query_append; + if (query != "") + query_append = "WHERE name LIKE '%" + query + "%' OR summary LIKE '%" + query + + "%' OR description LIKE '%" + query + "%'"; + + sql = "SELECT COUNT(*) OVER() AS total_count,* FROM sources " + query_append + + " ORDER BY name COLLATE NOCASE ASC" " LIMIT " + to_string(per_page) + " OFFSET " + to_string(per_page * (page -1)); if (sqlite3_prepare_v2(db, sql.c_str(), sql.length(), &stmt, NULL) == SQLITE_OK) { @@ -442,6 +449,7 @@ void DistroqueryAPI::getApiResponse(string path_info) { // Pagination unsigned int per_page = 100; unsigned int page = 1; + string query; if (query_vars.find("per_page") != query_vars.end()) { try { per_page = atoi(query_vars["per_page"].c_str()); @@ -456,7 +464,10 @@ void DistroqueryAPI::getApiResponse(string path_info) { cerr << "Error converting '" << query_vars["page"] << " to int: " << e.what() << endl; } } - auto packages = getRepositoryPackages(path_split[1], per_page, page); + if (query_vars.find("q") != query_vars.end()) { + query = urlDecode(query_vars["q"]); + } + auto packages = getRepositoryPackages(path_split[1], per_page, page, query); cout << packages.dump(); } else if (path_split[0] == "package") { // API service: package diff --git a/src/DistroqueryAPI.hpp b/src/DistroqueryAPI.hpp index e71649b..4edb947 100644 --- a/src/DistroqueryAPI.hpp +++ b/src/DistroqueryAPI.hpp @@ -41,7 +41,7 @@ class DistroqueryAPI { configTag *config; json configToJsonRepositories(); void sendErrorResponse(string message); - json getRepositoryPackages(string repository, int per_page, int page); + json getRepositoryPackages(string repository, int per_page, int page, string query); json getPackageSourceDetailsById(configTag* ct, long id); json getPackageSourceDetails(string repository, string package); json getBuiltPackagesFromSourceID(configTag* ct, long id);