diff --git a/src/utils/datatable.ts b/src/utils/datatable.ts new file mode 100644 index 0000000..36d04f6 --- /dev/null +++ b/src/utils/datatable.ts @@ -0,0 +1,65 @@ +import { Knex } from "knex"; +import { db } from "@db/db"; + +export interface RequestQuery { + length: string; + start: string; + order: { column: string; dir: string }[]; + columns: { [key: string]: { data: string; searchable: string } }; + search: { value: string }; +} + +export interface ResponseQuery { + query: Knex.QueryBuilder; + recordsTotal: number | string; + recordsFiltered: number | string; +} + +export const buildDatatableQuery = async (request: { query: RequestQuery }, tableName: string): Promise => { + const size: number = parseInt(request.query.length) || 10; + const start: number = parseInt(request.query.start); + const order: string = ( + request.query.order && request.query.columns + [request.query.order[0].column].data + ) || 'id' + const direction: string = (request.query.order && request.query.order[0].dir) || "asc"; + const search: string = request.query.search.value; + + let query = db(tableName); + + if (search) { + console.log("applying search: " + search) + console.log("columns: " + JSON.stringify(request.query.columns, null, 4)); + query = query.where(builder => { + Object.values(request.query.columns) + .filter(column => column.searchable === "true") + .forEach((col, index) => + index === 0 + ? builder.where(col.data, "like", `%${search}%`) + : builder.orWhere(col.data, "like", `%${search}%`) + ); + }); + console.log(query.toSQL()); + // Object.keys(request.query.columns).forEach(key => { + // const column = request.query.columns[key]; + // console.log(JSON.stringify(column)); + // if (column.searchable === "true") { + // query = query.where(column.data, "like", `%${search}%`); + // } + // }) + } + + const recordsTotalResult = await db(tableName).count("* as count").first(); + const recordsTotal = recordsTotalResult ? recordsTotalResult.count : 0; + + const recordsFilteredResult = await query.clone().count("* as count").first(); + const recordsFiltered = recordsFilteredResult ? recordsFilteredResult.count : 0; + + query = query.orderBy(order, direction).limit(size).offset(start); + + return { + query, + recordsTotal, + recordsFiltered + }; +}