import { Length } from 'class-validator' ; import { IConnections , IDataObject , INode , IWorkflowSettings } from 'n8n-workflow' ; import { BeforeUpdate , Column , ColumnOptions , CreateDateColumn , Entity , Index , JoinTable , ManyToMany , PrimaryGeneratedColumn , UpdateDateColumn , } from 'typeorm' ; import config = require ( '../../../config' ) ; import { DatabaseType , IWorkflowDb } from '../..' ; import { TagEntity } from './TagEntity' ; function resolveDataType ( dataType ) { const dbType = config . get ( 'database.type' ) as DatabaseType ; const typeMap = { sqlite : { json : 'simple-json' , } , postgresdb : { datetime : 'timestamptz' , } , mysqldb : { } , mariadb : { } , } ; return typeMap [ dbType ] [ dataType ] ?? dataType ; } function getTimestampSyntax ( ) { const dbType = config . get ( 'database.type' ) as DatabaseType ; const map = { sqlite : "STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')" , postgresdb : 'CURRENT_TIMESTAMP(3)' , mysqldb : 'CURRENT_TIMESTAMP(3)' , mariadb : 'CURRENT_TIMESTAMP(3)' , } ; return map [ dbType ] ; } @ Entity ( ) export class WorkflowEntity implements IWorkflowDb { @ PrimaryGeneratedColumn ( ) id : number ; @ Index ( { unique : true } ) @ Length ( 1 , 128 , { message : 'Workflow name must be 1 to 128 characters long.' } ) @ Column ( { length : 128 } ) name : string ; @ Column ( ) active : boolean ; @ Column ( resolveDataType ( 'json' ) ) nodes : INode [ ] ; @ Column ( resolveDataType ( 'json' ) ) connections : IConnections ; @ CreateDateColumn ( { precision : 3 , default : ( ) => getTimestampSyntax ( ) } ) createdAt : Date ; @ UpdateDateColumn ( { precision : 3 , default : ( ) => getTimestampSyntax ( ) , onUpdate : getTimestampSyntax ( ) , } ) updatedAt : Date ; @ Column ( { type : resolveDataType ( 'json' ) as ColumnOptions [ 'type' ] , nullable : true , } ) settings ? : IWorkflowSettings ; @ Column ( { type : resolveDataType ( 'json' ) as ColumnOptions [ 'type' ] , nullable : true , } ) staticData ? : IDataObject ; @ ManyToMany ( ( ) => TagEntity , ( tag ) => tag . workflows ) @ JoinTable ( { name : 'workflows_tags' , joinColumn : { name : 'workflowId' , referencedColumnName : 'id' , } , inverseJoinColumn : { name : 'tagId' , referencedColumnName : 'id' , } , } ) tags : TagEntity [ ] ; @ BeforeUpdate ( ) setUpdateDate ( ) { this . updatedAt = new Date ( ) ; } }