diff --git a/src/controllers/TrackController.ts b/src/controllers/TrackController.ts index b826582..c6327a9 100644 --- a/src/controllers/TrackController.ts +++ b/src/controllers/TrackController.ts @@ -1,92 +1,91 @@ -import { JsonController, Param, Body, Get, Post, Put, Delete, NotFoundError, OnUndefined, NotAcceptableError, Authorized } from 'routing-controllers'; -import { getConnectionManager, Repository } from 'typeorm'; -import { EntityFromBody } from 'typeorm-routing-controllers-extensions'; -import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { Track } from '../models/Track'; -import { IsInt, IsNotEmpty, IsPositive, IsString } from 'class-validator'; - -class CreateTrack { - @IsString() - @IsNotEmpty() - name: string; - - @IsInt() - @IsPositive() - length: number; -} - -export class TrackNotFoundError extends NotFoundError { - constructor() { - super('Track not found!'); - } -} - -@JsonController('/tracks') -@Authorized("TRACKS:read") -export class TrackController { - private trackRepository: Repository; - - /** - * Gets the repository of this controller's model/entity. - */ - constructor() { - this.trackRepository = getConnectionManager().get().getRepository(Track); - } - - @Get() - @ResponseSchema(Track, { isArray: true }) - @OpenAPI({ description: "Lists all tracks." }) - getAll() { - return this.trackRepository.find(); - } - - @Get('/:id') - @ResponseSchema(Track) - @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 }); - } - - @Post() - @ResponseSchema(Track) - @OpenAPI({ description: "Create a new track object (id will be generated automagicly)." }) - post( - @Body({ validate: true }) - track: CreateTrack - ) { - return this.trackRepository.save(track); - } - - @Put('/:id') - @ResponseSchema(Track) - @OpenAPI({ description: "Update a track object (id can't be changed)." }) - async put(@Param('id') id: number, @EntityFromBody() track: Track) { - let oldTrack = await this.trackRepository.findOne({ id: id }); - - if (!oldTrack) { - throw new TrackNotFoundError(); - } - - if (oldTrack.id != track.id) { - throw new NotAcceptableError("The id's don't match!"); - } - - await this.trackRepository.update(oldTrack, track); - return track; - } - - @Delete('/:id') - @ResponseSchema(Track) - @OpenAPI({ description: "Delete a specified track (if it exists)." }) - async remove(@Param('id') id: number) { - let track = await this.trackRepository.findOne({ id: id }); - - if (!track) { - throw new TrackNotFoundError(); - } - - await this.trackRepository.delete(track); - return track; - } -} +import { JsonController, Param, Body, Get, Post, Put, Delete, NotFoundError, OnUndefined, NotAcceptableError, Authorized } from 'routing-controllers'; +import { getConnectionManager, Repository } from 'typeorm'; +import { EntityFromBody } from 'typeorm-routing-controllers-extensions'; +import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; +import { Track } from '../models/Track'; +import { IsInt, IsNotEmpty, IsPositive, IsString } from 'class-validator'; +import {TrackIdChangeNotAllowedError, TrackNotFoundError} from "../errors/TrackErrors"; + +class CreateTrack { + @IsString() + @IsNotEmpty() + name: string; + + @IsInt() + @IsPositive() + length: number; +} + +@JsonController('/tracks') +@Authorized("TRACKS:read") +export class TrackController { + private trackRepository: Repository; + + /** + * Gets the repository of this controller's model/entity. + */ + constructor() { + this.trackRepository = getConnectionManager().get().getRepository(Track); + } + + @Get() + @ResponseSchema(Track, { isArray: true }) + @OpenAPI({ description: "Lists all tracks." }) + getAll() { + return this.trackRepository.find(); + } + + @Get('/:id') + @ResponseSchema(Track) + @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 }); + } + + @Post() + @ResponseSchema(Track) + @OpenAPI({ description: "Create a new track object (id will be generated automagicly)." }) + post( + @Body({ validate: true }) + track: CreateTrack + ) { + return this.trackRepository.save(track); + } + + @Put('/:id') + @ResponseSchema(Track) + @ResponseSchema(TrackNotFoundError, {statusCode: 404}) + @ResponseSchema(TrackIdChangeNotAllowedError, {statusCode: 406}) + @OpenAPI({description: "Update a track object (id can't be changed)."}) + async put(@Param('id') id: number, @EntityFromBody() track: Track) { + let oldTrack = await this.trackRepository.findOne({ id: id }); + + if (!oldTrack) { + throw new TrackNotFoundError(); + } + + if(oldTrack.id != track.id){ + throw new TrackIdChangeNotAllowedError(); + } + + await this.trackRepository.update(oldTrack, track); + return track; + } + + @Delete('/:id') + @ResponseSchema(Track) + @ResponseSchema(TrackNotFoundError, {statusCode: 404}) + @OpenAPI({description: "Delete a specified track (if it exists)."}) + async remove(@Param('id') id: number) { + let track = await this.trackRepository.findOne({ id: id }); + + if (!track) { + throw new TrackNotFoundError(); + } + + await this.trackRepository.delete(track); + return track; + } +} diff --git a/src/errors/TrackErrors.ts b/src/errors/TrackErrors.ts new file mode 100644 index 0000000..5b1a33a --- /dev/null +++ b/src/errors/TrackErrors.ts @@ -0,0 +1,18 @@ +import { JsonController, Param, Body, Get, Post, Put, Delete, NotFoundError, OnUndefined, NotAcceptableError } from 'routing-controllers'; +import { IsInt, IsNotEmpty, IsPositive, IsString } from 'class-validator'; + +export class TrackNotFoundError extends NotFoundError { + @IsString() + name = "TrackNotFoundError" + + @IsString() + message = "Track not found!" +} + +export class TrackIdChangeNotAllowedError extends NotAcceptableError { + @IsString() + name = "TrackIdChangeNotAllowed" + + @IsString() + message = "The id's don't match!! \n And if you wanted to change a track's id: This isn't allowed" +} \ No newline at end of file