summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Discussions/JS.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/VNWeb/Discussions/JS.pm')
-rw-r--r--lib/VNWeb/Discussions/JS.pm45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/VNWeb/Discussions/JS.pm b/lib/VNWeb/Discussions/JS.pm
new file mode 100644
index 00000000..4c097830
--- /dev/null
+++ b/lib/VNWeb/Discussions/JS.pm
@@ -0,0 +1,45 @@
+package VNWeb::Discussions::JS;
+
+use VNWeb::Prelude;
+use VNWeb::Discussions::Lib;
+
+# Autocompletion search results for boards
+json_api qr{/t/boards.json}, {
+ search => {},
+}, sub {
+ return elm_Unauth if !auth->permBoard;
+ my $q = shift->{search};
+ my $qs = $q =~ s/[%_]//gr;
+
+ my sub subq {
+ my($prio, $where) = @_;
+ sql 'SELECT', $prio, ' AS prio, btype, iid, CASE WHEN iid = 0 THEN NULL ELSE title END AS title
+ FROM (',
+ sql_join('UNION ALL',
+ sql('SELECT btype, iid, title, original FROM', sql_boards(), 'a'),
+ map sql('SELECT', \$_, '::board_type, 0,', \$BOARD_TYPE{$_}{txt}, q{, ''}),
+ grep !$BOARD_TYPE{$_}{dbitem} && ($BOARD_TYPE{$_}{post_perm} eq 'board' || auth->permBoardmod),
+ keys %BOARD_TYPE
+ ),
+ ') x WHERE', $where
+ }
+
+ # This query is SLOW :(
+ elm_BoardResult tuwf->dbPagei({ results => 10, page => 1 },
+ 'SELECT btype, iid, title
+ FROM (',
+ sql_join('UNION ALL',
+ # ID match
+ $q =~ /^($BOARD_RE)$/ && $q =~ /^([a-z]+)([0-9]*)$/
+ ? subq(0, sql_and sql('btype =', \"$1"), $2 ? sql('iid =', \"$2") : ()) : (),
+ subq(
+ sql('1+LEAST(substr_score(lower(title),', \$qs, '), substr_score(lower(original),', \$qs, '))'),
+ sql('title ILIKE', \"%$qs%", ' OR original ILIKE', \"%$qs%")
+ )
+ ), ') x
+ GROUP BY btype, iid, title
+ ORDER BY MIN(prio), btype, iid'
+ )
+};
+
+1;