import "reflect-metadata" ; import { BaseEntity , EntityMetadata , FindConditions , ObjectIdColumn , PrimaryColumn } from "typeorm" ; import { Snowflake } from "../util/Snowflake" ; import "missing-native-js-functions" ; export class BaseClassWithoutId extends BaseEntity { constructor ( props ? ) { super ( ) ; this . assign ( props ) ; } private get construct ( ) : any { return this . constructor ; } private get metadata ( ) { return this . construct . getRepository ( ) . metadata as EntityMetadata ; } assign ( props = { } ) { delete props . opts ; delete props . props ; const properties = new Set ( this . metadata . columns . map ( ( x ) => x . propertyName ) . concat ( this . metadata . relations . map ( ( x ) => x . propertyName ) ) ) ; for ( const key in props ) { if ( ! properties . has ( key ) ) continue ; const setter = this [ `set${ key . capitalize ( ) }` ] ; if ( setter ) { setter . call ( this , props [ key ] ) ; } else { this [ key ] = props [ key ] ; } } } toJSON ( ) { return Object . fromEntries ( this . metadata . columns . map ( ( x ) => [ x . propertyName , this [ x . propertyName ] ] ) . concat ( this . metadata . relations . map ( ( x ) => [ x . propertyName , this [ x . propertyName ] ] ) ) ) ; } static increment < T extends BaseClass > ( conditions , propertyPath , value ) { const repository = this . getRepository ( ) ; return repository . increment ( conditions as T , propertyPath , value ) ; } static decrement < T extends BaseClass > ( conditions , propertyPath , value ) { const repository = this . getRepository ( ) ; return repository . decrement ( conditions as T , propertyPath , value ) ; } } export const PrimaryIdColumn = process . env . DATABASE ?. startsWith ( "mongodb" ) ? ObjectIdColumn : PrimaryColumn ; export class BaseClass extends BaseClassWithoutId { @ PrimaryIdColumn ( ) id : string ; assign ( props = { } ) { super . assign ( props ) ; if ( ! this . id ) this . id = Snowflake . generate ( ) ; return this ; } }