From 89dc70e3e118376f512d7459eaa72ca454c7e43c Mon Sep 17 00:00:00 2001 From: Jonas Hinterdorfer Date: Sun, 16 Mar 2025 13:54:56 +0100 Subject: [PATCH] implemented task 5 --- src/routes/plane.router.ts | 41 +++++++++++++++++++++++++++++++++++ src/services/plane.service.ts | 32 +++++++++++++++++++++++++++ src/services/serviceBase.ts | 4 ++-- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/routes/plane.router.ts create mode 100644 src/services/plane.service.ts diff --git a/src/routes/plane.router.ts b/src/routes/plane.router.ts new file mode 100644 index 0000000..54a81ca --- /dev/null +++ b/src/routes/plane.router.ts @@ -0,0 +1,41 @@ +import express, {Request, Response} from "express"; +import {StatusCodes} from "http-status-codes"; +import {PlaneService} from "../services/plane.service"; +import {PlaneModel} from "../models/plane.model"; + +const router = express.Router(); + +router.get('/', async (req : Request, res : Response) : Promise => { + const departureTimeIso = req.query.departureTime; + const dateNumber =Date.parse(departureTimeIso); + + if(isNaN(dateNumber)) + { + res.sendStatus(StatusCodes.BAD_REQUEST); + return ; + } + + const departureTime = new Date(); + const planes = await PlaneService.getAvailbePlanes(departureTime); + + res.status(200).json(planes); +}); + +router.get('/:tailNo', async (req : Request<{tailNo : string}>, res : Response) : Promise => { + const tailNo = req.params.tailNo; + + if(tailNo === undefined || tailNo.length <6) + { + res.sendStatus(StatusCodes.BAD_REQUEST); + return ; + } + + const plane : PlaneModel | null = await PlaneService.getOne(tailNo); + + if(plane === null){ + res.sendStatus(StatusCodes.NO_CONTENT); + return ; + } + + res.status(200).json(plane); +}); \ No newline at end of file diff --git a/src/services/plane.service.ts b/src/services/plane.service.ts new file mode 100644 index 0000000..44093d1 --- /dev/null +++ b/src/services/plane.service.ts @@ -0,0 +1,32 @@ +import {ServiceBase} from "./serviceBase"; +import {PlaneModel} from "../models/plane.model"; + + +export class PlaneService extends ServiceBase { + static async getOne(tailNo : string) : Promise{ + const sql = `select tailNo, model, manufacturer, capacity from Plane where tailNo = ?1;` + const params = { + 1: tailNo + } + return await this.get(sql, params); + } + + static async getAvailbePlanes(date : Date) : Promise{ + const sql = `WITH BlockedPlanes AS (SELECT p.tailNo + FROM Plane p + JOIN Flight f ON p.tailNo = f.operates + WHERE f.departure BETWEEN datetime(?1, '-12 hours') AND datetime(?1, '+12 hours')) + SELECT p.tailNo + FROM Plane p + LEFT JOIN BlockedPlanes bp ON p.tailNo = bp.tailNo + WHERE bp.tailNo IS NULL;` + + const params = { + 1: date.toISOString() + } + + return await this.all(sql, params); + } + + +} \ No newline at end of file diff --git a/src/services/serviceBase.ts b/src/services/serviceBase.ts index 8bd4fa5..51790d2 100644 --- a/src/services/serviceBase.ts +++ b/src/services/serviceBase.ts @@ -32,9 +32,9 @@ export class ServiceBase { return result ?? null; } - public static async all(sql: string): Promise { + public static async all(sql: string, bindings : any | null = null): Promise { const unit: Unit = await Unit.create(false); - const smt: Statement = await unit.prepare(sql); + const smt: Statement = await unit.prepare(sql, bindings); const result = await smt.all(); await unit.complete(true); return result;