{
  "version": 3,
  "sources": ["../src/usecase/classes/transaction.class.ts"],
  "sourcesContent": ["import { get, set } from '@dikolab/private-parts';\nimport {\n   ACTOR_KEY,\n   GOAL_KEY,\n   HANDLER_KEY,\n   MOCK_HANDLER_KEY,\n   ROLES_KEY,\n   TRANSACTION_SESSION,\n   TRANSACTION_SIGNATURE,\n} from '../../utils/constants/symbol-keys.constant';\nimport type { TransactionModel } from '../types/transaction-model.type';\nimport type {\n   PerformParameters,\n   PerformAwaitedResult,\n   PerformUsecase,\n} from '../types/performer.type';\n\nimport type { AnyActor } from '../../actor/types/utility.type';\nimport { isActorAllowToPerform } from '../functions/is-actor-allow-to-perform.function';\nimport { createSessionData } from '../functions/create-session-data.function';\nimport type { AnyFunction } from '../../utils/types/utility.type';\nimport { emitSymbolEvent } from '../../symbol/functions/emit-symbol-event.function';\nimport type { AnyUsecase } from '../types/utility.type';\n\n/**\n * Encapsulates an actor's execution context with\n * session data, providing methods to perform use\n * cases and override session state\n */\nexport class Transaction<\n   Data extends object,\n   Actor extends AnyActor = AnyActor,\n> implements TransactionModel<Data>\n{\n   readonly [TRANSACTION_SIGNATURE] = 1;\n\n   get [ACTOR_KEY](): Actor {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return get(this, ACTOR_KEY);\n   }\n\n   get [TRANSACTION_SESSION](): Readonly<Data> {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return get(this, TRANSACTION_SESSION);\n   }\n\n   constructor(data: Data, actor: Actor) {\n      set(this, TRANSACTION_SESSION, data);\n      set(this, ACTOR_KEY, actor);\n   }\n\n   /**\n    * Retrieves Session data based from \"name\" key parameter.\n    *\n    * @param name Key of session data\n    * @returns value of store session data. Or, undefined if not found\n    */\n   get<Key extends keyof Data>(name: Key): Data[Key] | undefined {\n      const session = this[TRANSACTION_SESSION];\n\n      return Object.prototype.hasOwnProperty.call(session, name)\n         ? session[name]\n         : undefined;\n   }\n\n   /**\n    * Creates new transaction with overridden Session data\n    *\n    * @param overrides session data overrides\n    * @returns Transaction\n    */\n   override<Overrides extends object>(\n      overrides: Overrides,\n   ): Transaction<Data & Overrides> {\n      const session = this[TRANSACTION_SESSION];\n\n      const newData = Object.assign({}, session, overrides);\n\n      return new Transaction(newData, this[ACTOR_KEY]);\n   }\n\n   /**\n    * Performs a Use-case and returns result of the Use-case handler.\n    *\n    * @param usecase The Use-case to perform allowed by Roles\n    * @param params Use case handler parameters\n    * @returns Result of perform Use-case\n    */\n   async perform<Usecase extends PerformUsecase<Data>>(\n      usecase: Usecase,\n      ...params: PerformParameters<Usecase>\n   ): Promise<PerformAwaitedResult<Usecase>> {\n      const roles = usecase[ROLES_KEY];\n      const actor = this[ACTOR_KEY];\n\n      if (!isActorAllowToPerform(actor, roles)) {\n         throw new Error(\n            `${String(this[ACTOR_KEY])} is not allowed to perform \"${String(usecase)}\"`,\n         );\n      }\n\n      // if no mock handler, use the original handler\n      const handler = (usecase[MOCK_HANDLER_KEY] ||\n         usecase[HANDLER_KEY]) as AnyFunction;\n\n      const transaction = new Transaction(\n         createSessionData(this[TRANSACTION_SESSION]),\n         actor,\n      );\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n      const result = await handler(...params, transaction);\n\n      emitSymbolEvent(\n         usecase as AnyUsecase,\n         'perform',\n         result,\n         usecase,\n         actor,\n      );\n\n      const goal = usecase[GOAL_KEY];\n\n      emitSymbolEvent(goal, 'achieved', goal, usecase, result);\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return result;\n   }\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,KAAK,WAAW;AA6BlB,IAAM,cAAN,MAAM,aAIb;AAAA,EACG,CAAU,qBAAqB,IAAI;AAAA,EAEnC,KAAK,SAAS,IAAW;AAEtB,WAAO,IAAI,MAAM,SAAS;AAAA,EAC7B;AAAA,EAEA,KAAK,mBAAmB,IAAoB;AAEzC,WAAO,IAAI,MAAM,mBAAmB;AAAA,EACvC;AAAA,EAEA,YAAY,MAAY,OAAc;AACnC,QAAI,MAAM,qBAAqB,IAAI;AACnC,QAAI,MAAM,WAAW,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAA4B,MAAkC;AAC3D,UAAM,UAAU,KAAK,mBAAmB;AAExC,WAAO,OAAO,UAAU,eAAe,KAAK,SAAS,IAAI,IACpD,QAAQ,IAAI,IACZ;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SACG,WAC8B;AAC9B,UAAM,UAAU,KAAK,mBAAmB;AAExC,UAAM,UAAU,OAAO,OAAO,CAAC,GAAG,SAAS,SAAS;AAEpD,WAAO,IAAI,aAAY,SAAS,KAAK,SAAS,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QACH,YACG,QACoC;AACvC,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI,CAAC,sBAAsB,OAAO,KAAK,GAAG;AACvC,YAAM,IAAI;AAAA,QACP,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,+BAA+B,OAAO,OAAO,CAAC;AAAA,MAC3E;AAAA,IACH;AAGA,UAAM,UAAW,QAAQ,gBAAgB,KACtC,QAAQ,WAAW;AAEtB,UAAM,cAAc,IAAI;AAAA,MACrB,kBAAkB,KAAK,mBAAmB,CAAC;AAAA,MAC3C;AAAA,IACH;AAGA,UAAM,SAAS,MAAM,QAAQ,GAAG,QAAQ,WAAW;AAEnD;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACH;AAEA,UAAM,OAAO,QAAQ,QAAQ;AAE7B,oBAAgB,MAAM,YAAY,MAAM,SAAS,MAAM;AAGvD,WAAO;AAAA,EACV;AACH;",
  "names": []
}
