UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

120 lines (116 loc) 5.69 kB
'use strict'; 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