typeorm-transactional-decorator
Version:
A package to simplify transaction management in TypeORM
151 lines (108 loc) • 4.4 kB
Markdown
# typeorm-transactional-decorator
A package to simplify transaction management in TypeORM.
## Why one more package?
I tried to find an package allowing to manage transactions with decorators and I didn't find any. This package is based on [typeorm-transactional](https://www.npmjs.com/package/typeorm-transactional) with some improvements and changes. Main change is that transaction is propagated to nested methods.
## Features
- Easily manage database transactions with decorators
- Support for nested transactions
- Automatic transaction rollback on errors
- Ability to ignore transactions for specific methods
- Transaction result management for commit and rollback events
## Installation
Install the package using npm:
```bash
npm install typeorm-transactional-decorator
```
## Usage
1. **Install Dependencies**:
Ensure you have TypeORM installed in your project.
2. **Import and Configure**:
Import the package and configure it in your application.
```typescript
import { addTransactionalDataSource } from "typeorm-transactional-decorator";
import { DataSource } from "typeorm";
// Initialize your DataSource
const dataSource = new DataSource({
// Your DataSource configuration
});
await dataSource.initialize();
// Add transactional capabilities to your DataSource
addTransactionalDataSource(dataSource);
```
**NestJS Configuration**:
If you're using NestJS, you can configure the package in your TypeORM module:
```typescript
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { DataSource, DataSourceOptions } from "typeorm";
import { addTransactionalDataSource } from "typeorm-transactional-decorator";
({
imports: [
TypeOrmModule.forRootAsync({
useFactory: () => ({
// Your regular TypeORM configuration goes here
type: "postgres",
host: "localhost",
// ... other TypeORM options
}),
// The important part for typeorm-transactional-decorator:
dataSourceFactory: (options: DataSourceOptions) => {
const dataSource = new DataSource(options);
return addTransactionalDataSource(dataSource);
},
}),
],
})
export class AppModule {}
```
3. **Use Decorators**:
Decorate your methods with `` to manage transactions.
```typescript
()
public async exampleMethod() {
// Your code here, all nested database operations will be wrapped in a transaction
}
```
4. **Ignore Transactions**:
Use `` to ignore transactions for specific methods.
```typescript
()
public async ignoreTransactionMethod() {
// Your code here, this nested method will ignore the transaction
}
```
5. **Transaction Result Manager**:
Use `TransactionResultManager` to manage transaction outcomes.
```typescript
import {
Transactional,
getTransactionResultManager,
} from "typeorm-transactional-decorator";
class FileService {
()
async uploadFileToS3(fileContent: Buffer, fileName: string) {
const transactionResultManager = getTransactionResultManager();
// Upload file to S3
// ...
transactionResultManager.onRollback(async () => {
// Delete the file from S3 if transaction is rolled back
// ...
});
// Proceed with other database operations
// ...
}
}
```
### License
This project is licensed under the MIT License. See the [LICENSE](https://github.com/gwythyr/typeorm-transactional-decorator/blob/master/LICENCE.txt) file for details.
### Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the project
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
### Support
If you encounter any problems or have any questions, please open an issue on the [GitHub repository](https://github.com/gwythyr/typeorm-transactional-decorator/issues).
### Acknowledgements
- [typerom-transactional](https://www.npmjs.com/package/typeorm-transactional) - The package that inspired this project