sunrise-cms/helpers/lotOccupancyDB/getPastLotOccupancyOccupant...

73 lines
2.4 KiB
TypeScript

import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes";
interface GetPastLotOccupancyOccupantsFilters {
searchFilter: string;
}
interface GetPastLotOccupancyOccupantsOptions {
limit: number;
}
export function getPastLotOccupancyOccupants(
filters: GetPastLotOccupancyOccupantsFilters,
options: GetPastLotOccupancyOccupantsOptions
): recordTypes.LotOccupancyOccupant[] {
const database = sqlite(databasePath, {
readonly: true
});
let sqlWhereClause =
" where o.recordDelete_timeMillis is null and l.recordDelete_timeMillis is null";
const sqlParameters: unknown[] = [];
if (filters.searchFilter) {
const searchFilterPieces = filters.searchFilter.split(" ");
for (const searchFilterPiece of searchFilterPieces) {
sqlWhereClause +=
" and (o.occupantName like '%' || ? || '%'" +
" or o.occupantAddress1 like '%' || ? || '%'" +
" or o.occupantAddress2 like '%' || ? || '%'" +
" or o.occupantCity like '%' || ? || '%')";
sqlParameters.push(
searchFilterPiece,
searchFilterPiece,
searchFilterPiece,
searchFilterPiece
);
}
}
const sql =
"select" +
" o.occupantName, o.occupantAddress1, o.occupantAddress2," +
" o.occupantCity, o.occupantProvince, o.occupantPostalCode," +
" o.occupantPhoneNumber, o.occupantEmailAddress," +
" count(*) as lotOccupancyIdCount," +
" max(o.recordUpdate_timeMillis) as recordUpdate_timeMillisMax" +
" from LotOccupancyOccupants o" +
" left join LotOccupancies l on o.lotOccupancyId = l.lotOccupancyId" +
sqlWhereClause +
" group by occupantName, occupantAddress1, occupantAddress2, occupantCity, occupantProvince, occupantPostalCode," +
" occupantPhoneNumber, occupantEmailAddress" +
" order by lotOccupancyIdCount desc, recordUpdate_timeMillisMax desc" +
" limit " +
options.limit;
const lotOccupancyOccupants: recordTypes.LotOccupancyOccupant[] = database
.prepare(sql)
.all(sqlParameters);
database.close();
return lotOccupancyOccupants;
}
export default getPastLotOccupancyOccupants;