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's id.
 | |
|      */
 | |
|     @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;
 | |
|     }
 | |
| } |