implemented task 5

This commit is contained in:
Jonas Hinterdorfer 2025-03-16 13:54:56 +01:00
parent d905f7c8ae
commit 89dc70e3e1
3 changed files with 75 additions and 2 deletions

View File

@ -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<null, null, null, {departureTime : string}>, res : Response) : Promise<void> => {
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<void> => {
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);
});

View File

@ -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<PlaneModel | null>{
const sql = `select tailNo, model, manufacturer, capacity from Plane where tailNo = ?1;`
const params = {
1: tailNo
}
return await this.get<PlaneModel>(sql, params);
}
static async getAvailbePlanes(date : Date) : Promise<string[]>{
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<string>(sql, params);
}
}

View File

@ -32,9 +32,9 @@ export class ServiceBase {
return result ?? null;
}
public static async all<T>(sql: string): Promise<T[]> {
public static async all<T>(sql: string, bindings : any | null = null): Promise<T[]> {
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<T[]>();
await unit.complete(true);
return result;