Added a general search function...
This commit is contained in:
parent
0cbd14018e
commit
bc582c3535
62
libs/database/searcher.js
Normal file
62
libs/database/searcher.js
Normal 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
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
Loading…
Reference in New Issue
Block a user