From 8ad8f010430258e117ed77ab53eb718a02177829 Mon Sep 17 00:00:00 2001 From: deadvey Date: Tue, 30 Sep 2025 23:15:33 +0100 Subject: [PATCH] Added basic search functionality (no frontend for it yet) --- src/data.js | 42 +++++++++++++++++++++++++++++++++++++- src/routes/form_actions.js | 17 +++++++++++++++ views/partials/search.ejs | 20 ++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 views/partials/search.ejs diff --git a/src/data.js b/src/data.js index 2fb5db9..e9d0903 100644 --- a/src/data.js +++ b/src/data.js @@ -5,6 +5,44 @@ const func = require('./functions.js') const config = require("../config.json") const fs = require("fs") +export function searchdata(term, type) { // Searches users and posts for any matches + let search_results = {"posts": [], "users": []}; + // Search users + if (type == 'post' || type == 'any') { + let list = getdata('posts'); + list.forEach((element,index) => { + if (typeof element.deleted == 'undefined' || element.deleted == false) { + if (element.content.includes(term)) { + search_results.posts.push(element) + } + else if (element.title.includes(term)) { + search_results.posts.push(element) + } + else if (element.tags.toString().includes(term)) { + search_results.posts.push(element) + }; + }; + }); + } + if (type == 'user' || type == 'any') { + let list = getdata('users'); + list.forEach((element,index) => { + if (typeof element.deleted == 'undefined' || element.deleted == false) { + if (element.username.includes(term)) { + search_results.posts.push(element) + } + else if (element.prettyname.includes(term)) { + search_results.posts.push(element) + } + else if (element.description.includes(term)) { + search_results.posts.push(element) + }; + }; + }); + } + return search_results; +}; + export function getdata(data, index=-1) { if (config["data_storage"] == "json") { @@ -32,7 +70,7 @@ export function getdata(data, index=-1) { // NOT YET WORKING! if (config["data_storage"] == "mysql") { - const mysql = require('mysql'); + const mysql = require('mysql'); let con = mysql.createConnection({ host: config.database.host, user: config.database.user, @@ -46,6 +84,7 @@ export function getdata(data, index=-1) { if (data == "posts" || data == 'users' || data == 'comments') { con.query(`SELECT * FROM ${data}`, function (err, result, fields) { if (err) throw err; + result = Object.values(JSON.parse(JSON.stringify(result))) console.log(result) return result; }); @@ -53,6 +92,7 @@ export function getdata(data, index=-1) { else if (data == 'hitcount') { con.query(`SELECT paramValue FROM params WHERE paramName = '${data}'`, function (err, result, fields) { if (err) throw err; + result = Object.values(JSON.parse(JSON.stringify(result))) console.log(result) return result; }); diff --git a/src/routes/form_actions.js b/src/routes/form_actions.js index 8eeebfd..46967e9 100644 --- a/src/routes/form_actions.js +++ b/src/routes/form_actions.js @@ -200,4 +200,21 @@ router.post("/submit_edit_post", (req,res) => { } }); // /submit_edit +router.get('/search', (req, res) => { + const search_term = req.query.q; // 'q' is the parameter name + let search_type = req.query.type; // eg 'any', 'post', 'user' etc... + if (typeof search_type == 'undefined') { // Default to 'any' + search_type = 'any'; + } + console.log('searching for: ', search_term); + const search_results = data.searchdata(search_term, search_type); // data.searchdata returns an array of search results + + res.render('partials/search', { + config, + locale, + search_results, + }) + +}); // /search + module.exports = router; diff --git a/views/partials/search.ejs b/views/partials/search.ejs new file mode 100644 index 0000000..7997dd8 --- /dev/null +++ b/views/partials/search.ejs @@ -0,0 +1,20 @@ + + + + <%- include('../partials/head'); %> + + + + +
+ <% search_results.posts.forEach((result, index) => { %> + <%- result.title %> + <% }); %> + <% search_results.users.forEach((result, index) => { %> + <%- result.prettyname %> + <% }); %> +
+ +