import csv from 'csvtojson'; import { Body, ContentType, Controller, Param, Post, QueryParam, Req, UseBefore } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { RunnerGroupNeededError } from '../errors/RunnerErrors'; import { RunnerGroupNotFoundError } from '../errors/RunnerGroupErrors'; import RawBodyMiddleware from '../middlewares/RawBody'; import { ImportRunner } from '../models/actions/ImportRunner'; import { ResponseRunner } from '../models/responses/ResponseRunner'; import { RunnerController } from './RunnerController'; @Controller() //@Authorized("IMPORT:read") export class ImportController { private runnerController: RunnerController; /** * Gets the repository of this controller's model/entity. */ constructor() { this.runnerController = new RunnerController(); } @Post('/runners/import') @ContentType("application/json") @ResponseSchema(ResponseRunner, { isArray: true, statusCode: 200 }) @ResponseSchema(RunnerGroupNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerGroupNeededError, { statusCode: 406 }) @OpenAPI({ description: "Create new runners from json and insert them (or their teams) into the provided group" }) async postJSON(@Body({ validate: true, type: ImportRunner }) importRunners: ImportRunner[], @QueryParam("group") groupID: number) { if (!groupID) { throw new RunnerGroupNeededError(); } let responseRunners: ResponseRunner[] = new Array(); for await (let runner of importRunners) { responseRunners.push(await this.runnerController.post(await runner.toCreateRunner(groupID))); } return responseRunners; } @Post('/organisations/:id/import') @ContentType("application/json") @ResponseSchema(ResponseRunner, { isArray: true, statusCode: 200 }) @ResponseSchema(RunnerGroupNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerGroupNeededError, { statusCode: 406 }) @OpenAPI({ description: "Create new runners from json and insert them (or their teams) into the provided org" }) async postOrgsJSON(@Body({ validate: true, type: ImportRunner }) importRunners: ImportRunner[], @Param('id') id: number) { return await this.postJSON(importRunners, id) } @Post('/teams/:id/import') @ContentType("application/json") @ResponseSchema(ResponseRunner, { isArray: true, statusCode: 200 }) @ResponseSchema(RunnerGroupNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerGroupNeededError, { statusCode: 406 }) @OpenAPI({ description: "Create new runners from json and insert them into the provided team" }) async postTeamsJSON(@Body({ validate: true, type: ImportRunner }) importRunners: ImportRunner[], @Param('id') id: number) { return await this.postJSON(importRunners, id) } @Post('/runners/import/csv') @ContentType("application/json") @UseBefore(RawBodyMiddleware) @ResponseSchema(ResponseRunner, { isArray: true, statusCode: 200 }) @ResponseSchema(RunnerGroupNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerGroupNeededError, { statusCode: 406 }) @OpenAPI({ description: "Create new runners from csv and insert them (or their teams) into the provided group" }) async postCSV(@Req() request: any, @QueryParam("group") groupID: number) { let csvParse = await csv({ delimiter: [",", ";"], trim: true }).fromString(request.rawBody.toString()); let importRunners: ImportRunner[] = new Array(); for await (let runner of csvParse) { let newImportRunner = new ImportRunner(); newImportRunner.firstname = runner.firstname; newImportRunner.middlename = runner.middlename; newImportRunner.lastname = runner.lastname; if (runner.class === undefined) { newImportRunner.team = runner.team; } else { newImportRunner.class = runner.class; } importRunners.push(newImportRunner); } return await this.postJSON(importRunners, groupID); } @Post('/organisations/:id/import/csv') @ContentType("application/json") @UseBefore(RawBodyMiddleware) @ResponseSchema(ResponseRunner, { isArray: true, statusCode: 200 }) @ResponseSchema(RunnerGroupNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerGroupNeededError, { statusCode: 406 }) @OpenAPI({ description: "Create new runners from csv and insert them (or their teams) into the provided org" }) async postOrgsCSV(@Req() request: any, @Param("id") id: number) { return await this.postCSV(request, id); } @Post('/teams/:id/import/csv') @ContentType("application/json") @UseBefore(RawBodyMiddleware) @ResponseSchema(ResponseRunner, { isArray: true, statusCode: 200 }) @ResponseSchema(RunnerGroupNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerGroupNeededError, { statusCode: 406 }) @OpenAPI({ description: "Create new runners from csv and insert them into the provided team" }) async postTeamsCSV(@Req() request: any, @Param("id") id: number) { return await this.postCSV(request, id); } }