1.0.15 • Published 2 years ago

@plinioduartt/ts-transaction-manager v1.0.15

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Transaction Manager with Typescript Decorators

šŸ“š Abstracted transaction control for Typescript decorators, to facilitate transaction management and make the code cleaner.

tests ci

Supported ORMs

  • Typeorm (since v1.0.0)
  • Knex (since v1.0.15)
  • Prisma (soon)
  • Mongoose (soon)
  • Sequelize (soon)

Why to use

This is an abstract implementation to work with ORM transactions.

The main objective is to facilitate the flow of implementation and provide a powerfull feature, you can use the @Transactional decorator at usecases/services/adapters layer without the fear of coupling the layers of your application with the ORM specific syntax.

Quickstart

Configuration:

  • With TypeOrm
import { DataSource } from 'typeorm'
import { TransactionManager } from '@plinioduartt/ts-transaction-manager'

const dataSource: DataSource = new DataSource({
	...options
})

dataSource.initialize()

TransactionManager
	.addDataSource(dataSource)
	.setDefaultDataSource(dataSource)
  • With Knex
mport knex, { Knex } from 'knex'
import { TransactionManager } from '@plinioduartt/ts-transaction-manager'

const dataSource: Knex = knex({
	...options
})

dataSource.initialize()

TransactionManager
	.addDataSource(dataSource)
	.setDefaultDataSource(dataSource)

Example of use:

  • With TypeOrm
import { Transactional } from '@plinioduartt/ts-transaction-manager'

class Example1 {

	@Transactional()
	methodToBeCalled() {
		// all the database actions here are encapsulated by typeorm transaction...
		// you can do the database operations here or pass it to whatever other layer
	}
}
  • With Knex
import { TransactionManager, Transactional } from '@plinioduartt/ts-transaction-manager'

class Example1 {

	@Transactional()
	methodToBeCalled() {
		// all the database actions here are encapsulated by knex transaction...
		// you can do the database operations here or pass it to whatever other layer

		const transaction: Knex.Transaction = await TransactionManager.getKnexTransaction()

		await knex('table_name').insert(data).transacting(transaction)
	}
}

*Obs: You'll need to remember to always retrieve the transaction from TransactionManager.getKnexTransaction() and pass inside .transacting() method

The arguments are optionals:

TransactionalOptions {
  orm?: SupportedOrms
  logging?: boolean
}

*Consider SupportedOrms = 'typeorm' | 'knex'.
In the future, it'll be available with more options for dataSource configuration.

If you pass logging: true, then you'll see logs like that:

[01:21:05.906] INFO: [OrderUsecase][executeWithSuccess] is being intercepted by Transactional decorator...
[01:21:05.914] INFO: [OrderUsecase][executeWithFailure] is being intercepted by Transactional decorator...


@Transactional({ orm: 'typeorm', logging: true })
async executeWithSuccess(request: CreateOrderRequest): Promise<CreateOrderResponse> {
	// Logic with success
}

[01:23:29.425] INFO: [OrderUsecase][executeWithSuccess][Typeorm] transaction initialized.
[01:23:29.463] INFO: [OrderUsecase][executeWithSuccess][Typeorm] transaction completed successfully.


@Transactional({ orm: 'typeorm', logging: true })
async executeWithFailure(request: CreateOrderRequest): Promise<CreateOrderResponse> {
	// Logic with failure
}

[01:21:12.494] INFO: [OrderUsecase][executeWithFailure][Typeorm] transaction initialized.
[01:21:12.526] INFO: [OrderUsecase][executeWithFailure][Typeorm] has failed. Rollback realized successfully.
1.0.15

2 years ago

1.0.14

2 years ago

1.0.13

2 years ago

1.0.12

2 years ago

1.0.11

2 years ago

1.0.10

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago