Skip to content

Commit 8e498a8

Browse files
committed
feat(json-api-nestjs): Add wrapper transaction options
1 parent 9bbe9fd commit 8e498a8

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

libs/json-api/json-api-nestjs/README.md

+5
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ export interface ModuleOptions {
6969
debug?: boolean; // Debug info in result object, like error message
7070
pipeForId?: Type<PipeTransform> // Nestjs pipe for validate id params, by default ParseIntPipe
7171
operationUrl?: string // Url for atomic operation https://jsonapi.org/ext/atomic/
72+
useSoftDelete?: boolean // Use soft delete
73+
runInTransaction?: <Func extends (...args: any) => any>(
74+
isolationLevel: IsolationLevel,
75+
fn: Func
76+
) => ReturnType<Func> // You can use cutom function for wrapping transaction in atomic operation, example: runInTransaction from https://github.com/Aliheym/typeorm-transactional
7277
};
7378
}
7479
```

libs/json-api/json-api-nestjs/src/lib/mixin/interceptors/error.interceptors.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class ErrorInterceptors<E extends Entity> implements NestInterceptor {
7979
const { errorCode, errorMsg, detail } = this.preparePostgresError(
8080
error.driverError
8181
);
82-
console.log(errorCode);
82+
8383
if (PostgresError[errorCode]) {
8484
return PostgresError[errorCode](
8585
this.repository.metadata,

libs/json-api/json-api-nestjs/src/lib/modules/atomic-operation/service/execute.service.ts

+19-3
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,25 @@ import {
66
PipeTransform,
77
Type,
88
} from '@nestjs/common';
9-
import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants';
9+
import {
10+
INTERCEPTORS_METADATA,
11+
ROUTE_ARGS_METADATA,
12+
} from '@nestjs/common/constants';
1013
import { Module } from '@nestjs/core/injector/module';
1114
import { ArgumentMetadata } from '@nestjs/common/interfaces/features/pipe-transform.interface';
1215
import { ModuleRef } from '@nestjs/core';
1316
import { DataSource } from 'typeorm';
1417

1518
import { ParamsForExecute } from '../types';
1619
import { CURRENT_DATA_SOURCE_TOKEN } from '../../../constants';
17-
import { ASYNC_ITERATOR_FACTORY, KEY_MAIN_INPUT_SCHEMA } from '../constants';
20+
import {
21+
ASYNC_ITERATOR_FACTORY,
22+
KEY_MAIN_INPUT_SCHEMA,
23+
OPTIONS,
24+
} from '../constants';
1825
import { IterateFactory } from '../factory';
1926
import {
27+
ConfigParam,
2028
ResourceObject,
2129
ResourceObjectRelationships,
2230
TypeFromType,
@@ -42,11 +50,19 @@ export class ExecuteService {
4250
@Inject(ASYNC_ITERATOR_FACTORY) private asyncIteratorFactory!: IterateFactory<
4351
ExecuteService['runOneOperation']
4452
>;
53+
@Inject(OPTIONS) private options!: ConfigParam;
4554

4655
async run(params: ParamsForExecute[], tmpIds: (string | number)[]) {
56+
if (
57+
this.options.runInTransaction &&
58+
typeof this.options.runInTransaction === 'function'
59+
) {
60+
return this.options.runInTransaction('READ UNCOMMITTED', () => {
61+
return this.executeOperations(params, tmpIds);
62+
});
63+
}
4764
const queryRunner = this.dataSource.createQueryRunner();
4865
await queryRunner.startTransaction('READ UNCOMMITTED');
49-
5066
try {
5167
const resultArray = await this.executeOperations(params, tmpIds);
5268
await queryRunner.commitTransaction();

libs/json-api/json-api-nestjs/src/lib/types/module.types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ModuleMetadata, Type, PipeTransform } from '@nestjs/common';
22
import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type';
33
import { ObjectLiteral } from 'typeorm/common/ObjectLiteral';
4+
import { IsolationLevel } from 'typeorm/driver/types/IsolationLevel';
45

56
export type NestController = ModuleMetadata['controllers'];
67
export type NestProvider = ModuleMetadata['providers'];
@@ -24,6 +25,10 @@ export interface ConfigParam {
2425
pipeForId: PipeMixin;
2526
operationUrl?: string;
2627
overrideRoute?: string;
28+
runInTransaction?: <Func extends (...args: any) => any>(
29+
isolationLevel: IsolationLevel,
30+
fn: Func
31+
) => ReturnType<Func>;
2732
}
2833

2934
export interface ModuleOptions {

0 commit comments

Comments
 (0)