From 3d8483cbe4efb1a5ca382b7752f61019b07cb804 Mon Sep 17 00:00:00 2001 From: Dan Gowans Date: Mon, 18 Mar 2024 12:57:20 -0400 Subject: [PATCH] fix redirects, more typing, cleanup --- handlers/permissions.js | 3 +- handlers/permissions.ts | 5 +- handlers/plates-get/view.d.ts | 7 +- handlers/plates-get/view.ts | 8 +- handlers/reports-all/reportName.js | 3 +- handlers/reports-all/reportName.ts | 7 +- handlers/tickets-get/byTicketNumber.d.ts | 5 +- handlers/tickets-get/byTicketNumber.js | 6 +- handlers/tickets-get/byTicketNumber.ts | 16 +- handlers/tickets-get/convictPrint.d.ts | 5 +- handlers/tickets-get/convictPrint.ts | 9 +- handlers/tickets-get/edit.d.ts | 5 +- handlers/tickets-get/edit.js | 6 +- handlers/tickets-get/edit.ts | 15 +- handlers/tickets-get/print.d.ts | 5 +- handlers/tickets-get/print.js | 6 +- handlers/tickets-get/print.ts | 13 +- handlers/tickets-get/view.d.ts | 5 +- handlers/tickets-get/view.js | 6 +- handlers/tickets-get/view.ts | 13 +- handlers/tickets-post/doAddStatus.d.ts | 10 +- handlers/tickets-post/doAddStatus.ts | 17 +- handlers/tickets-post/doGetTickets.d.ts | 11 +- handlers/tickets-post/doGetTickets.ts | 14 +- helpers/functions.mto.js | 5 +- helpers/functions.mto.ts | 5 +- package-lock.json | 17 ++ package.json | 1 + routes/admin.js | 34 ++-- routes/admin.ts | 53 +++--- routes/dashboard.d.ts | 4 +- routes/dashboard.js | 9 +- routes/dashboard.ts | 19 +- routes/offences.d.ts | 4 +- routes/offences.js | 9 +- routes/offences.ts | 13 +- routes/plates-ontario.js | 14 +- routes/plates-ontario.ts | 46 +++-- routes/plates.js | 26 +-- routes/plates.ts | 93 ++++------ routes/reports.d.ts | 4 +- routes/reports.js | 9 +- routes/reports.ts | 22 +-- routes/tickets-ontario.js | 9 +- routes/tickets-ontario.ts | 44 +++-- routes/tickets.js | 76 ++++---- routes/tickets.ts | 226 +++++++++++------------ 47 files changed, 526 insertions(+), 416 deletions(-) diff --git a/handlers/permissions.js b/handlers/permissions.js index c3fa34cb..be728c22 100644 --- a/handlers/permissions.js +++ b/handlers/permissions.js @@ -1,5 +1,6 @@ +import { getConfigProperty } from '../helpers/functions.config.js'; import * as userFunctions from '../helpers/functions.user.js'; -const dashboardRedirectUrl = '/dashboard'; +const dashboardRedirectUrl = `${getConfigProperty('reverseProxy.urlPrefix')}/dashboard`; export const adminGetHandler = (request, response, next) => { if (userFunctions.userIsAdmin(request)) { next(); diff --git a/handlers/permissions.ts b/handlers/permissions.ts index 5373bb3c..901fb62f 100644 --- a/handlers/permissions.ts +++ b/handlers/permissions.ts @@ -1,8 +1,11 @@ import type { RequestHandler } from 'express' +import { getConfigProperty } from '../helpers/functions.config.js' import * as userFunctions from '../helpers/functions.user.js' -const dashboardRedirectUrl = '/dashboard' +const dashboardRedirectUrl = `${getConfigProperty( + 'reverseProxy.urlPrefix' +)}/dashboard` export const adminGetHandler: RequestHandler = (request, response, next) => { if (userFunctions.userIsAdmin(request)) { diff --git a/handlers/plates-get/view.d.ts b/handlers/plates-get/view.d.ts index 536d445f..75440561 100644 --- a/handlers/plates-get/view.d.ts +++ b/handlers/plates-get/view.d.ts @@ -1,3 +1,8 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): Promise; +export interface PlatesViewParameters { + licencePlateCountry: '_' | string; + licencePlateProvince: '_' | string; + licencePlateNumber: '_' | string; +} +export default function handler(request: Request, response: Response): Promise; diff --git a/handlers/plates-get/view.ts b/handlers/plates-get/view.ts index 5ace117b..d93020d6 100644 --- a/handlers/plates-get/view.ts +++ b/handlers/plates-get/view.ts @@ -3,8 +3,14 @@ import type { Request, Response } from 'express' import { getAllLicencePlateOwners } from '../../database/parkingDB/getAllLicencePlateOwners.js' import { getParkingTicketsByLicencePlate } from '../../database/parkingDB/getParkingTickets.js' +export interface PlatesViewParameters { + licencePlateCountry: '_' | string + licencePlateProvince: '_' | string + licencePlateNumber: '_' | string +} + export default async function handler( - request: Request, + request: Request, response: Response ): Promise { let licencePlateCountry = request.params.licencePlateCountry diff --git a/handlers/reports-all/reportName.js b/handlers/reports-all/reportName.js index 682a5410..e0bae0f9 100644 --- a/handlers/reports-all/reportName.js +++ b/handlers/reports-all/reportName.js @@ -1,10 +1,11 @@ import papaparse from 'papaparse'; import { getReportData } from '../../database/parkingDB-reporting.js'; +import { getConfigProperty } from '../../helpers/functions.config.js'; export default function handler(request, response) { const reportName = request.params.reportName; const rows = getReportData(reportName, request.query); if (!rows) { - response.redirect('/reports/?error=reportNotAvailable'); + response.redirect(`${getConfigProperty('reverseProxy.urlPrefix')}/reports/?error=reportNotAvailable`); return; } const csv = papaparse.unparse(rows); diff --git a/handlers/reports-all/reportName.ts b/handlers/reports-all/reportName.ts index b94a5d3e..cbb3182a 100644 --- a/handlers/reports-all/reportName.ts +++ b/handlers/reports-all/reportName.ts @@ -2,6 +2,7 @@ import type { Request, Response } from 'express' import papaparse from 'papaparse' import { getReportData } from '../../database/parkingDB-reporting.js' +import { getConfigProperty } from '../../helpers/functions.config.js' export default function handler(request: Request, response: Response): void { const reportName = request.params.reportName @@ -12,7 +13,11 @@ export default function handler(request: Request, response: Response): void { ) if (!rows) { - response.redirect('/reports/?error=reportNotAvailable') + response.redirect( + `${getConfigProperty( + 'reverseProxy.urlPrefix' + )}/reports/?error=reportNotAvailable` + ) return } diff --git a/handlers/tickets-get/byTicketNumber.d.ts b/handlers/tickets-get/byTicketNumber.d.ts index 18345a7d..d51e6200 100644 --- a/handlers/tickets-get/byTicketNumber.d.ts +++ b/handlers/tickets-get/byTicketNumber.d.ts @@ -1,3 +1,6 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): void; +export interface TicketsByTicketNumberParameters { + ticketNumber: string; +} +export default function handler(request: Request, response: Response): void; diff --git a/handlers/tickets-get/byTicketNumber.js b/handlers/tickets-get/byTicketNumber.js index 4116f7f0..01e0a06b 100644 --- a/handlers/tickets-get/byTicketNumber.js +++ b/handlers/tickets-get/byTicketNumber.js @@ -1,11 +1,13 @@ import getParkingTicketId from '../../database/parkingDB/getParkingTicketId.js'; +import { getConfigProperty } from '../../helpers/functions.config.js'; +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix'); export default function handler(request, response) { const ticketNumber = request.params.ticketNumber; const ticketId = getParkingTicketId(ticketNumber); if (ticketId === undefined) { - response.redirect('/tickets/?error=ticketNotFound'); + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`); } else { - response.redirect(`/tickets/${ticketId.toString()}`); + response.redirect(`${urlPrefix}/tickets/${ticketId.toString()}`); } } diff --git a/handlers/tickets-get/byTicketNumber.ts b/handlers/tickets-get/byTicketNumber.ts index 26a97ff5..b2cc0885 100644 --- a/handlers/tickets-get/byTicketNumber.ts +++ b/handlers/tickets-get/byTicketNumber.ts @@ -1,15 +1,25 @@ import type { Request, Response } from 'express' import getParkingTicketId from '../../database/parkingDB/getParkingTicketId.js' +import { getConfigProperty } from '../../helpers/functions.config.js' -export default function handler(request: Request, response: Response): void { +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix') + +export interface TicketsByTicketNumberParameters { + ticketNumber: string +} + +export default function handler( + request: Request, + response: Response +): void { const ticketNumber = request.params.ticketNumber const ticketId = getParkingTicketId(ticketNumber) if (ticketId === undefined) { - response.redirect('/tickets/?error=ticketNotFound') + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`) } else { - response.redirect(`/tickets/${ticketId.toString()}`) + response.redirect(`${urlPrefix}/tickets/${ticketId.toString()}`) } } diff --git a/handlers/tickets-get/convictPrint.d.ts b/handlers/tickets-get/convictPrint.d.ts index 18345a7d..e9445c9b 100644 --- a/handlers/tickets-get/convictPrint.d.ts +++ b/handlers/tickets-get/convictPrint.d.ts @@ -1,3 +1,6 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): void; +export interface TicketsConvictPrintParameters { + batchId: `${number}`; +} +export default function handler(request: Request, response: Response): void; diff --git a/handlers/tickets-get/convictPrint.ts b/handlers/tickets-get/convictPrint.ts index 233eeea2..0a484eb6 100644 --- a/handlers/tickets-get/convictPrint.ts +++ b/handlers/tickets-get/convictPrint.ts @@ -3,7 +3,14 @@ import type { Request, Response } from 'express' import getConvictionBatch from '../../database/parkingDB/getConvictionBatch.js' import markConvictionBatchAsSent from '../../database/parkingDB/markConvictionBatchAsSent.js' -export default function handler(request: Request, response: Response): void { +export interface TicketsConvictPrintParameters { + batchId: `${number}` +} + +export default function handler( + request: Request, + response: Response +): void { const batchId = Number.parseInt(request.params.batchId, 10) const batch = getConvictionBatch(batchId) diff --git a/handlers/tickets-get/edit.d.ts b/handlers/tickets-get/edit.d.ts index 536d445f..7d66029c 100644 --- a/handlers/tickets-get/edit.d.ts +++ b/handlers/tickets-get/edit.d.ts @@ -1,3 +1,6 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): Promise; +export interface TicketsEditParameters { + ticketId: `${number}`; +} +export default function handler(request: Request, response: Response): Promise; diff --git a/handlers/tickets-get/edit.js b/handlers/tickets-get/edit.js index 63153d8f..cb7fde03 100644 --- a/handlers/tickets-get/edit.js +++ b/handlers/tickets-get/edit.js @@ -1,17 +1,19 @@ import { dateToString } from '@cityssm/utils-datetime'; import getParkingTicket from '../../database/parkingDB/getParkingTicket.js'; import { getRecentParkingTicketVehicleMakeModelValues } from '../../database/parkingDB.js'; +import { getConfigProperty } from '../../helpers/functions.config.js'; +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix'); export default async function handler(request, response) { const ticketId = Number.parseInt(request.params.ticketId, 10); const ticket = await getParkingTicket(ticketId, request.session.user); if (!ticket) { - response.redirect('/tickets/?error=ticketNotFound'); + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`); return; } else if (!ticket.canUpdate || ticket.resolvedDate || ticket.recordDelete_timeMillis) { - response.redirect(`/tickets/${ticketId.toString()}/?error=accessDenied`); + response.redirect(`${urlPrefix}/tickets/${ticketId.toString()}/?error=accessDenied`); return; } const vehicleMakeModelDatalist = getRecentParkingTicketVehicleMakeModelValues(); diff --git a/handlers/tickets-get/edit.ts b/handlers/tickets-get/edit.ts index 59de7f33..5693eb26 100644 --- a/handlers/tickets-get/edit.ts +++ b/handlers/tickets-get/edit.ts @@ -3,9 +3,16 @@ import type { Request, Response } from 'express' import getParkingTicket from '../../database/parkingDB/getParkingTicket.js' import { getRecentParkingTicketVehicleMakeModelValues } from '../../database/parkingDB.js' +import { getConfigProperty } from '../../helpers/functions.config.js' + +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix') + +export interface TicketsEditParameters { + ticketId: `${number}` +} export default async function handler( - request: Request, + request: Request, response: Response ): Promise { const ticketId = Number.parseInt(request.params.ticketId, 10) @@ -16,14 +23,16 @@ export default async function handler( ) if (!ticket) { - response.redirect('/tickets/?error=ticketNotFound') + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`) return } else if ( !ticket.canUpdate || ticket.resolvedDate || ticket.recordDelete_timeMillis ) { - response.redirect(`/tickets/${ticketId.toString()}/?error=accessDenied`) + response.redirect( + `${urlPrefix}/tickets/${ticketId.toString()}/?error=accessDenied` + ) return } diff --git a/handlers/tickets-get/print.d.ts b/handlers/tickets-get/print.d.ts index 536d445f..a3c97e3e 100644 --- a/handlers/tickets-get/print.d.ts +++ b/handlers/tickets-get/print.d.ts @@ -1,3 +1,6 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): Promise; +export interface TicketsPrintParameters { + ticketId: `${number}`; +} +export default function handler(request: Request, response: Response): Promise; diff --git a/handlers/tickets-get/print.js b/handlers/tickets-get/print.js index 5874cce8..cc8b0cb3 100644 --- a/handlers/tickets-get/print.js +++ b/handlers/tickets-get/print.js @@ -1,13 +1,15 @@ import getParkingTicket from '../../database/parkingDB/getParkingTicket.js'; +import { getConfigProperty } from '../../helpers/functions.config.js'; +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix'); export default async function handler(request, response) { const ticketId = Number.parseInt(request.params.ticketId, 10); const ticket = await getParkingTicket(ticketId, request.session.user); if (!ticket) { - response.redirect('/tickets/?error=ticketNotFound'); + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`); return; } else if (ticket.recordDelete_timeMillis) { - response.redirect('/tickets/?error=accessDenied'); + response.redirect(`${urlPrefix}/tickets/?error=accessDenied`); return; } response.render('ticket-print', { diff --git a/handlers/tickets-get/print.ts b/handlers/tickets-get/print.ts index 04cb72e2..19af4c2d 100644 --- a/handlers/tickets-get/print.ts +++ b/handlers/tickets-get/print.ts @@ -1,9 +1,16 @@ import type { Request, Response } from 'express' import getParkingTicket from '../../database/parkingDB/getParkingTicket.js' +import { getConfigProperty } from '../../helpers/functions.config.js' + +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix') + +export interface TicketsPrintParameters { + ticketId: `${number}` +} export default async function handler( - request: Request, + request: Request, response: Response ): Promise { const ticketId = Number.parseInt(request.params.ticketId, 10) @@ -14,10 +21,10 @@ export default async function handler( ) if (!ticket) { - response.redirect('/tickets/?error=ticketNotFound') + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`) return } else if (ticket.recordDelete_timeMillis) { - response.redirect('/tickets/?error=accessDenied') + response.redirect(`${urlPrefix}/tickets/?error=accessDenied`) return } diff --git a/handlers/tickets-get/view.d.ts b/handlers/tickets-get/view.d.ts index 536d445f..8f26bec3 100644 --- a/handlers/tickets-get/view.d.ts +++ b/handlers/tickets-get/view.d.ts @@ -1,3 +1,6 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): Promise; +export interface TicketsViewParameters { + ticketId: `${number}`; +} +export default function handler(request: Request, response: Response): Promise; diff --git a/handlers/tickets-get/view.js b/handlers/tickets-get/view.js index b9acbee2..f7421aa6 100644 --- a/handlers/tickets-get/view.js +++ b/handlers/tickets-get/view.js @@ -1,14 +1,16 @@ import getParkingTicket from '../../database/parkingDB/getParkingTicket.js'; +import { getConfigProperty } from '../../helpers/functions.config.js'; +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix'); export default async function handler(request, response) { const ticketId = Number.parseInt(request.params.ticketId, 10); const ticket = await getParkingTicket(ticketId, request.session.user); if (!ticket) { - response.redirect('/tickets/?error=ticketNotFound'); + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`); return; } else if (ticket.recordDelete_timeMillis && !(request.session.user.isAdmin ?? false)) { - response.redirect('/tickets/?error=accessDenied'); + response.redirect(`${urlPrefix}/tickets/?error=accessDenied`); return; } response.render('ticket-view', { diff --git a/handlers/tickets-get/view.ts b/handlers/tickets-get/view.ts index 3abad4bf..a6ce3a84 100644 --- a/handlers/tickets-get/view.ts +++ b/handlers/tickets-get/view.ts @@ -1,9 +1,16 @@ import type { Request, Response } from 'express' import getParkingTicket from '../../database/parkingDB/getParkingTicket.js' +import { getConfigProperty } from '../../helpers/functions.config.js' + +const urlPrefix = getConfigProperty('reverseProxy.urlPrefix') + +export interface TicketsViewParameters { + ticketId: `${number}` +} export default async function handler( - request: Request, + request: Request, response: Response ): Promise { const ticketId = Number.parseInt(request.params.ticketId, 10) @@ -14,13 +21,13 @@ export default async function handler( ) if (!ticket) { - response.redirect('/tickets/?error=ticketNotFound') + response.redirect(`${urlPrefix}/tickets/?error=ticketNotFound`) return } else if ( ticket.recordDelete_timeMillis && !((request.session.user as PTSUser).isAdmin ?? false) ) { - response.redirect('/tickets/?error=accessDenied') + response.redirect(`${urlPrefix}/tickets/?error=accessDenied`) return } diff --git a/handlers/tickets-post/doAddStatus.d.ts b/handlers/tickets-post/doAddStatus.d.ts index 18345a7d..f87c8995 100644 --- a/handlers/tickets-post/doAddStatus.d.ts +++ b/handlers/tickets-post/doAddStatus.d.ts @@ -1,3 +1,11 @@ /// import type { Request, Response } from 'express'; -export default function handler(request: Request, response: Response): void; +export interface DoAddStatusBody { + statusField: string; + statusField2: string; + statusKey: string; + statusNote: string; + ticketId: `${number}`; + resolveTicket?: '1'; +} +export default function handler(request: Request, response: Response): void; diff --git a/handlers/tickets-post/doAddStatus.ts b/handlers/tickets-post/doAddStatus.ts index 2dfa7e19..bd687338 100644 --- a/handlers/tickets-post/doAddStatus.ts +++ b/handlers/tickets-post/doAddStatus.ts @@ -1,11 +1,22 @@ import type { Request, Response } from 'express' import createParkingTicketStatus from '../../database/parkingDB/createParkingTicketStatus.js' -import type { ParkingTicketStatusLog } from '../../types/recordTypes.js' -export default function handler(request: Request, response: Response): void { +export interface DoAddStatusBody { + statusField: string + statusField2: string + statusKey: string + statusNote: string + ticketId: `${number}` + resolveTicket?: '1' +} + +export default function handler( + request: Request, + response: Response +): void { const result = createParkingTicketStatus( - request.body as Partial, + request.body, request.session.user as PTSUser, request.body.resolveTicket === '1' ) diff --git a/handlers/tickets-post/doGetTickets.d.ts b/handlers/tickets-post/doGetTickets.d.ts index 1217a947..dc06c5a8 100644 --- a/handlers/tickets-post/doGetTickets.d.ts +++ b/handlers/tickets-post/doGetTickets.d.ts @@ -1,5 +1,14 @@ /// import type { Request, Response } from 'express'; import { type GetParkingTicketsReturn } from '../../database/parkingDB/getParkingTickets.js'; +interface DoGetTicketsBody { + isResolved: '' | '0' | '1'; + licencePlateNumber: string; + limit: `${number}`; + location: string; + offset: `${number}`; + ticketNumber: string; +} export type DoGetTicketsResponse = GetParkingTicketsReturn; -export default function handler(request: Request, response: Response): void; +export default function handler(request: Request, response: Response): void; +export {}; diff --git a/handlers/tickets-post/doGetTickets.ts b/handlers/tickets-post/doGetTickets.ts index 34e2b3b2..b1fc2d08 100644 --- a/handlers/tickets-post/doGetTickets.ts +++ b/handlers/tickets-post/doGetTickets.ts @@ -5,9 +5,21 @@ import getParkingTickets, { type GetParkingTicketsReturn } from '../../database/parkingDB/getParkingTickets.js' +interface DoGetTicketsBody { + isResolved: '' | '0' | '1' + licencePlateNumber: string + limit: `${number}` + location: string + offset: `${number}` + ticketNumber: string +} + export type DoGetTicketsResponse = GetParkingTicketsReturn -export default function handler(request: Request, response: Response): void { +export default function handler( + request: Request, + response: Response +): void { const queryOptions: GetParkingTicketsQueryOptions = { limit: Number.parseInt(request.body.limit as string, 10), offset: Number.parseInt(request.body.offset as string, 10), diff --git a/helpers/functions.mto.js b/helpers/functions.mto.js index 0f6372ba..31e2e25d 100644 --- a/helpers/functions.mto.js +++ b/helpers/functions.mto.js @@ -1,3 +1,4 @@ +import { fixSaultSteMarie } from '@cityssm/is-sault-ste-marie'; import { dateToInteger } from '@cityssm/utils-datetime'; import sqlite from 'better-sqlite3'; import { parkingDB as databasePath } from '../data/databasePaths.js'; @@ -97,9 +98,7 @@ export const parsePKRD = (rowData) => { const lastCommaIndex = record.ownerAddress.lastIndexOf(','); record.ownerCity = record.ownerAddress.slice(Math.max(0, lastCommaIndex + 1)); record.ownerAddress = record.ownerAddress.slice(0, Math.max(0, lastCommaIndex)); - if (record.ownerCity === 'S STE MARIE') { - record.ownerCity = 'SAULT STE. MARIE'; - } + record.ownerCity = fixSaultSteMarie(record.ownerCity, 'SAULT STE. MARIE'); } record.ownerPostalCode = rowData.slice(144, 150).trim(); record.vehicleNCIC = rowData.slice(150, 154).trim(); diff --git a/helpers/functions.mto.ts b/helpers/functions.mto.ts index a1ce9a22..5bdebd9f 100644 --- a/helpers/functions.mto.ts +++ b/helpers/functions.mto.ts @@ -1,6 +1,7 @@ // eslint-disable-next-line eslint-comments/disable-enable-pair /* eslint-disable @typescript-eslint/indent */ +import { fixSaultSteMarie } from '@cityssm/is-sault-ste-marie' import { dateToInteger } from '@cityssm/utils-datetime' import sqlite from 'better-sqlite3' @@ -223,9 +224,7 @@ export const parsePKRD = (rowData: string): false | PKRDResult => { Math.max(0, lastCommaIndex) ) - if (record.ownerCity === 'S STE MARIE') { - record.ownerCity = 'SAULT STE. MARIE' - } + record.ownerCity = fixSaultSteMarie(record.ownerCity, 'SAULT STE. MARIE') } record.ownerPostalCode = rowData.slice(144, 150).trim() diff --git a/package-lock.json b/package-lock.json index 8807e1f3..62c774ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@cityssm/bulma-webapp-js": "^1.5.0", "@cityssm/configurator": "^0.1.0", "@cityssm/expressjs-server-js": "^2.3.2", + "@cityssm/is-sault-ste-marie": "^0.3.0", "@cityssm/ncic-lookup": "^0.3.0", "@cityssm/utils-datetime": "^1.1.2", "@fontsource/pt-mono": "^5.0.12", @@ -339,6 +340,17 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/@cityssm/is-sault-ste-marie": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@cityssm/is-sault-ste-marie/-/is-sault-ste-marie-0.3.0.tgz", + "integrity": "sha512-cSXnCOj04pFJTuOlFR2YQG39flrPUcf9Nqb0YaiAG9WTUdnzPpM55KKcF7MsI3WYZINOOvNO2nd7Gmui02GuxQ==", + "dependencies": { + "just-cartesian-product": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@cityssm/ncic-lookup": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@cityssm/ncic-lookup/-/ncic-lookup-0.3.0.tgz", @@ -6998,6 +7010,11 @@ "verror": "1.10.0" } }, + "node_modules/just-cartesian-product": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/just-cartesian-product/-/just-cartesian-product-4.2.0.tgz", + "integrity": "sha512-vl+3t1HG/Q7o4hLqzaBUBr+3qOZudedXDY6+OVX3Ca6a120xBjzeFdql7+bv5gJhYYI13HnN2A1or5bA2x4ZBg==" + }, "node_modules/just-debounce": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", diff --git a/package.json b/package.json index 664bf4df..5808cdc7 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@cityssm/bulma-webapp-js": "^1.5.0", "@cityssm/configurator": "^0.1.0", "@cityssm/expressjs-server-js": "^2.3.2", + "@cityssm/is-sault-ste-marie": "^0.3.0", "@cityssm/ncic-lookup": "^0.3.0", "@cityssm/utils-datetime": "^1.1.2", "@fontsource/pt-mono": "^5.0.12", diff --git a/routes/admin.js b/routes/admin.js index bfa0fc9a..928fa0e9 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -16,19 +16,23 @@ import handler_doUpdateOffence from '../handlers/admin-post/doUpdateOffence.js'; import handler_doUpdateOffencesByBylaw from '../handlers/admin-post/doUpdateOffencesByBylaw.js'; import { adminGetHandler, adminPostHandler } from '../handlers/permissions.js'; export const router = Router(); -router.get('/cleanup', adminGetHandler, handler_cleanup); -router.post('/doCleanupTable', adminPostHandler, handler_doCleanupTable); -router.get('/offences', adminGetHandler, handler_offences); -router.post('/doAddOffence', adminPostHandler, handler_doAddOffence); -router.post('/doUpdateOffence', adminPostHandler, handler_doUpdateOffence); -router.post('/doDeleteOffence', adminPostHandler, handler_doDeleteOffence); -router.get('/locations', adminGetHandler, handler_locations); -router.post('/doAddLocation', adminPostHandler, handler_doAddLocation); -router.post('/doUpdateLocation', adminPostHandler, handler_doUpdateLocation); -router.post('/doDeleteLocation', adminPostHandler, handler_doDeleteLocation); -router.get('/bylaws', adminGetHandler, handler_bylaws); -router.post('/doAddBylaw', adminPostHandler, handler_doAddBylaw); -router.post('/doUpdateBylaw', adminPostHandler, handler_doUpdateBylaw); -router.post('/doUpdateOffencesByBylaw', adminPostHandler, handler_doUpdateOffencesByBylaw); -router.post('/doDeleteBylaw', adminPostHandler, handler_doDeleteBylaw); +router + .get('/cleanup', adminGetHandler, handler_cleanup) + .post('/doCleanupTable', adminPostHandler, handler_doCleanupTable); +router + .get('/offences', adminGetHandler, handler_offences) + .post('/doAddOffence', adminPostHandler, handler_doAddOffence) + .post('/doUpdateOffence', adminPostHandler, handler_doUpdateOffence) + .post('/doDeleteOffence', adminPostHandler, handler_doDeleteOffence); +router + .get('/locations', adminGetHandler, handler_locations) + .post('/doAddLocation', adminPostHandler, handler_doAddLocation) + .post('/doUpdateLocation', adminPostHandler, handler_doUpdateLocation) + .post('/doDeleteLocation', adminPostHandler, handler_doDeleteLocation); +router + .get('/bylaws', adminGetHandler, handler_bylaws) + .post('/doAddBylaw', adminPostHandler, handler_doAddBylaw) + .post('/doUpdateBylaw', adminPostHandler, handler_doUpdateBylaw) + .post('/doUpdateOffencesByBylaw', adminPostHandler, handler_doUpdateOffencesByBylaw) + .post('/doDeleteBylaw', adminPostHandler, handler_doDeleteBylaw); export default router; diff --git a/routes/admin.ts b/routes/admin.ts index 03fa3e81..141ad735 100644 --- a/routes/admin.ts +++ b/routes/admin.ts @@ -21,44 +21,37 @@ export const router = Router() // Database Cleanup -router.get('/cleanup', adminGetHandler, handler_cleanup) - -router.post('/doCleanupTable', adminPostHandler, handler_doCleanupTable) +router + .get('/cleanup', adminGetHandler, handler_cleanup) + .post('/doCleanupTable', adminPostHandler, handler_doCleanupTable) // Offence Maintenance -router.get('/offences', adminGetHandler, handler_offences) - -router.post('/doAddOffence', adminPostHandler, handler_doAddOffence) - -router.post('/doUpdateOffence', adminPostHandler, handler_doUpdateOffence) - -router.post('/doDeleteOffence', adminPostHandler, handler_doDeleteOffence) +router + .get('/offences', adminGetHandler, handler_offences) + .post('/doAddOffence', adminPostHandler, handler_doAddOffence) + .post('/doUpdateOffence', adminPostHandler, handler_doUpdateOffence) + .post('/doDeleteOffence', adminPostHandler, handler_doDeleteOffence) // Location Maintenance -router.get('/locations', adminGetHandler, handler_locations) - -router.post('/doAddLocation', adminPostHandler, handler_doAddLocation) - -router.post('/doUpdateLocation', adminPostHandler, handler_doUpdateLocation) - -router.post('/doDeleteLocation', adminPostHandler, handler_doDeleteLocation) +router + .get('/locations', adminGetHandler, handler_locations) + .post('/doAddLocation', adminPostHandler, handler_doAddLocation) + .post('/doUpdateLocation', adminPostHandler, handler_doUpdateLocation) + .post('/doDeleteLocation', adminPostHandler, handler_doDeleteLocation) // By-Law Maintenance -router.get('/bylaws', adminGetHandler, handler_bylaws) - -router.post('/doAddBylaw', adminPostHandler, handler_doAddBylaw) - -router.post('/doUpdateBylaw', adminPostHandler, handler_doUpdateBylaw) - -router.post( - '/doUpdateOffencesByBylaw', - adminPostHandler, - handler_doUpdateOffencesByBylaw -) - -router.post('/doDeleteBylaw', adminPostHandler, handler_doDeleteBylaw) +router + .get('/bylaws', adminGetHandler, handler_bylaws) + .post('/doAddBylaw', adminPostHandler, handler_doAddBylaw) + .post('/doUpdateBylaw', adminPostHandler, handler_doUpdateBylaw) + .post( + '/doUpdateOffencesByBylaw', + adminPostHandler, + handler_doUpdateOffencesByBylaw + ) + .post('/doDeleteBylaw', adminPostHandler, handler_doDeleteBylaw) export default router diff --git a/routes/dashboard.d.ts b/routes/dashboard.d.ts index 433ab333..5946e44f 100644 --- a/routes/dashboard.d.ts +++ b/routes/dashboard.d.ts @@ -1,2 +1,2 @@ -export declare const router: import("express-serve-static-core").Router; -export default router; +declare const _default: import("express-serve-static-core").Router; +export default _default; diff --git a/routes/dashboard.js b/routes/dashboard.js index dfdee301..101519e3 100644 --- a/routes/dashboard.js +++ b/routes/dashboard.js @@ -1,10 +1,9 @@ import { Router } from 'express'; import handler_doGetDefaultConfigProperties from '../handlers/dashboard-post/doGetDefaultConfigProperties.js'; -export const router = Router(); -router.get('/', (_request, response) => { +export default Router() + .get('/', (_request, response) => { response.render('dashboard', { headTitle: 'Dashboard' }); -}); -router.post('/doGetDefaultConfigProperties', handler_doGetDefaultConfigProperties); -export default router; +}) + .post('/doGetDefaultConfigProperties', handler_doGetDefaultConfigProperties); diff --git a/routes/dashboard.ts b/routes/dashboard.ts index 239334b4..2f808f76 100644 --- a/routes/dashboard.ts +++ b/routes/dashboard.ts @@ -2,17 +2,10 @@ import { Router } from 'express' import handler_doGetDefaultConfigProperties from '../handlers/dashboard-post/doGetDefaultConfigProperties.js' -export const router = Router() - -router.get('/', (_request, response) => { - response.render('dashboard', { - headTitle: 'Dashboard' +export default Router() + .get('/', (_request, response) => { + response.render('dashboard', { + headTitle: 'Dashboard' + }) }) -}) - -router.post( - '/doGetDefaultConfigProperties', - handler_doGetDefaultConfigProperties -) - -export default router + .post('/doGetDefaultConfigProperties', handler_doGetDefaultConfigProperties) diff --git a/routes/offences.d.ts b/routes/offences.d.ts index 433ab333..5946e44f 100644 --- a/routes/offences.d.ts +++ b/routes/offences.d.ts @@ -1,2 +1,2 @@ -export declare const router: import("express-serve-static-core").Router; -export default router; +declare const _default: import("express-serve-static-core").Router; +export default _default; diff --git a/routes/offences.js b/routes/offences.js index 14bd9d6b..e891b697 100644 --- a/routes/offences.js +++ b/routes/offences.js @@ -2,8 +2,7 @@ import { Router } from 'express'; import handler_doGetAllLocations from '../handlers/offences-post/doGetAllLocations.js'; import handler_doGetAllOffences from '../handlers/offences-post/doGetAllOffences.js'; import handler_doGetOffencesByLocation from '../handlers/offences-post/doGetOffencesByLocation.js'; -export const router = Router(); -router.post('/doGetAllLocations', handler_doGetAllLocations); -router.post('/doGetOffencesByLocation', handler_doGetOffencesByLocation); -router.post('/doGetAllOffences', handler_doGetAllOffences); -export default router; +export default Router() + .post('/doGetAllLocations', handler_doGetAllLocations) + .post('/doGetOffencesByLocation', handler_doGetOffencesByLocation) + .post('/doGetAllOffences', handler_doGetAllOffences); diff --git a/routes/offences.ts b/routes/offences.ts index 87fbb687..267f322c 100644 --- a/routes/offences.ts +++ b/routes/offences.ts @@ -4,12 +4,7 @@ import handler_doGetAllLocations from '../handlers/offences-post/doGetAllLocatio import handler_doGetAllOffences from '../handlers/offences-post/doGetAllOffences.js' import handler_doGetOffencesByLocation from '../handlers/offences-post/doGetOffencesByLocation.js' -export const router = Router() - -router.post('/doGetAllLocations', handler_doGetAllLocations) - -router.post('/doGetOffencesByLocation', handler_doGetOffencesByLocation) - -router.post('/doGetAllOffences', handler_doGetAllOffences) - -export default router +export default Router() + .post('/doGetAllLocations', handler_doGetAllLocations) + .post('/doGetOffencesByLocation', handler_doGetOffencesByLocation) + .post('/doGetAllOffences', handler_doGetAllOffences) diff --git a/routes/plates-ontario.js b/routes/plates-ontario.js index 329ef6be..6924e694 100644 --- a/routes/plates-ontario.js +++ b/routes/plates-ontario.js @@ -1,14 +1,16 @@ import { Router } from 'express'; -import * as permissionHandlers from '../handlers/permissions.js'; +import { updateOrOperatorGetHandler, updateOrOperatorPostHandler, updatePostHandler } from '../handlers/permissions.js'; import handler_mtoExport from '../handlers/plates-ontario-get/mtoExport.js'; import handler_mtoExportDownload from '../handlers/plates-ontario-get/mtoExportDownload.js'; import handler_mtoImport from '../handlers/plates-ontario-get/mtoImport.js'; import handler_doGetTicketsAvailableForMTOLookup from '../handlers/plates-ontario-post/doGetTicketsAvailableForMTOLookup.js'; import * as handler_doMTOImportUpload from '../handlers/plates-ontario-post/doMTOImportUpload.js'; export const router = Router(); -router.get('/mtoExport', permissionHandlers.updateOrOperatorGetHandler, handler_mtoExport); -router.post('/doGetParkingTicketsAvailableForMTOLookup', permissionHandlers.updatePostHandler, handler_doGetTicketsAvailableForMTOLookup); -router.get('/mtoExport/:batchId', permissionHandlers.updateOrOperatorGetHandler, handler_mtoExportDownload); -router.get('/mtoImport', permissionHandlers.updateOrOperatorGetHandler, handler_mtoImport); -router.post('/doMTOImportUpload', permissionHandlers.updateOrOperatorPostHandler, handler_doMTOImportUpload.uploadHandler, handler_doMTOImportUpload.handler); +router + .get('/mtoExport', updateOrOperatorGetHandler, handler_mtoExport) + .post('/doGetParkingTicketsAvailableForMTOLookup', updatePostHandler, handler_doGetTicketsAvailableForMTOLookup); +router.get('/mtoExport/:batchId', updateOrOperatorGetHandler, handler_mtoExportDownload); +router + .get('/mtoImport', updateOrOperatorGetHandler, handler_mtoImport) + .post('/doMTOImportUpload', updateOrOperatorPostHandler, handler_doMTOImportUpload.uploadHandler, handler_doMTOImportUpload.handler); export default router; diff --git a/routes/plates-ontario.ts b/routes/plates-ontario.ts index f96a5de3..94bae8e9 100644 --- a/routes/plates-ontario.ts +++ b/routes/plates-ontario.ts @@ -2,7 +2,11 @@ import { Router } from 'express' -import * as permissionHandlers from '../handlers/permissions.js' +import { + updateOrOperatorGetHandler, + updateOrOperatorPostHandler, + updatePostHandler +} from '../handlers/permissions.js' import handler_mtoExport from '../handlers/plates-ontario-get/mtoExport.js' import handler_mtoExportDownload from '../handlers/plates-ontario-get/mtoExportDownload.js' import handler_mtoImport from '../handlers/plates-ontario-get/mtoImport.js' @@ -11,35 +15,27 @@ import * as handler_doMTOImportUpload from '../handlers/plates-ontario-post/doMT export const router = Router() -router.get( - '/mtoExport', - permissionHandlers.updateOrOperatorGetHandler, - handler_mtoExport -) - -router.post( - '/doGetParkingTicketsAvailableForMTOLookup', - permissionHandlers.updatePostHandler, - handler_doGetTicketsAvailableForMTOLookup -) +router + .get('/mtoExport', updateOrOperatorGetHandler, handler_mtoExport) + .post( + '/doGetParkingTicketsAvailableForMTOLookup', + updatePostHandler, + handler_doGetTicketsAvailableForMTOLookup + ) router.get( '/mtoExport/:batchId', - permissionHandlers.updateOrOperatorGetHandler, + updateOrOperatorGetHandler, handler_mtoExportDownload ) -router.get( - '/mtoImport', - permissionHandlers.updateOrOperatorGetHandler, - handler_mtoImport -) - -router.post( - '/doMTOImportUpload', - permissionHandlers.updateOrOperatorPostHandler, - handler_doMTOImportUpload.uploadHandler, - handler_doMTOImportUpload.handler -) +router + .get('/mtoImport', updateOrOperatorGetHandler, handler_mtoImport) + .post( + '/doMTOImportUpload', + updateOrOperatorPostHandler, + handler_doMTOImportUpload.uploadHandler, + handler_doMTOImportUpload.handler + ) export default router diff --git a/routes/plates.js b/routes/plates.js index 0bb41c1b..7be7efa1 100644 --- a/routes/plates.js +++ b/routes/plates.js @@ -12,20 +12,22 @@ import handler_doGetUnreceivedLicencePlateLookupBatches from '../handlers/plates import handler_doLockLookupBatch from '../handlers/plates-post/doLockLookupBatch.js'; import handler_doRemoveLicencePlateFromLookupBatch from '../handlers/plates-post/doRemoveLicencePlateFromLookupBatch.js'; export const router = Router(); -router.get('/', (_request, response) => { +router + .get('/', (_request, response) => { response.render('plate-search', { headTitle: 'Licence Plates' }); -}); -router.post('/doGetLicencePlates', handler_doGetLicencePlates); -router.post('/doGetUnreceivedLicencePlateLookupBatches', updateOrOperatorPostHandler, handler_doGetUnreceivedLicencePlateLookupBatches); -router.post('/doCreateLookupBatch', updatePostHandler, handler_doCreateLookupBatch); -router.post('/doGetLookupBatch', updateOrOperatorPostHandler, handler_doGetLookupBatch); -router.post('/doAddLicencePlateToLookupBatch', updatePostHandler, handler_doAddLicencePlateToLookupBatch); -router.post('/doAddAllParkingTicketsToLookupBatch', updatePostHandler, handler_doAddAllParkingTicketsToLookupBatch); -router.post('/doRemoveLicencePlateFromLookupBatch', updatePostHandler, handler_doRemoveLicencePlateFromLookupBatch); -router.post('/doClearLookupBatch', updatePostHandler, handler_doClearLookupBatch); -router.post('/doLockLookupBatch', updatePostHandler, handler_doLockLookupBatch); -router.post('/doGetModelsByMake', handler_doGetModelsByMake); +}) + .post('/doGetLicencePlates', handler_doGetLicencePlates); +router + .post('/doGetUnreceivedLicencePlateLookupBatches', updateOrOperatorPostHandler, handler_doGetUnreceivedLicencePlateLookupBatches) + .post('/doCreateLookupBatch', updatePostHandler, handler_doCreateLookupBatch) + .post('/doGetLookupBatch', updateOrOperatorPostHandler, handler_doGetLookupBatch) + .post('/doAddLicencePlateToLookupBatch', updatePostHandler, handler_doAddLicencePlateToLookupBatch) + .post('/doAddAllParkingTicketsToLookupBatch', updatePostHandler, handler_doAddAllParkingTicketsToLookupBatch) + .post('/doRemoveLicencePlateFromLookupBatch', updatePostHandler, handler_doRemoveLicencePlateFromLookupBatch) + .post('/doClearLookupBatch', updatePostHandler, handler_doClearLookupBatch) + .post('/doLockLookupBatch', updatePostHandler, handler_doLockLookupBatch) + .post('/doGetModelsByMake', handler_doGetModelsByMake); router.get('/:licencePlateCountry/:licencePlateProvince/:licencePlateNumber', handler_view); export default router; diff --git a/routes/plates.ts b/routes/plates.ts index 7bb3f7a7..9e86498f 100644 --- a/routes/plates.ts +++ b/routes/plates.ts @@ -4,7 +4,9 @@ import { updateOrOperatorPostHandler, updatePostHandler } from '../handlers/permissions.js' -import handler_view from '../handlers/plates-get/view.js' +import handler_view, { + type PlatesViewParameters +} from '../handlers/plates-get/view.js' import handler_doAddAllParkingTicketsToLookupBatch from '../handlers/plates-post/doAddAllParkingTicketsToLookupBatch.js' import handler_doAddLicencePlateToLookupBatch from '../handlers/plates-post/doAddLicencePlateToLookupBatch.js' import handler_doClearLookupBatch from '../handlers/plates-post/doClearLookupBatch.js' @@ -18,67 +20,52 @@ import handler_doRemoveLicencePlateFromLookupBatch from '../handlers/plates-post export const router = Router() -router.get('/', (_request, response) => { - response.render('plate-search', { - headTitle: 'Licence Plates' +router + .get('/', (_request, response) => { + response.render('plate-search', { + headTitle: 'Licence Plates' + }) }) -}) - -router.post('/doGetLicencePlates', handler_doGetLicencePlates) + .post('/doGetLicencePlates', handler_doGetLicencePlates) // Lookup Batches -router.post( - '/doGetUnreceivedLicencePlateLookupBatches', - updateOrOperatorPostHandler, - handler_doGetUnreceivedLicencePlateLookupBatches -) - -router.post( - '/doCreateLookupBatch', - updatePostHandler, - handler_doCreateLookupBatch -) - -router.post( - '/doGetLookupBatch', - updateOrOperatorPostHandler, - handler_doGetLookupBatch -) - -router.post( - '/doAddLicencePlateToLookupBatch', - updatePostHandler, - handler_doAddLicencePlateToLookupBatch -) - -router.post( - '/doAddAllParkingTicketsToLookupBatch', - updatePostHandler, - handler_doAddAllParkingTicketsToLookupBatch -) - -router.post( - '/doRemoveLicencePlateFromLookupBatch', - updatePostHandler, - handler_doRemoveLicencePlateFromLookupBatch -) - -router.post( - '/doClearLookupBatch', - updatePostHandler, - handler_doClearLookupBatch -) - -router.post('/doLockLookupBatch', updatePostHandler, handler_doLockLookupBatch) - -router.post('/doGetModelsByMake', handler_doGetModelsByMake) +router + .post( + '/doGetUnreceivedLicencePlateLookupBatches', + updateOrOperatorPostHandler, + handler_doGetUnreceivedLicencePlateLookupBatches + ) + .post('/doCreateLookupBatch', updatePostHandler, handler_doCreateLookupBatch) + .post( + '/doGetLookupBatch', + updateOrOperatorPostHandler, + handler_doGetLookupBatch + ) + .post( + '/doAddLicencePlateToLookupBatch', + updatePostHandler, + handler_doAddLicencePlateToLookupBatch + ) + .post( + '/doAddAllParkingTicketsToLookupBatch', + updatePostHandler, + handler_doAddAllParkingTicketsToLookupBatch + ) + .post( + '/doRemoveLicencePlateFromLookupBatch', + updatePostHandler, + handler_doRemoveLicencePlateFromLookupBatch + ) + .post('/doClearLookupBatch', updatePostHandler, handler_doClearLookupBatch) + .post('/doLockLookupBatch', updatePostHandler, handler_doLockLookupBatch) + .post('/doGetModelsByMake', handler_doGetModelsByMake) // View router.get( '/:licencePlateCountry/:licencePlateProvince/:licencePlateNumber', - handler_view as RequestHandler + handler_view as RequestHandler ) export default router diff --git a/routes/reports.d.ts b/routes/reports.d.ts index 433ab333..5946e44f 100644 --- a/routes/reports.d.ts +++ b/routes/reports.d.ts @@ -1,2 +1,2 @@ -export declare const router: import("express-serve-static-core").Router; -export default router; +declare const _default: import("express-serve-static-core").Router; +export default _default; diff --git a/routes/reports.js b/routes/reports.js index eeba5b47..ae034457 100644 --- a/routes/reports.js +++ b/routes/reports.js @@ -1,13 +1,12 @@ import * as dateTimeFns from '@cityssm/utils-datetime'; import { Router } from 'express'; import handler_reportName from '../handlers/reports-all/reportName.js'; -export const router = Router(); -router.get('/', (_request, response) => { +export default Router() + .get('/', (_request, response) => { const rightNow = new Date(); response.render('report-search', { headTitle: 'Reports', todayDateString: dateTimeFns.dateToString(rightNow) }); -}); -router.all('/:reportName', handler_reportName); -export default router; +}) + .all('/:reportName', handler_reportName); diff --git a/routes/reports.ts b/routes/reports.ts index f029e81f..20b92ac1 100644 --- a/routes/reports.ts +++ b/routes/reports.ts @@ -3,17 +3,13 @@ import { Router } from 'express' import handler_reportName from '../handlers/reports-all/reportName.js' -export const router = Router() - -router.get('/', (_request, response) => { - const rightNow = new Date() - - response.render('report-search', { - headTitle: 'Reports', - todayDateString: dateTimeFns.dateToString(rightNow) +export default Router() + .get('/', (_request, response) => { + const rightNow = new Date() + + response.render('report-search', { + headTitle: 'Reports', + todayDateString: dateTimeFns.dateToString(rightNow) + }) }) -}) - -router.all('/:reportName', handler_reportName) - -export default router + .all('/:reportName', handler_reportName) diff --git a/routes/tickets-ontario.js b/routes/tickets-ontario.js index fcfa2e92..901ef4d5 100644 --- a/routes/tickets-ontario.js +++ b/routes/tickets-ontario.js @@ -5,8 +5,9 @@ import handler_doAddAllTicketsToConvictionBatch from '../handlers/tickets-ontari import handler_doClearConvictionBatch from '../handlers/tickets-ontario-post/doClearConvictionBatch.js'; import handler_doRemoveTicketFromConvictionBatch from '../handlers/tickets-ontario-post/doRemoveTicketFromConvictionBatch.js'; export const router = Router(); -router.get('/convict', permissionHandlers.updateOrOperatorGetHandler, handler_convict); -router.post('/doAddAllTicketsToConvictionBatch', permissionHandlers.updatePostHandler, handler_doAddAllTicketsToConvictionBatch); -router.post('/doClearConvictionBatch', permissionHandlers.updatePostHandler, handler_doClearConvictionBatch); -router.post('/doRemoveTicketFromConvictionBatch', permissionHandlers.updatePostHandler, handler_doRemoveTicketFromConvictionBatch); +router + .get('/convict', permissionHandlers.updateOrOperatorGetHandler, handler_convict) + .post('/doAddAllTicketsToConvictionBatch', permissionHandlers.updatePostHandler, handler_doAddAllTicketsToConvictionBatch) + .post('/doClearConvictionBatch', permissionHandlers.updatePostHandler, handler_doClearConvictionBatch) + .post('/doRemoveTicketFromConvictionBatch', permissionHandlers.updatePostHandler, handler_doRemoveTicketFromConvictionBatch); export default router; diff --git a/routes/tickets-ontario.ts b/routes/tickets-ontario.ts index 78a30e67..1a35112f 100644 --- a/routes/tickets-ontario.ts +++ b/routes/tickets-ontario.ts @@ -10,28 +10,26 @@ import handler_doRemoveTicketFromConvictionBatch from '../handlers/tickets-ontar export const router = Router() -router.get( - '/convict', - permissionHandlers.updateOrOperatorGetHandler, - handler_convict -) - -router.post( - '/doAddAllTicketsToConvictionBatch', - permissionHandlers.updatePostHandler, - handler_doAddAllTicketsToConvictionBatch -) - -router.post( - '/doClearConvictionBatch', - permissionHandlers.updatePostHandler, - handler_doClearConvictionBatch -) - -router.post( - '/doRemoveTicketFromConvictionBatch', - permissionHandlers.updatePostHandler, - handler_doRemoveTicketFromConvictionBatch -) +router + .get( + '/convict', + permissionHandlers.updateOrOperatorGetHandler, + handler_convict + ) + .post( + '/doAddAllTicketsToConvictionBatch', + permissionHandlers.updatePostHandler, + handler_doAddAllTicketsToConvictionBatch + ) + .post( + '/doClearConvictionBatch', + permissionHandlers.updatePostHandler, + handler_doClearConvictionBatch + ) + .post( + '/doRemoveTicketFromConvictionBatch', + permissionHandlers.updatePostHandler, + handler_doRemoveTicketFromConvictionBatch + ) export default router diff --git a/routes/tickets.js b/routes/tickets.js index dededc5e..1b7850e5 100644 --- a/routes/tickets.js +++ b/routes/tickets.js @@ -34,42 +34,50 @@ import handler_doUpdateRemark from '../handlers/tickets-post/doUpdateRemark.js'; import handler_doUpdateStatus from '../handlers/tickets-post/doUpdateStatus.js'; import handler_doUpdateTicket from '../handlers/tickets-post/doUpdateTicket.js'; export const router = Router(); -router.get('/', (_request, response) => { +router + .get('/', (_request, response) => { response.render('ticket-search', { headTitle: 'Parking Tickets' }); -}); -router.post('/doGetTickets', handler_doGetTickets); -router.get('/reconcile', updateGetHandler, handler_reconcile); -router.post('/doAcknowledgeLookupError', updatePostHandler, handler_doAcknowledgeLookupError); -router.post('/doReconcileAsMatch', updatePostHandler, handler_doReconcileAsMatch); -router.post('/doReconcileAsError', updatePostHandler, handler_doReconcileAsError); -router.post('/doQuickReconcileMatches', updatePostHandler, handler_doQuickReconcileMatches); -router.post('/doGetRecentConvictionBatches', updateOrOperatorPostHandler, handler_doGetRecentConvictionBatches); -router.post('/doGetConvictionBatch', updateOrOperatorPostHandler, handler_doGetConvictionBatch); -router.post('/doCreateConvictionBatch', updatePostHandler, handler_doCreateConvictionBatch); -router.post('/doAddTicketToConvictionBatch', updatePostHandler, handler_doAddTicketToConvictionBatch); -router.post('/doLockConvictionBatch', updatePostHandler, handler_doLockConvictionBatch); -router.post('/doUnlockConvictionBatch', updatePostHandler, handler_doUnlockConvictionBatch); -router.get(['/new', '/new/:ticketNumber'], updateGetHandler, handler_new); -router.post('/doCreateTicket', updatePostHandler, handler_doCreateTicket); -router.post('/doUpdateTicket', updatePostHandler, handler_doUpdateTicket); -router.post('/doDeleteTicket', updatePostHandler, handler_doDeleteTicket); -router.post('/doResolveTicket', updatePostHandler, handler_doResolveTicket); -router.post('/doUnresolveTicket', updatePostHandler, handler_doUnresolveTicket); -router.post('/doRestoreTicket', updatePostHandler, handler_doRestoreTicket); -router.post('/doGetRemarks', handler_doGetRemarks); -router.post('/doAddRemark', updatePostHandler, handler_doAddRemark); -router.post('/doUpdateRemark', updatePostHandler, handler_doUpdateRemark); -router.post('/doDeleteRemark', updatePostHandler, handler_doDeleteRemark); -router.post('/doGetStatuses', handler_doGetStatuses); -router.post('/doAddStatus', updatePostHandler, handler_doAddStatus); -router.post('/doUpdateStatus', updatePostHandler, handler_doUpdateStatus); -router.post('/doDeleteStatus', updatePostHandler, handler_doDeleteStatus); -router.get('/:ticketId', handler_view); -router.get('/:ticketId/print', handler_print); -router.get('/byTicketNumber/:ticketNumber', handler_byTicketNumber); +}) + .post('/doGetTickets', handler_doGetTickets); +router + .get('/reconcile', updateGetHandler, handler_reconcile) + .post('/doAcknowledgeLookupError', updatePostHandler, handler_doAcknowledgeLookupError) + .post('/doReconcileAsMatch', updatePostHandler, handler_doReconcileAsMatch) + .post('/doReconcileAsError', updatePostHandler, handler_doReconcileAsError) + .post('/doQuickReconcileMatches', updatePostHandler, handler_doQuickReconcileMatches); +router + .post('/doGetRecentConvictionBatches', updateOrOperatorPostHandler, handler_doGetRecentConvictionBatches) + .post('/doGetConvictionBatch', updateOrOperatorPostHandler, handler_doGetConvictionBatch) + .post('/doCreateConvictionBatch', updatePostHandler, handler_doCreateConvictionBatch) + .post('/doAddTicketToConvictionBatch', updatePostHandler, handler_doAddTicketToConvictionBatch) + .post('/doLockConvictionBatch', updatePostHandler, handler_doLockConvictionBatch) + .post('/doUnlockConvictionBatch', updatePostHandler, handler_doUnlockConvictionBatch); +router + .get(['/new', '/new/:ticketNumber'], updateGetHandler, handler_new) + .post('/doCreateTicket', updatePostHandler, handler_doCreateTicket) + .post('/doUpdateTicket', updatePostHandler, handler_doUpdateTicket) + .post('/doDeleteTicket', updatePostHandler, handler_doDeleteTicket) + .post('/doResolveTicket', updatePostHandler, handler_doResolveTicket) + .post('/doUnresolveTicket', updatePostHandler, handler_doUnresolveTicket) + .post('/doRestoreTicket', updatePostHandler, handler_doRestoreTicket); +router + .post('/doGetRemarks', handler_doGetRemarks) + .post('/doAddRemark', updatePostHandler, handler_doAddRemark) + .post('/doUpdateRemark', updatePostHandler, handler_doUpdateRemark) + .post('/doDeleteRemark', updatePostHandler, handler_doDeleteRemark); +router + .post('/doGetStatuses', handler_doGetStatuses) + .post('/doAddStatus', updatePostHandler, handler_doAddStatus) + .post('/doUpdateStatus', updatePostHandler, handler_doUpdateStatus) + .post('/doDeleteStatus', updatePostHandler, handler_doDeleteStatus); +router + .get('/:ticketId', handler_view) + .get('/:ticketId/print', handler_print) + .get('/byTicketNumber/:ticketNumber', handler_byTicketNumber); router.get('/:ticketId/edit', updateGetHandler, handler_edit); -router.get('/convict/:batchId/print', updateOrOperatorGetHandler, handler_convictPrint); -router.post('/doMarkConvictionBatchSent', updateOrOperatorGetHandler, handler_doMarkConvictionBatchSent); +router + .get('/convict/:batchId/print', updateOrOperatorGetHandler, handler_convictPrint) + .post('/doMarkConvictionBatchSent', updateOrOperatorGetHandler, handler_doMarkConvictionBatchSent); export default router; diff --git a/routes/tickets.ts b/routes/tickets.ts index 926c33fc..576c6983 100644 --- a/routes/tickets.ts +++ b/routes/tickets.ts @@ -7,12 +7,20 @@ import { updatePostHandler } from '../handlers/permissions.js' import handler_byTicketNumber from '../handlers/tickets-get/byTicketNumber.js' -import handler_convictPrint from '../handlers/tickets-get/convictPrint.js' -import handler_edit from '../handlers/tickets-get/edit.js' +import handler_convictPrint, { + type TicketsConvictPrintParameters +} from '../handlers/tickets-get/convictPrint.js' +import handler_edit, { + type TicketsEditParameters +} from '../handlers/tickets-get/edit.js' import handler_new from '../handlers/tickets-get/new.js' -import handler_print from '../handlers/tickets-get/print.js' +import handler_print, { + type TicketsPrintParameters +} from '../handlers/tickets-get/print.js' import handler_reconcile from '../handlers/tickets-get/reconcile.js' -import handler_view from '../handlers/tickets-get/view.js' +import handler_view, { + type TicketsViewParameters +} from '../handlers/tickets-get/view.js' import handler_doAcknowledgeLookupError from '../handlers/tickets-post/doAcknowledgeLookupError.js' import handler_doAddRemark from '../handlers/tickets-post/doAddRemark.js' import handler_doAddStatus from '../handlers/tickets-post/doAddStatus.js' @@ -46,156 +54,146 @@ export const router = Router() * Ticket Search */ -router.get('/', (_request, response) => { - response.render('ticket-search', { - headTitle: 'Parking Tickets' +router + .get('/', (_request, response) => { + response.render('ticket-search', { + headTitle: 'Parking Tickets' + }) }) -}) - -router.post('/doGetTickets', handler_doGetTickets) + .post('/doGetTickets', handler_doGetTickets) /* * Ownership Reconciliation */ -router.get('/reconcile', updateGetHandler, handler_reconcile as RequestHandler) - -router.post( - '/doAcknowledgeLookupError', - updatePostHandler, - handler_doAcknowledgeLookupError -) - -router.post( - '/doReconcileAsMatch', - updatePostHandler, - handler_doReconcileAsMatch as RequestHandler -) - -router.post( - '/doReconcileAsError', - updatePostHandler, - handler_doReconcileAsError as RequestHandler -) - -router.post( - '/doQuickReconcileMatches', - updatePostHandler, - handler_doQuickReconcileMatches as RequestHandler -) +router + .get('/reconcile', updateGetHandler, handler_reconcile as RequestHandler) + .post( + '/doAcknowledgeLookupError', + updatePostHandler, + handler_doAcknowledgeLookupError + ) + .post( + '/doReconcileAsMatch', + updatePostHandler, + handler_doReconcileAsMatch as RequestHandler + ) + .post( + '/doReconcileAsError', + updatePostHandler, + handler_doReconcileAsError as RequestHandler + ) + .post( + '/doQuickReconcileMatches', + updatePostHandler, + handler_doQuickReconcileMatches as RequestHandler + ) /* * Ticket Convictions */ -router.post( - '/doGetRecentConvictionBatches', - updateOrOperatorPostHandler, - handler_doGetRecentConvictionBatches -) - -router.post( - '/doGetConvictionBatch', - updateOrOperatorPostHandler, - handler_doGetConvictionBatch -) - -router.post( - '/doCreateConvictionBatch', - updatePostHandler, - handler_doCreateConvictionBatch -) - -router.post( - '/doAddTicketToConvictionBatch', - updatePostHandler, - handler_doAddTicketToConvictionBatch -) - -router.post( - '/doLockConvictionBatch', - updatePostHandler, - handler_doLockConvictionBatch -) - -router.post( - '/doUnlockConvictionBatch', - updatePostHandler, - handler_doUnlockConvictionBatch -) +router + .post( + '/doGetRecentConvictionBatches', + updateOrOperatorPostHandler, + handler_doGetRecentConvictionBatches + ) + .post( + '/doGetConvictionBatch', + updateOrOperatorPostHandler, + handler_doGetConvictionBatch + ) + .post( + '/doCreateConvictionBatch', + updatePostHandler, + handler_doCreateConvictionBatch + ) + .post( + '/doAddTicketToConvictionBatch', + updatePostHandler, + handler_doAddTicketToConvictionBatch + ) + .post( + '/doLockConvictionBatch', + updatePostHandler, + handler_doLockConvictionBatch + ) + .post( + '/doUnlockConvictionBatch', + updatePostHandler, + handler_doUnlockConvictionBatch + ) /* * New Ticket */ -router.get(['/new', '/new/:ticketNumber'], updateGetHandler, handler_new) - -router.post('/doCreateTicket', updatePostHandler, handler_doCreateTicket) - -router.post('/doUpdateTicket', updatePostHandler, handler_doUpdateTicket) - -router.post('/doDeleteTicket', updatePostHandler, handler_doDeleteTicket) - -router.post('/doResolveTicket', updatePostHandler, handler_doResolveTicket) - -router.post('/doUnresolveTicket', updatePostHandler, handler_doUnresolveTicket) - -router.post('/doRestoreTicket', updatePostHandler, handler_doRestoreTicket) +router + .get(['/new', '/new/:ticketNumber'], updateGetHandler, handler_new) + .post('/doCreateTicket', updatePostHandler, handler_doCreateTicket) + .post('/doUpdateTicket', updatePostHandler, handler_doUpdateTicket) + .post('/doDeleteTicket', updatePostHandler, handler_doDeleteTicket) + .post('/doResolveTicket', updatePostHandler, handler_doResolveTicket) + .post('/doUnresolveTicket', updatePostHandler, handler_doUnresolveTicket) + .post('/doRestoreTicket', updatePostHandler, handler_doRestoreTicket) /* * Ticket Remarks */ -router.post('/doGetRemarks', handler_doGetRemarks) - -router.post('/doAddRemark', updatePostHandler, handler_doAddRemark) - -router.post('/doUpdateRemark', updatePostHandler, handler_doUpdateRemark) - -router.post('/doDeleteRemark', updatePostHandler, handler_doDeleteRemark) +router + .post('/doGetRemarks', handler_doGetRemarks) + .post('/doAddRemark', updatePostHandler, handler_doAddRemark) + .post('/doUpdateRemark', updatePostHandler, handler_doUpdateRemark) + .post('/doDeleteRemark', updatePostHandler, handler_doDeleteRemark) /* * Ticket Statuses */ -router.post('/doGetStatuses', handler_doGetStatuses) - -router.post('/doAddStatus', updatePostHandler, handler_doAddStatus) - -router.post('/doUpdateStatus', updatePostHandler, handler_doUpdateStatus) - -router.post('/doDeleteStatus', updatePostHandler, handler_doDeleteStatus) +router + .post('/doGetStatuses', handler_doGetStatuses) + .post('/doAddStatus', updatePostHandler, handler_doAddStatus) + .post('/doUpdateStatus', updatePostHandler, handler_doUpdateStatus) + .post('/doDeleteStatus', updatePostHandler, handler_doDeleteStatus) /* * Ticket View */ -router.get('/:ticketId', handler_view as RequestHandler) - -router.get('/:ticketId/print', handler_print as RequestHandler) - -router.get('/byTicketNumber/:ticketNumber', handler_byTicketNumber) +router + .get('/:ticketId', handler_view as RequestHandler) + .get( + '/:ticketId/print', + handler_print as RequestHandler + ) + .get('/byTicketNumber/:ticketNumber', handler_byTicketNumber) /* * Ticket Edit */ -router.get('/:ticketId/edit', updateGetHandler, handler_edit as RequestHandler) +router.get( + '/:ticketId/edit', + updateGetHandler as unknown as RequestHandler, + handler_edit as RequestHandler +) /* * Ticket Convict */ -router.get( - '/convict/:batchId/print', - updateOrOperatorGetHandler, - handler_convictPrint -) - -router.post( - '/doMarkConvictionBatchSent', - updateOrOperatorGetHandler, - handler_doMarkConvictionBatchSent -) +router + .get( + '/convict/:batchId/print', + updateOrOperatorGetHandler as unknown as RequestHandler, + handler_convictPrint as RequestHandler + ) + .post( + '/doMarkConvictionBatchSent', + updateOrOperatorGetHandler, + handler_doMarkConvictionBatchSent + ) export default router