From f0d41f571195887651aa5a7aab259f875d4ad204 Mon Sep 17 00:00:00 2001 From: Jonas Hinterdorfer Date: Sun, 16 Mar 2025 13:15:50 +0100 Subject: [PATCH] implemented task 3 --- requests.http | 14 ++++++++ src/app.ts | 2 ++ src/routes/passenger.router.ts | 56 +++++++++++++++++++++++++++++++ src/services/passenger.service.ts | 52 ++++++++++++++++++++++++++++ src/services/serviceBase.ts | 42 +++++++++++++++++++++++ 5 files changed, 166 insertions(+) create mode 100644 requests.http create mode 100644 src/routes/passenger.router.ts create mode 100644 src/services/passenger.service.ts create mode 100644 src/services/serviceBase.ts diff --git a/requests.http b/requests.http new file mode 100644 index 0000000..289af28 --- /dev/null +++ b/requests.http @@ -0,0 +1,14 @@ +PUT http://localhost:3000/api/passengers/123456789 +Content-Type: application/json + +{ + "name": "John Doe", + "dateOfBirth": "1990-01-01T00:00:00.000Z", + "isFemale": false +} + +### get all +GET http://localhost:3000/api/passengers/ + +### get one +GET http://localhost:3000/api/passengers/123456789 \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 9d3f842..30a27fc 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,9 +1,11 @@ import express, {json} from 'express'; import flightRouter from "./routes/flight.router"; +import passengerRouter from "./routes/passenger.router"; const app = express(); app.use(json()) app.use('/api/flights', flightRouter) +app.use('/api/passengers', passengerRouter) app.listen(3000, () => { diff --git a/src/routes/passenger.router.ts b/src/routes/passenger.router.ts new file mode 100644 index 0000000..33ca171 --- /dev/null +++ b/src/routes/passenger.router.ts @@ -0,0 +1,56 @@ +import express, {Request, Response, Router} from "express"; +import {PassengerModel} from "../models/passenger.model"; +import {StatusCodes} from "http-status-codes"; +import {PassengerService} from "../services/passenger.service"; + +const router: Router = express.Router(); + + +router.put('/:ssn', async (request: Request<{ ssn: string }, PassengerModel>, response: Response): Promise => { + const ssn: string = request.params.ssn; + const passenger: PassengerModel = request.body; + + if (typeof passenger.dateOfBirth === "string") { //warning because of type loss at run time + passenger.dateOfBirth = new Date(Date.parse(passenger.dateOfBirth)); + } + + if (ssn === undefined || ssn.length != 9) { + response.sendStatus(StatusCodes.BAD_REQUEST); + return; + } + passenger.ssn = ssn; + + await PassengerService.updateOrCreate(passenger) + + response.sendStatus(StatusCodes.OK); +}) + +router.get('/', async (request: Request, response: Response): Promise => { + const passengers: PassengerModel[] = await PassengerService.getAll(); + response.status(StatusCodes.OK).json(passengers); + return; +}); + + +router.get('/:ssn', async (request: Request<{ + ssn: string | undefined +}, PassengerModel>, response: Response): Promise => { + const ssn: string | undefined = request.params.ssn; + + if (ssn === undefined || ssn.length != 9) { + response.sendStatus(StatusCodes.BAD_REQUEST); + return; + } + + const passanger: PassengerModel | null = await PassengerService.getOne(ssn); + + if (passanger === null) { + response.sendStatus(StatusCodes.NO_CONTENT); + return; + } + + response.status(StatusCodes.OK).json(passanger); + return; +}); + +export default router; \ No newline at end of file diff --git a/src/services/passenger.service.ts b/src/services/passenger.service.ts new file mode 100644 index 0000000..2edf8ae --- /dev/null +++ b/src/services/passenger.service.ts @@ -0,0 +1,52 @@ +import {PassengerModel} from "../models/passenger.model"; +import {ServiceBase} from "./serviceBase"; + +export class PassengerService extends ServiceBase { + static async create(passenger: PassengerModel): Promise { + const sql = `INSERT INTO Passenger (ssn, name, dateOfBirth, isFemale) VALUES (?1, ?2, ?3, ?4)`; + const params = { + 1: passenger.ssn, + 2: passenger.name, + 3: passenger.dateOfBirth.toISOString(), + 4: passenger.isFemale + }; + return await this.run(sql, params, 1); + } + + static async update(passenger : PassengerModel) : Promise{ + const sql = `update Passenger set name = ?1, dateOfBirth = ?2, isFemale = ?3 where ssn = ?4`; + const params = { + 1: passenger.name, + 2: passenger.dateOfBirth.toISOString(), + 3: passenger.isFemale, + 4: passenger.ssn + }; + + return await this.run(sql, params, 1); + } + + static async getOne(ssn : string) : Promise{ + const sql = `select ssn, name, dateOfBirth, isFemale from Passenger where ssn = ?1;` + const params = { + 1: ssn + } + return await this.get(sql, params); + } + + static async getAll() : Promise{ + const sql = `select ssn, name, dateOfBirth, isFemale from Passenger;` + return await this.all(sql); + + } + + static async updateOrCreate(passenger : PassengerModel) : Promise{ + const dbPassenger = await this.getOne(passenger.ssn); + if(dbPassenger === null) + { + await this.create(passenger); + } + else{ + await this.update(passenger); + } + } +} \ No newline at end of file diff --git a/src/services/serviceBase.ts b/src/services/serviceBase.ts new file mode 100644 index 0000000..8bd4fa5 --- /dev/null +++ b/src/services/serviceBase.ts @@ -0,0 +1,42 @@ +import {Unit} from "../database/unit"; +import {ISqlite, Statement} from "sqlite"; +import RunResult = ISqlite.RunResult; + +export class ServiceBase { + public static async run(sql: string, params: any, changes: number): Promise { + const unit: Unit = await Unit.create(false); + try { + const smt: Statement = await unit.prepare(sql, params); + + const result: RunResult = await smt.run(); + + if (result.changes == undefined || result.changes != changes) { + await unit.complete(false); + return false; + } + + await unit.complete(true) + return true; + } catch (e) { + await unit.complete(false) + console.error(e); + return false; + } + } + + public static async get(sql: string, params: any): Promise { + const unit: Unit = await Unit.create(false); + const smt: Statement = await unit.prepare(sql, params); + const result = await smt.get(); + await unit.complete(true); + return result ?? null; + } + + public static async all(sql: string): Promise { + const unit: Unit = await Unit.create(false); + const smt: Statement = await unit.prepare(sql); + const result = await smt.all(); + await unit.complete(true); + return result; + } +} \ No newline at end of file