import 'reflect-metadata' import path from 'path' import { DataSource } from 'typeorm' import { ChatFlow } from './entity/ChatFlow' import { ChatMessage } from './entity/ChatMessage' import { Credential } from './entity/Credential' import { Tool } from './entity/Tool' import { getUserHome } from './utils' let appDataSource: DataSource export const init = async (): Promise => { let homePath const synchronize = process.env.OVERRIDE_DATABASE === 'false' ? false : true switch (process.env.DATABASE_TYPE) { case 'sqlite': homePath = process.env.DATABASE_PATH ?? path.join(getUserHome(), '.flowise') appDataSource = new DataSource({ type: 'sqlite', database: path.resolve(homePath, 'database.sqlite'), synchronize, entities: [ChatFlow, ChatMessage, Tool, Credential], migrations: [] }) break case 'mysql': appDataSource = new DataSource({ type: 'mysql', host: process.env.DATABASE_HOST, port: parseInt(process.env.DATABASE_PORT || '3306'), username: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE_NAME, charset: 'utf8mb4', synchronize, entities: [ChatFlow, ChatMessage, Tool, Credential], migrations: [] }) break case 'postgres': appDataSource = new DataSource({ type: 'postgres', host: process.env.DATABASE_HOST, port: parseInt(process.env.DATABASE_PORT || '5432'), username: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE_NAME, synchronize, entities: [ChatFlow, ChatMessage, Tool, Credential], migrations: [] }) break default: homePath = process.env.DATABASE_PATH ?? path.join(getUserHome(), '.flowise') appDataSource = new DataSource({ type: 'sqlite', database: path.resolve(homePath, 'database.sqlite'), synchronize, entities: [ChatFlow, ChatMessage, Tool, Credential], migrations: [] }) break } } export function getDataSource(): DataSource { if (appDataSource === undefined) { init() } return appDataSource }