From 913033373be3ece9bed301f787e7d7036042ca26 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 4 Dec 2020 18:34:01 +0100 Subject: [PATCH] Switched to using a response model for tracks --- src/controllers/TrackController.ts | 39 +++++++++++++++------------ src/models/responses/ResponseTrack.ts | 35 ++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 src/models/responses/ResponseTrack.ts diff --git a/src/controllers/TrackController.ts b/src/controllers/TrackController.ts index 869f1be..ae451be 100644 --- a/src/controllers/TrackController.ts +++ b/src/controllers/TrackController.ts @@ -1,11 +1,11 @@ -import { JsonController, Param, Body, Get, Post, Put, Delete, NotFoundError, OnUndefined, NotAcceptableError, Authorized } from 'routing-controllers'; +import { Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put } from 'routing-controllers'; +import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnectionManager, Repository } from 'typeorm'; import { EntityFromBody } from 'typeorm-routing-controllers-extensions'; -import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { Track } from '../models/entities/Track'; -import { IsInt, IsNotEmpty, IsPositive, IsString } from 'class-validator'; import { TrackIdsNotMatchingError, TrackNotFoundError } from "../errors/TrackErrors"; import { CreateTrack } from '../models/creation/CreateTrack'; +import { Track } from '../models/entities/Track'; +import { ResponseTrack } from '../models/responses/ResponseTrack'; @JsonController('/tracks') //@Authorized("TRACKS:read") @@ -20,33 +20,38 @@ export class TrackController { } @Get() - @ResponseSchema(Track, { isArray: true }) + @ResponseSchema(ResponseTrack, { isArray: true }) @OpenAPI({ description: "Lists all tracks." }) - getAll() { - return this.trackRepository.find(); + async getAll() { + let responseTracks: ResponseTrack[] = new Array(); + const tracks = await this.trackRepository.find(); + tracks.forEach(track => { + responseTracks.push(new ResponseTrack(track)); + }); + return responseTracks; } @Get('/:id') - @ResponseSchema(Track) + @ResponseSchema(ResponseTrack) @ResponseSchema(TrackNotFoundError, { statusCode: 404 }) @OnUndefined(TrackNotFoundError) @OpenAPI({ description: "Returns a track of a specified id (if it exists)" }) - getOne(@Param('id') id: number) { - return this.trackRepository.findOne({ id: id }); + async getOne(@Param('id') id: number) { + return new ResponseTrack(await this.trackRepository.findOne({ id: id })); } @Post() - @ResponseSchema(Track) + @ResponseSchema(ResponseTrack) @OpenAPI({ description: "Create a new track object (id will be generated automagicly)." }) - post( + async post( @Body({ validate: true }) track: CreateTrack ) { - return this.trackRepository.save(track.toTrack()); + return new ResponseTrack(await this.trackRepository.save(track.toTrack())); } @Put('/:id') - @ResponseSchema(Track) + @ResponseSchema(ResponseTrack) @ResponseSchema(TrackNotFoundError, { statusCode: 404 }) @ResponseSchema(TrackIdsNotMatchingError, { statusCode: 406 }) @OpenAPI({ description: "Update a track object (id can't be changed)." }) @@ -62,11 +67,11 @@ export class TrackController { } await this.trackRepository.update(oldTrack, track); - return track; + return new ResponseTrack(track); } @Delete('/:id') - @ResponseSchema(Track) + @ResponseSchema(ResponseTrack) @ResponseSchema(TrackNotFoundError, { statusCode: 404 }) @OpenAPI({ description: "Delete a specified track (if it exists)." }) async remove(@Param('id') id: number) { @@ -77,6 +82,6 @@ export class TrackController { } await this.trackRepository.delete(track); - return track; + return new ResponseTrack(track); } } diff --git a/src/models/responses/ResponseTrack.ts b/src/models/responses/ResponseTrack.ts new file mode 100644 index 0000000..ce1d74d --- /dev/null +++ b/src/models/responses/ResponseTrack.ts @@ -0,0 +1,35 @@ +import { + IsInt, + + IsString +} from "class-validator"; +import { Track } from '../entities/Track'; + +/** + * Defines a track of given length. +*/ +export class ResponseTrack { + /** + * Autogenerated unique id (primary key). + */ + @IsInt() + id: number;; + + /** + * The track's name. + */ + @IsString() + name: string; + + /** + * The track's length/distance in meters. + */ + @IsInt() + distance: number; + + public constructor(track: Track) { + this.id = track.id; + this.name = track.name; + this.distance = track.distance; + } +}