import { Connection, ConnectionOptions, createConnection, QueryRunner } from 'typeorm'
import faker from 'faker'
import { Users } from '@models/model.users'
const typeormConfog: ConnectionOptions = {
type: 'postgres',
host: process.env.PG_HOST,
port: +process.env.PG_PORT,
username: process.env.PG_USER,
password: process.env.PG_PASSWORD,
database: process.env.PG_NAME,
entities: ['dist/models/*.js'],
synchronize: false
}
// example transaction database
(async () => {
try {
const connection = ['production', 'staging'].includes(process.env.NODE_ENV)
? await createConnection(typeormConfog)
: await createConnection()
// call custom transaction like this
await builderTransaction(connection, async (queryRunner: QueryRunner): Promise<any> => {
// update operation
await queryRunner.manager.update(Users, { id: 1 }, { name: 'john doe' })
// insert operation
const users: Users = new Users()
users.name = faker.name.firstName()
users.email = faker.internet.email()
users.password = '@Qwerty12'
await connection.manager.save(users)
// get operation
const getUsers = await queryRunner.manager.findOne(Users, { id: 1 })
console.log('getUsers: ', getUsers)
})
} catch (err: any) {
return Promise.reject(err)
}
})()
// custom transaction builder
const builderTransaction = async (connection: Connection, operationTransaction: (query: QueryRunner) => Promise<any>): Promise<any> => {
try {
const query: QueryRunner = connection.createQueryRunner()
await query.connect()
await query.startTransaction()
try {
const responseTransaction: Record<string ,any> = await operationTransaction(query)
await query.commitTransaction()
return responseTransaction
} catch (e: any) {
if (query.isTransactionActive) await query.rollbackTransaction()
return Promise.reject(err)
} finally {
if (query.isReleased) await query.release()
}
} catch (e: any) {
return Promise.reject(e)
}
}