diff --git a/app/lib/express.js b/app/lib/express.js index feaade3..db43117 100644 --- a/app/lib/express.js +++ b/app/lib/express.js @@ -507,8 +507,11 @@ router.get("/search", async (req, res) => { const query = req.query.query; - const people = await queries.searchPeople(ssbServer, query); - metrics.searchResults.observe(people.length); + let people = []; + if (query.length >= 3) { + people = await queries.searchPeople(ssbServer, query); + metrics.searchResults.observe(people.length); + } res.render("search", { people, query }); }); diff --git a/app/lib/queries.js b/app/lib/queries.js index 95dd953..a4abcad 100644 --- a/app/lib/queries.js +++ b/app/lib/queries.js @@ -191,6 +191,17 @@ const getSecretMessages = async (ssbServer, profile) => { const searchPeople = async (ssbServer, search) => { debugPeople("Fetching"); + // https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + const normalizedSearch = search + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, ""); + const safelyEscapedSearch = normalizedSearch.replace( + /[.*+?^${}()|[\]\\]/g, + "\\$&" + ); + const loosenSpacesSearch = safelyEscapedSearch.replace(" ", ".*"); + const searchRegex = new RegExp(`.*${loosenSpacesSearch}.*`, "i"); + const people = await promisePull( ssbServer.query.read({ reverse: true, @@ -208,12 +219,12 @@ const searchPeople = async (ssbServer, search) => { ], }), pull.filter((msg) => { - return ( - msg.value.content && - msg.value.author == msg.value.content.about && - msg.value.content.name.includes(search) - ); - }) + const normalizedName = msg.value.content.name + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, ""); + return msg.value.content && searchRegex.exec(normalizedName); + }), + paramap(mapProfiles(ssbServer)) ); debugPeople("Done"); diff --git a/app/views/search.ejs b/app/views/search.ejs index 519185f..152a89f 100644 --- a/app/views/search.ejs +++ b/app/views/search.ejs @@ -1,15 +1,16 @@ <%- include('_header') %> -

Results for "<%= query %>"

+<% if (query.length < 3) { %> +

You need to search for 3 or more characters

+<% } else { %> +

Results for "<%= query %>"

- +<% } %> <%- include('_footer') %> \ No newline at end of file