diff --git a/src/controllers/RunnerCardController.ts b/src/controllers/RunnerCardController.ts index a1eee62..2263f07 100644 --- a/src/controllers/RunnerCardController.ts +++ b/src/controllers/RunnerCardController.ts @@ -1,9 +1,10 @@ -import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, QueryParam } from 'routing-controllers'; +import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnectionManager, Repository } from 'typeorm'; -import { RunnerCardHasScansError, RunnerCardNotFoundError } from '../errors/RunnerCardErrors'; +import { RunnerCardHasScansError, RunnerCardIdsNotMatchingError, RunnerCardNotFoundError } from '../errors/RunnerCardErrors'; import { RunnerNotFoundError } from '../errors/RunnerErrors'; import { CreateRunnerCard } from '../models/actions/CreateRunnerCard'; +import { UpdateRunnerCard } from '../models/actions/UpdateRunnerCard'; import { RunnerCard } from '../models/entities/RunnerCard'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; import { ResponseRunnerCard } from '../models/responses/ResponseRunnerCard'; @@ -57,27 +58,27 @@ export class RunnerCardController { return (await this.cardRepository.findOne({ id: card.id }, { relations: ['runner'] })).toResponse(); } - // @Put('/:id') - // @Authorized("CARD:UPDATE") - // @ResponseSchema(ResponseTrack) - // @ResponseSchema(TrackNotFoundError, { statusCode: 404 }) - // @ResponseSchema(TrackIdsNotMatchingError, { statusCode: 406 }) - // @ResponseSchema(TrackLapTimeCantBeNegativeError, { statusCode: 406 }) - // @OpenAPI({ description: "Update the track whose id you provided.
Please remember that ids can't be changed." }) - // async put(@Param('id') id: number, @Body({ validate: true }) updateTrack: UpdateTrack) { - // let oldTrack = await this.trackRepository.findOne({ id: id }); + @Put('/:id') + @Authorized("CARD:UPDATE") + @ResponseSchema(ResponseRunnerCard) + @ResponseSchema(RunnerCardNotFoundError, { statusCode: 404 }) + @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) + @ResponseSchema(RunnerCardIdsNotMatchingError, { statusCode: 406 }) + @OpenAPI({ description: "Update the card whose id you provided.
Scans created via this card will still be associated with the old runner.
Please remember that ids can't be changed." }) + async put(@Param('id') id: number, @Body({ validate: true }) card: UpdateRunnerCard) { + let oldCard = await this.cardRepository.findOne({ id: id }); - // if (!oldTrack) { - // throw new TrackNotFoundError(); - // } + if (!oldCard) { + throw new RunnerCardNotFoundError(); + } - // if (oldTrack.id != updateTrack.id) { - // throw new TrackIdsNotMatchingError(); - // } - // await this.trackRepository.save(await updateTrack.updateTrack(oldTrack)); + if (oldCard.id != card.id) { + throw new RunnerCardIdsNotMatchingError(); + } - // return new ResponseTrack(await this.trackRepository.findOne({ id: id })); - // } + await this.cardRepository.save(await card.update(oldCard)); + return (await this.cardRepository.findOne({ id: id }, { relations: ['runner'] })).toResponse(); + } @Delete('/:id') @Authorized("CARD:DELETE") diff --git a/src/models/actions/UpdateRunnerCard.ts b/src/models/actions/UpdateRunnerCard.ts new file mode 100644 index 0000000..2ee34ab --- /dev/null +++ b/src/models/actions/UpdateRunnerCard.ts @@ -0,0 +1,51 @@ +import { IsBoolean, IsInt, IsOptional, IsPositive } from 'class-validator'; +import { getConnection } from 'typeorm'; +import { RunnerNotFoundError } from '../../errors/RunnerErrors'; +import { Runner } from '../entities/Runner'; +import { RunnerCard } from '../entities/RunnerCard'; + +/** + * This class is used to update a RunnerCard entity (via put request). + */ +export class UpdateRunnerCard { + /** + * The updated card's id. + * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). + */ + @IsInt() + @IsPositive() + id?: number; + + /** + * The updated card's associated runner. + */ + @IsInt() + @IsOptional() + runner?: number; + + /** + * Is the updated card enabled (for fraud reasons)? + * Default: true + */ + @IsBoolean() + enabled: boolean = true; + + /** + * Creates a new RunnerCard entity from this. + */ + public async update(card: RunnerCard): Promise { + card.enabled = this.enabled; + card.runner = await this.getRunner(); + + return card; + } + + public async getRunner(): Promise { + if (!this.runner) { return null; } + const runner = await getConnection().getRepository(Runner).findOne({ id: this.runner }); + if (!runner) { + throw new RunnerNotFoundError(); + } + return runner; + } +} \ No newline at end of file