151 lines
3.4 KiB
TypeScript
151 lines
3.4 KiB
TypeScript
import { IsString, IsEmail, IsNotEmpty, IsOptional, MaxLength, validateSync, IsNumber } from 'class-validator';
|
|
import {
|
|
BeforeInsert,
|
|
BeforeUpdate,
|
|
Column,
|
|
CreateDateColumn,
|
|
Entity,
|
|
JoinTable,
|
|
ManyToMany,
|
|
PrimaryGeneratedColumn,
|
|
UpdateDateColumn,
|
|
ColumnType,
|
|
AfterLoad
|
|
} from 'typeorm';
|
|
|
|
import { CustomValidationError } from '../exceptions/custom-validation.error';
|
|
import {
|
|
LOGGING_FLAGS,
|
|
DEVICE_STATE,
|
|
DEVICE_FLAGS,
|
|
RETRY_SETTINGS,
|
|
DefaultRetry,
|
|
DefaultBlocks,
|
|
DefaultSettings,
|
|
DefaultCommandSettings
|
|
} from '../shared/types';
|
|
import { ValueTransformer } from 'typeorm/decorator/options/ValueTransformer';
|
|
import { isString } from '@xblox/core/primitives';
|
|
import { debug } from '../log';
|
|
|
|
export const JSON_TRANSFORMER: ValueTransformer = {
|
|
to(value: any): string {
|
|
if (!isString(value)) {
|
|
return JSON.stringify(value, null, 2);
|
|
} else {
|
|
return value;
|
|
}
|
|
},
|
|
from(value: string): any {
|
|
if (isString(value)) {
|
|
return JSON.parse(value);
|
|
}
|
|
return value;
|
|
}
|
|
}
|
|
|
|
@Entity()
|
|
export class Device {
|
|
|
|
public scope: any;
|
|
|
|
@IsOptional()
|
|
@PrimaryGeneratedColumn()
|
|
id: number;
|
|
|
|
|
|
@Column({ length: 150 })
|
|
@IsNotEmpty()
|
|
@MaxLength(150)
|
|
name: string;
|
|
|
|
@Column()
|
|
@IsNotEmpty()
|
|
host: string;
|
|
|
|
@Column()
|
|
@IsNotEmpty()
|
|
port: string;
|
|
|
|
@Column()
|
|
@IsNotEmpty()
|
|
protocol: string;
|
|
|
|
@Column()
|
|
@IsString()
|
|
@IsOptional()
|
|
state: string = DEVICE_STATE.NONE;
|
|
|
|
@Column()
|
|
@IsNumber()
|
|
@IsOptional()
|
|
flags: number = DEVICE_FLAGS.NONE;
|
|
|
|
@Column()
|
|
@IsString()
|
|
@IsOptional()
|
|
logging: string = "{\n \"Device Connected\": 47,\n \"Response\": 35,\n \"Send Command\": 51,\n \"Device Disonnected\": 39,\n \"Device Error\": 1\n}";
|
|
|
|
@Column({ name: 'fields' })
|
|
@IsString()
|
|
fields: string;
|
|
|
|
|
|
@Column({ name: 'is_active' })
|
|
@IsNotEmpty()
|
|
isActive: boolean;
|
|
|
|
@Column({
|
|
transformer: JSON_TRANSFORMER
|
|
})
|
|
@IsOptional()
|
|
retry: string = JSON.stringify(DefaultRetry());
|
|
|
|
@Column({ name: 'user' })
|
|
@IsNotEmpty()
|
|
user: number;
|
|
|
|
@Column({ name: 'project' })
|
|
@IsNotEmpty()
|
|
project: number;
|
|
|
|
@Column({
|
|
transformer: JSON_TRANSFORMER
|
|
})
|
|
@IsOptional()
|
|
blocks: string = JSON.stringify(DefaultBlocks());
|
|
|
|
@Column({
|
|
transformer: JSON_TRANSFORMER
|
|
})
|
|
@IsOptional()
|
|
settings: string = JSON.stringify(DefaultSettings());
|
|
|
|
@Column({
|
|
transformer: JSON_TRANSFORMER
|
|
})
|
|
@IsOptional()
|
|
commandSettings: string = JSON.stringify(DefaultCommandSettings());
|
|
|
|
@BeforeUpdate()
|
|
doBeforeUpdate() {
|
|
const errors = validateSync(this, { validationError: { target: false } });
|
|
if (errors.length > 0) {
|
|
console.error('validation error', errors);
|
|
throw new CustomValidationError(errors)
|
|
}
|
|
}
|
|
|
|
@AfterLoad()
|
|
doAfter() {
|
|
this.retry = JSON_TRANSFORMER.from(this.retry);
|
|
this.blocks = JSON_TRANSFORMER.from(this.blocks);
|
|
this.settings = JSON_TRANSFORMER.from(this.settings);
|
|
this.commandSettings = JSON_TRANSFORMER.from(this.commandSettings);
|
|
this.logging = JSON_TRANSFORMER.from(this.logging);
|
|
}
|
|
|
|
public toString() {
|
|
return `${this.protocol}://${this.host}:${this.port}`
|
|
}
|
|
} |