selfhostable, read-only reddit client

allow post search

Changed files
+120 -3
src
+1
flake.nix
··· 103 103 nativeBuildInputs = [ 104 104 pkgs.bun 105 105 pkgs.biome 106 + pkgs.typescript-language-server 106 107 ]; 107 108 }); 108 109
+40 -1
src/routes/index.js
··· 102 102 res.render("subs", { subs, user: req.user }); 103 103 }); 104 104 105 - // GET /search-subreddits 105 + // GET /search 106 106 router.get("/search", authenticateToken, async (req, res) => { 107 + res.render("search", { user: req.user }); 108 + }); 109 + 110 + // GET /sub-search 111 + router.get("/sub-search", authenticateToken, async (req, res) => { 107 112 if (!req.query || !req.query.q) { 108 113 res.render("sub-search", { user: req.user }); 109 114 } else { ··· 133 138 res.render("sub-search", { 134 139 items, 135 140 subs, 141 + after, 142 + message, 143 + user: req.user, 144 + original_query: req.query.q, 145 + }); 146 + } 147 + }); 148 + 149 + // GET /post-search 150 + router.get("/post-search", authenticateToken, async (req, res) => { 151 + if (!req.query || !req.query.q) { 152 + res.render("post-search", { user: req.user }); 153 + } else { 154 + const { q, options } = req.query.q.split(/\s+/).reduce( 155 + (acc, word) => { 156 + if (word.startsWith("+")) { 157 + acc.options.push(word.slice(1)); 158 + } else { 159 + acc.q += `${word} `; 160 + } 161 + return acc; 162 + }, 163 + { options: [], q: "" }, 164 + ); 165 + 166 + const { items, after } = await G.searchSubmissions(q, { 167 + include_over_18: options.includes("nsfw"), 168 + }); 169 + const message = 170 + items.length === 0 171 + ? "no results found" 172 + : `showing ${items.length} results`; 173 + res.render("post-search", { 174 + items, 136 175 after, 137 176 message, 138 177 user: req.user,
+23
src/views/post-search.pug
··· 1 + include ../mixins/post 2 + include ../mixins/header 3 + include ../mixins/head 4 + 5 + doctype html 6 + html 7 + +head("search posts") 8 + include ../mixins/subUtils 9 + body 10 + main#content 11 + +header(user) 12 + div.hero 13 + h1 search posts 14 + form(action="/post-search" method="get").search-bar 15 + - var prefill = original_query ?? ""; 16 + input(type="text" name="q" placeholder="search posts" value=prefill required).search-input 17 + button(type="submit").search-button go 18 + if message 19 + div.search-message 20 + i #{message} 21 + if items 22 + each item in items 23 + +post(item.data)
+54
src/views/search.pug
··· 1 + include ../mixins/header 2 + include ../mixins/head 3 + 4 + doctype html 5 + html 6 + +head("search subreddits") 7 + include ../mixins/subUtils 8 + body 9 + main#content 10 + +header(user) 11 + div.hero 12 + h1 search subreddits 13 + 14 + form(action="/sub-search" method="get").search-bar 15 + - var prefill = original_query ?? ""; 16 + input(type="text" name="q" placeholder="search subreddits" value=prefill required).search-input 17 + button(type="submit").search-button go 18 + 19 + h1 search posts 20 + 21 + form(action="/post-search" method="get").search-bar 22 + - var prefill = original_query ?? ""; 23 + input(type="text" name="q" placeholder="search posts" value=prefill required).search-input 24 + button(type="submit").search-button go 25 + 26 + hr 27 + 28 + h3 tips 29 + p 30 + | you can narrow search results using filters: 31 + br 32 + - 33 + var triples = [ 34 + ["subreddit", "ohio", "find submissions in 'r/ohio'"], 35 + ["author", "spez", "find submissions by 'u/spez'"], 36 + ["site", "x.com", "find submissions from 'x.com'"], 37 + ["url", "text", "search for 'text' in url"], 38 + ["selftext", "text", "search for 'text' in post contents"], 39 + ["self", "yes/no", "include/exclude selftext posts"], 40 + ["nsfw", "yes/no", "include/exclude over-18 posts"], 41 + ] 42 + 43 + ul 44 + each triple in triples 45 + li 46 + strong 47 + | #{triple[0]}: 48 + em #{triple[1]} 49 + |     #{triple[2]} 50 + | example: 51 + br 52 + |     53 + code subreddit:iowa site:x.com elections 54 +
+2 -2
src/views/sub-search.pug
··· 10 10 +header(user) 11 11 div.hero 12 12 h1 search subreddits 13 - form(action="/search" method="get").search-bar 13 + form(action="/sub-search" method="get").search-bar 14 14 - var prefill = original_query ?? ""; 15 - input(type="text" name="q" placeholder="search subreddits (add +nsfw to include over-18 results)" value=prefill required).search-input 15 + input(type="text" name="q" placeholder="search subreddits" value=prefill required).search-input 16 16 button(type="submit").search-button go 17 17 if message 18 18 div.search-message