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