@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
77 lines (74 loc) • 4.96 kB
JavaScript
import { ApiFunctionContextStorage } from '../context-storage.class.js';
import { ApiFunctionTransactionRuntime } from './runtime.class.js';
import '../../../../enum/decorator/api/action.enum.js';
import '../../../../enum/decorator/api/authentication-type.enum.js';
import '../../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js';
import '../../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js';
import '../../../../enum/decorator/api/controller/relation-reference-shape.enum.js';
import '../../../../enum/decorator/api/controller/request/target.enum.js';
import '../../../../enum/decorator/api/controller/request/transformer-type.enum.js';
import '../../../../enum/decorator/api/controller/response-target.enum.js';
import '../../../../enum/decorator/api/dto-type.enum.js';
import '../../../../enum/decorator/api/function/context-storage-kind.enum.js';
import '../../../../enum/decorator/api/function/subscriber-transaction-expectation.enum.js';
import '../../../../enum/decorator/api/function/transaction/event-status.enum.js';
import '../../../../enum/decorator/api/function/transaction/failure-stage.enum.js';
import '../../../../enum/decorator/api/function/transaction/mode.enum.js';
import '../../../../enum/decorator/api/function/transaction/outcome.enum.js';
import { EApiFunctionTransactionOwnerKind } from '../../../../enum/decorator/api/function/transaction/owner-kind.enum.js';
import '../../../../enum/decorator/api/function/transaction/trace-type.enum.js';
import '../../../../enum/decorator/api/function/type.enum.js';
import '../../../../enum/decorator/api/on-type.enum.js';
import '../../../../enum/decorator/api/property/data-type.enum.js';
import '../../../../enum/decorator/api/property/date/identifier.enum.js';
import '../../../../enum/decorator/api/property/date/type.enum.js';
import '../../../../enum/decorator/api/property/desribe-type.enum.js';
import '../../../../enum/decorator/api/property/number-type.enum.js';
import '../../../../enum/decorator/api/property/string-type.enum.js';
import '../../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js';
import '../../../../enum/decorator/api/route/type.enum.js';
import { ErrorException } from '../../../../utility/error/exception.utility.js';
class ApiFunctionTransactionScope {
static async runWithDataSource(dataSource, properties, callback) {
const name = properties.name.trim();
if (name.length === 0) {
throw ErrorException("ApiFunctionTransactionScope name must be a non-empty string");
}
return await ApiFunctionTransactionRuntime.execute({
callback: async (entityManager) => await ApiFunctionTransactionScope.runWithEntityManager(entityManager, async () => await callback(entityManager)),
dataSource,
owner: {
kind: EApiFunctionTransactionOwnerKind.SCOPE,
name,
},
});
}
static async runWithEntityManager(entityManager, callback) {
const registry = ApiFunctionContextStorage.getTransactionRegistryForEntityManager(entityManager);
if (!registry || registry !== ApiFunctionContextStorage.getTransactionRegistry() || ApiFunctionContextStorage.getEventManager() !== entityManager || ApiFunctionContextStorage.getTransactionQueryRunner()?.manager !== entityManager) {
throw ErrorException("ApiFunctionTransactionScope.runWithEntityManager requires an existing Automator transaction owner registry");
}
const entity = Object;
const context = {
entity,
eventManager: entityManager,
getRepository: (repositoryEntity) => entityManager.getRepository(repositoryEntity),
operations: {
create: () => Promise.reject(ApiFunctionTransactionScope.createMissingServiceContextError()),
delete: () => Promise.reject(ApiFunctionTransactionScope.createMissingServiceContextError()),
get: () => Promise.reject(ApiFunctionTransactionScope.createMissingServiceContextError()),
getList: () => Promise.reject(ApiFunctionTransactionScope.createMissingServiceContextError()),
getMany: () => Promise.reject(ApiFunctionTransactionScope.createMissingServiceContextError()),
getRepository: (repositoryEntity) => entityManager.getRepository(repositoryEntity),
update: () => Promise.reject(ApiFunctionTransactionScope.createMissingServiceContextError()),
},
repository: entityManager.getRepository(entity),
};
return await ApiFunctionContextStorage.run(context, callback);
}
static createMissingServiceContextError() {
return ErrorException("ApiFunctionTransactionScope operations require a decorated service context");
}
}
export { ApiFunctionTransactionScope };
//# sourceMappingURL=scope.class.js.map