64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import * as argon2 from "argon2";
|
|
import { IsBoolean, IsInt, IsOptional, IsPositive, IsString } from 'class-validator';
|
|
import crypto from 'crypto';
|
|
import { getConnection } from 'typeorm';
|
|
import * as uuid from 'uuid';
|
|
import { TrackNotFoundError } from '../../errors/TrackErrors';
|
|
import { ScanStation } from '../entities/ScanStation';
|
|
import { Track } from '../entities/Track';
|
|
|
|
/**
|
|
* This class is used to create a new StatsClient entity from a json body (post request).
|
|
*/
|
|
export class CreateScanStation {
|
|
/**
|
|
* The new station's description.
|
|
*/
|
|
@IsString()
|
|
@IsOptional()
|
|
description?: string;
|
|
|
|
/**
|
|
* The station's associated track.
|
|
*/
|
|
@IsInt()
|
|
@IsPositive()
|
|
track: number;
|
|
|
|
/**
|
|
* Is this station enabled?
|
|
*/
|
|
@IsBoolean()
|
|
@IsOptional()
|
|
enabled?: boolean = true;
|
|
|
|
/**
|
|
* Converts this to a ScanStation entity.
|
|
*/
|
|
public async toEntity(): Promise<ScanStation> {
|
|
let newStation: ScanStation = new ScanStation();
|
|
|
|
newStation.description = this.description;
|
|
newStation.enabled = this.enabled;
|
|
newStation.track = await this.getTrack();
|
|
|
|
let newUUID = uuid.v4().toUpperCase();
|
|
newStation.prefix = crypto.createHash("sha3-512").update(newUUID).digest('hex').substring(0, 7).toUpperCase();
|
|
newStation.key = await argon2.hash(newStation.prefix + "." + newUUID);
|
|
newStation.cleartextkey = newStation.prefix + "." + newUUID;
|
|
|
|
return newStation;
|
|
}
|
|
|
|
/**
|
|
* Get's a track by it's id provided via this.track.
|
|
* Used to link the new station to a track.
|
|
*/
|
|
public async getTrack(): Promise<Track> {
|
|
const track = await getConnection().getRepository(Track).findOne({ id: this.track });
|
|
if (!track) {
|
|
throw new TrackNotFoundError();
|
|
}
|
|
return track;
|
|
}
|
|
} |