Added a general search function...

This commit is contained in:
BurnyLlama 2021-11-01 19:08:57 +01:00
parent 0cbd14018e
commit bc582c3535

62
libs/database/searcher.js Normal file
View File

@ -0,0 +1,62 @@
import { sqlite } from './init.js'
const entriesPerPage = process.env.ENTRIES_PER_PAGE ?? 50
/**
* This is a 'general' search function for the sqlite database...
*
* @param {string} table The table to search in.
* @param {string} matchField If not 'undefined' or 'null' match 'matchQuery' in this field.
* @param {string} matchQuery The value to search for in 'matchField'.
* @param {string} orderBy The field of which to order by, if 'null' or 'undefined' it is whatever sqlite sees as default.
* @param {boolean} descending If true: sort in ascending order instead of ascending order.
* @param {string} method If set to "all" it will give all results instead of only one.
* @param {number} page The function paginates; this sets the page to look for.
*
* @returns {Promise} Returns a promise which wither resolves with the data or rejects with an error.
*
* @author BurnyLlama
*/
export default function searcher(table, matchField=undefined, matchQuery=undefined, orderBy=undefined, descending=false, method="get", page=1) {
return new Promise(
(resolve, reject) => {
const pageCount =
method === "get" ? 0 :
parseInt(sqlite
.prepare(`
SELECT count(*) FROM $table
${!matchField ?? "WHERE $matchField = $matchQuery"}
`)
.get({
table,
matchField, matchQuery
})
)
if (method === "all" && page > pageCount)
reject(`Page number too high! Page count: ${pageCount}`)
const result = sqlite
.prepare(`
SELECT * FROM $table
${!matchField ?? "WHERE $matchField = $matchQuery"}
${!orderBy ?? `"ORDER BY $orderBy" ${descending === true ? "DESC" : "ASC"}`}
${method === "all" ? `LIMIT ${entriesPerPage * (page - 1)}, ${entriesPerPage}` : ""}
`)
[method === "all" ? "all" : "get"]({
table,
matchField, matchQuery,
orderBy
})
// This check should work?
if ((typeof result === "object" && !result[0]) || (!result))
reject("No search results found!")
resolve({
result,
pageCount
})
}
)
}