diff --git a/handlers/lots-get/next.d.ts b/handlers/lots-get/next.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/lots-get/next.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/lots-get/next.js b/handlers/lots-get/next.js new file mode 100644 index 00000000..a90e2d1e --- /dev/null +++ b/handlers/lots-get/next.js @@ -0,0 +1,11 @@ +import * as configFunctions from "../../helpers/functions.config.js"; +import { getNextLotId } from "../../helpers/lotOccupancyDB/getNextLotId.js"; +export const handler = (request, response) => { + const lotId = request.params.lotId; + const nextLotId = getNextLotId(lotId); + if (!nextLotId) { + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/?error=noNextLotIdFound"); + } + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/" + nextLotId); +}; +export default handler; diff --git a/handlers/lots-get/next.ts b/handlers/lots-get/next.ts new file mode 100644 index 00000000..68d54e83 --- /dev/null +++ b/handlers/lots-get/next.ts @@ -0,0 +1,26 @@ +import type { + RequestHandler +} from "express"; + +import * as configFunctions from "../../helpers/functions.config.js"; + +import { + getNextLotId +} from "../../helpers/lotOccupancyDB/getNextLotId.js"; + + +export const handler: RequestHandler = (request, response) => { + + const lotId = request.params.lotId; + + const nextLotId = getNextLotId(lotId); + + if (!nextLotId) { + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/?error=noNextLotIdFound"); + } + + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/" + nextLotId); +}; + + +export default handler; \ No newline at end of file diff --git a/handlers/lots-get/previous.d.ts b/handlers/lots-get/previous.d.ts new file mode 100644 index 00000000..9621c611 --- /dev/null +++ b/handlers/lots-get/previous.d.ts @@ -0,0 +1,3 @@ +import type { RequestHandler } from "express"; +export declare const handler: RequestHandler; +export default handler; diff --git a/handlers/lots-get/previous.js b/handlers/lots-get/previous.js new file mode 100644 index 00000000..8559eb18 --- /dev/null +++ b/handlers/lots-get/previous.js @@ -0,0 +1,11 @@ +import * as configFunctions from "../../helpers/functions.config.js"; +import { getPreviousLotId } from "../../helpers/lotOccupancyDB/getPreviousLotId.js"; +export const handler = (request, response) => { + const lotId = request.params.lotId; + const previousLotId = getPreviousLotId(lotId); + if (!previousLotId) { + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/?error=noPreviousLotIdFound"); + } + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/" + previousLotId); +}; +export default handler; diff --git a/handlers/lots-get/previous.ts b/handlers/lots-get/previous.ts new file mode 100644 index 00000000..a3ed9f36 --- /dev/null +++ b/handlers/lots-get/previous.ts @@ -0,0 +1,26 @@ +import type { + RequestHandler +} from "express"; + +import * as configFunctions from "../../helpers/functions.config.js"; + +import { + getPreviousLotId +} from "../../helpers/lotOccupancyDB/getPreviousLotId.js"; + + +export const handler: RequestHandler = (request, response) => { + + const lotId = request.params.lotId; + + const previousLotId = getPreviousLotId(lotId); + + if (!previousLotId) { + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/?error=noPreviousLotIdFound"); + } + + return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/lots/" + previousLotId); +}; + + +export default handler; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/getNextLotId.d.ts b/helpers/lotOccupancyDB/getNextLotId.d.ts new file mode 100644 index 00000000..70e82d2b --- /dev/null +++ b/helpers/lotOccupancyDB/getNextLotId.d.ts @@ -0,0 +1,2 @@ +export declare const getNextLotId: (lotId: number | string) => number; +export default getNextLotId; diff --git a/helpers/lotOccupancyDB/getNextLotId.js b/helpers/lotOccupancyDB/getNextLotId.js new file mode 100644 index 00000000..2d1c930c --- /dev/null +++ b/helpers/lotOccupancyDB/getNextLotId.js @@ -0,0 +1,20 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const getNextLotId = (lotId) => { + const database = sqlite(databasePath, { + readonly: true + }); + const result = database + .prepare("select lotId from Lots" + + " where recordDelete_timeMillis is null" + + " and lotName > (select lotName from Lots where lotId = ?)" + + " order by lotName" + + " limit 1") + .get(lotId); + database.close(); + if (result) { + return result.lotId; + } + return undefined; +}; +export default getNextLotId; diff --git a/helpers/lotOccupancyDB/getNextLotId.ts b/helpers/lotOccupancyDB/getNextLotId.ts new file mode 100644 index 00000000..05bb3e77 --- /dev/null +++ b/helpers/lotOccupancyDB/getNextLotId.ts @@ -0,0 +1,34 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + + +export const getNextLotId = (lotId: number | string): number => { + + const database = sqlite(databasePath, { + readonly: true + }); + + const result: { + lotId: number + } = database + .prepare("select lotId from Lots" + + " where recordDelete_timeMillis is null" + + " and lotName > (select lotName from Lots where lotId = ?)" + + " order by lotName" + + " limit 1") + .get(lotId); + + database.close(); + + if (result) { + return result.lotId; + } + + return undefined; +}; + + +export default getNextLotId; \ No newline at end of file diff --git a/helpers/lotOccupancyDB/getPreviousLotId.d.ts b/helpers/lotOccupancyDB/getPreviousLotId.d.ts new file mode 100644 index 00000000..d218e2e5 --- /dev/null +++ b/helpers/lotOccupancyDB/getPreviousLotId.d.ts @@ -0,0 +1,2 @@ +export declare const getPreviousLotId: (lotId: number | string) => number; +export default getPreviousLotId; diff --git a/helpers/lotOccupancyDB/getPreviousLotId.js b/helpers/lotOccupancyDB/getPreviousLotId.js new file mode 100644 index 00000000..a1fd624b --- /dev/null +++ b/helpers/lotOccupancyDB/getPreviousLotId.js @@ -0,0 +1,20 @@ +import sqlite from "better-sqlite3"; +import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js"; +export const getPreviousLotId = (lotId) => { + const database = sqlite(databasePath, { + readonly: true + }); + const result = database + .prepare("select lotId from Lots" + + " where recordDelete_timeMillis is null" + + " and lotName < (select lotName from Lots where lotId = ?)" + + " order by lotName desc" + + " limit 1") + .get(lotId); + database.close(); + if (result) { + return result.lotId; + } + return undefined; +}; +export default getPreviousLotId; diff --git a/helpers/lotOccupancyDB/getPreviousLotId.ts b/helpers/lotOccupancyDB/getPreviousLotId.ts new file mode 100644 index 00000000..578f05e8 --- /dev/null +++ b/helpers/lotOccupancyDB/getPreviousLotId.ts @@ -0,0 +1,34 @@ +import sqlite from "better-sqlite3"; + +import { + lotOccupancyDB as databasePath +} from "../../data/databasePaths.js"; + + +export const getPreviousLotId = (lotId: number | string): number => { + + const database = sqlite(databasePath, { + readonly: true + }); + + const result: { + lotId: number + } = database + .prepare("select lotId from Lots" + + " where recordDelete_timeMillis is null" + + " and lotName < (select lotName from Lots where lotId = ?)" + + " order by lotName desc" + + " limit 1") + .get(lotId); + + database.close(); + + if (result) { + return result.lotId; + } + + return undefined; +}; + + +export default getPreviousLotId; \ No newline at end of file diff --git a/routes/lots.js b/routes/lots.js index aaad5517..683cead8 100644 --- a/routes/lots.js +++ b/routes/lots.js @@ -3,6 +3,8 @@ import * as permissionHandlers from "../handlers/permissions.js"; import handler_search from "../handlers/lots-get/search.js"; import handler_doSearchLots from "../handlers/lots-post/doSearchLots.js"; import handler_view from "../handlers/lots-get/view.js"; +import handler_next from "../handlers/lots-get/next.js"; +import handler_previous from "../handlers/lots-get/previous.js"; import handler_new from "../handlers/lots-get/new.js"; import handler_edit from "../handlers/lots-get/edit.js"; import handler_doCreateLot from "../handlers/lots-post/doCreateLot.js"; @@ -15,6 +17,8 @@ router.get("/", handler_search); router.post("/doSearchLots", handler_doSearchLots); router.get("/new", permissionHandlers.updateGetHandler, handler_new); router.get("/:lotId", handler_view); +router.get("/:lotId/next", handler_next); +router.get("/:lotId/previous", handler_previous); router.get("/:lotId/edit", permissionHandlers.updateGetHandler, handler_edit); router.post("/doCreateLot", permissionHandlers.updatePostHandler, handler_doCreateLot); router.post("/doUpdateLot", permissionHandlers.updatePostHandler, handler_doUpdateLot); diff --git a/routes/lots.ts b/routes/lots.ts index bf303680..a60def9b 100644 --- a/routes/lots.ts +++ b/routes/lots.ts @@ -6,6 +6,9 @@ import handler_search from "../handlers/lots-get/search.js"; import handler_doSearchLots from "../handlers/lots-post/doSearchLots.js"; import handler_view from "../handlers/lots-get/view.js"; +import handler_next from "../handlers/lots-get/next.js"; +import handler_previous from "../handlers/lots-get/previous.js"; + import handler_new from "../handlers/lots-get/new.js"; import handler_edit from "../handlers/lots-get/edit.js"; @@ -46,6 +49,14 @@ router.get("/:lotId", handler_view); +router.get("/:lotId/next", + handler_next); + + +router.get("/:lotId/previous", + handler_previous); + + router.get("/:lotId/edit", permissionHandlers.updateGetHandler, handler_edit); diff --git a/views/lot-view.ejs b/views/lot-view.ejs index c1eaa110..5d483062 100644 --- a/views/lot-view.ejs +++ b/views/lot-view.ejs @@ -19,16 +19,29 @@ <%= lot.lotName %> -<% if (user.userProperties.canUpdate) { %>