Switched to using a response model for tracks

This commit is contained in:
Nicolai Ort 2020-12-04 18:34:01 +01:00
parent 65f995cb9f
commit 913033373b
2 changed files with 57 additions and 17 deletions

View File

@ -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<ResponseTrack>();
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);
}
}

View File

@ -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;
}
}