From 3a9fd38cb08f68046d4c662957e2489058efc947 Mon Sep 17 00:00:00 2001 From: Shish Date: Sun, 15 Nov 2020 12:18:23 +0000 Subject: [PATCH] extract autocomplete code for later api-isation --- ext/autocomplete/main.php | 96 +++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/ext/autocomplete/main.php b/ext/autocomplete/main.php index 0ede9244..ae2142fe 100644 --- a/ext/autocomplete/main.php +++ b/ext/autocomplete/main.php @@ -12,58 +12,66 @@ class AutoComplete extends Extension public function onPageRequest(PageRequestEvent $event) { - global $cache, $page, $database; + global $page; if ($event->page_matches("api/internal/autocomplete")) { - if (!isset($_GET["s"])) { - return; - } + $limit = $_GET["limit"] ?? 0; + $s = $_GET["s"] ?? null; + + $res = $this->complete($s, $limit); $page->set_mode(PageMode::DATA); $page->set_mime(MimeType::JSON); - - $s = strtolower($_GET["s"]); - if ( - $s == '' || - $s[0] == '_' || - $s[0] == '%' || - strlen($s) > 32 - ) { - $page->set_data("{}"); - return; - } - - //$limit = 0; - $cache_key = "autocomplete-$s"; - $limitSQL = ""; - $s = str_replace('_', '\_', $s); - $s = str_replace('%', '\%', $s); - $SQLarr = ["search"=>"$s%"]; #, "cat_search"=>"%:$s%"]; - if (isset($_GET["limit"]) && $_GET["limit"] !== 0) { - $limitSQL = "LIMIT :limit"; - $SQLarr['limit'] = $_GET["limit"]; - $cache_key .= "-" . $_GET["limit"]; - } - - $res = $cache->get($cache_key); - if (!$res) { - $res = $database->get_pairs( - " - SELECT tag, count - FROM tags - WHERE LOWER(tag) LIKE LOWER(:search) - -- OR LOWER(tag) LIKE LOWER(:cat_search) - AND count > 0 - ORDER BY count DESC - $limitSQL", - $SQLarr - ); - $cache->set($cache_key, $res, 600); - } - $page->set_data(json_encode($res)); } $this->theme->build_autocomplete($page); } + + private function complete(string $search, int $limit): array { + global $cache, $database; + + if (!$search) { + return []; + } + + $search = strtolower($search); + if ( + $search == '' || + $search[0] == '_' || + $search[0] == '%' || + strlen($search) > 32 + ) { + return []; + } + + $cache_key = "autocomplete-$search"; + $limitSQL = ""; + $search = str_replace('_', '\_', $search); + $search = str_replace('%', '\%', $search); + $SQLarr = ["search"=>"$search%"]; #, "cat_search"=>"%:$search%"]; + if ($limit !== 0) { + $limitSQL = "LIMIT :limit"; + $SQLarr['limit'] = $limit; + $cache_key .= "-" . $limit; + } + + $res = $cache->get($cache_key); + if (!$res) { + $res = $database->get_pairs(" + SELECT tag, count + FROM tags + WHERE LOWER(tag) LIKE LOWER(:search) + -- OR LOWER(tag) LIKE LOWER(:cat_search) + AND count > 0 + ORDER BY count DESC + $limitSQL + ", + $SQLarr + ); + $cache->set($cache_key, $res, 600); + } + + return $res; + } }