@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
120 lines (116 loc) • 5.69 kB
JavaScript
;
require('../../../../enum/decorator/api/action.enum.js');
require('../../../../enum/decorator/api/authentication-type.enum.js');
require('../../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js');
require('../../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js');
require('../../../../enum/decorator/api/controller/relation-reference-shape.enum.js');
require('../../../../enum/decorator/api/controller/request/target.enum.js');
require('../../../../enum/decorator/api/controller/request/transformer-type.enum.js');
require('../../../../enum/decorator/api/controller/response-target.enum.js');
require('../../../../enum/decorator/api/dto-type.enum.js');
require('../../../../enum/decorator/api/function/context-storage-kind.enum.js');
require('../../../../enum/decorator/api/function/subscriber-transaction-expectation.enum.js');
var eventStatus_enum = require('../../../../enum/decorator/api/function/transaction/event-status.enum.js');
require('../../../../enum/decorator/api/function/transaction/failure-stage.enum.js');
require('../../../../enum/decorator/api/function/transaction/mode.enum.js');
require('../../../../enum/decorator/api/function/transaction/outcome.enum.js');
require('../../../../enum/decorator/api/function/transaction/owner-kind.enum.js');
var traceType_enum = require('../../../../enum/decorator/api/function/transaction/trace-type.enum.js');
require('../../../../enum/decorator/api/function/type.enum.js');
require('../../../../enum/decorator/api/on-type.enum.js');
require('../../../../enum/decorator/api/property/data-type.enum.js');
require('../../../../enum/decorator/api/property/date/identifier.enum.js');
require('../../../../enum/decorator/api/property/date/type.enum.js');
require('../../../../enum/decorator/api/property/desribe-type.enum.js');
require('../../../../enum/decorator/api/property/number-type.enum.js');
require('../../../../enum/decorator/api/property/string-type.enum.js');
require('../../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js');
require('../../../../enum/decorator/api/route/type.enum.js');
var exception_utility = require('../../../../utility/error/exception.utility.js');
class ApiFunctionTransactionRegistry {
EVENTS = [];
eventSnapshot;
TRANSACTION;
constructor(id, owner) {
this.TRANSACTION = Object.freeze({
id,
owner: Object.freeze({ ...owner }),
});
}
beginEvent(options) {
if (this.eventSnapshot) {
throw exception_utility.ErrorException("Cannot register an event after transaction lifecycle dispatch has started");
}
const sequence = this.EVENTS.length + 1;
this.EVENTS.push({
...options,
sequence,
});
return sequence;
}
createContext(matchedEvents) {
const events = this.getEvents();
return Object.freeze({
DATA: Object.freeze({
events,
matchedEvents: Object.freeze([...matchedEvents]),
transaction: this.TRANSACTION,
}),
});
}
failEvent(sequence, error) {
const event = this.getPendingEvent(sequence);
event.error = error;
event.status = eventStatus_enum.EApiFunctionTransactionEventStatus.FAILED;
}
getEvents() {
this.eventSnapshot ??= Object.freeze(this.EVENTS.map((event) => {
if (event.status === eventStatus_enum.EApiFunctionTransactionEventStatus.FAILED) {
return Object.freeze({
action: event.action,
entityName: event.entityName,
error: event.error,
functionType: event.functionType,
methodName: event.methodName,
sequence: event.sequence,
status: event.status,
});
}
if (event.status === eventStatus_enum.EApiFunctionTransactionEventStatus.SUCCEEDED) {
return Object.freeze({
action: event.action,
entityName: event.entityName,
functionType: event.functionType,
methodName: event.methodName,
sequence: event.sequence,
status: event.status,
});
}
throw exception_utility.ErrorException(`Transaction event ${event.sequence} has not completed`);
}));
return this.eventSnapshot;
}
getObservableEvents() {
const observableSequences = new Set(this.EVENTS.filter((event) => event.isSubscriberObservable && event.functionType !== traceType_enum.EApiFunctionTransactionTraceType.STEP).map((event) => event.sequence));
return Object.freeze(this.getEvents().filter((event) => observableSequences.has(event.sequence)));
}
getTransaction() {
return this.TRANSACTION;
}
succeedEvent(sequence) {
const event = this.getPendingEvent(sequence);
event.status = eventStatus_enum.EApiFunctionTransactionEventStatus.SUCCEEDED;
}
getPendingEvent(sequence) {
const event = this.EVENTS[sequence - 1];
if (event?.sequence !== sequence) {
throw exception_utility.ErrorException(`Transaction event ${sequence} is not registered`);
}
if (event.status) {
throw exception_utility.ErrorException(`Transaction event ${sequence} has already completed`);
}
return event;
}
}
exports.ApiFunctionTransactionRegistry = ApiFunctionTransactionRegistry;
//# sourceMappingURL=registry.class.js.map