wsp-ms-core 1.0.66 → 1.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -311,7 +311,7 @@ var DomainEventStatus = _DomainEventStatus;
311
311
 
312
312
  // src/domain/contracts/DomainEvent.ts
313
313
  var DomainEvent = class _DomainEvent {
314
- constructor(eventUuid, tenantUuid, aggregateUuid, aggregateType, eventType, topic, payload, status, attempts, errorMessage, publishedAt, lastAttempt, createdAt) {
314
+ constructor(eventUuid, eventType, tenantUuid, aggregateUuid, aggregateType, topic, payload, status, attempts, errorMessage, publishedAt, lastAttempt, createdAt) {
315
315
  this._eventUuid = eventUuid;
316
316
  this._tenantUuid = tenantUuid;
317
317
  this._aggregateUuid = aggregateUuid;
@@ -384,10 +384,10 @@ var DomainEvent = class _DomainEvent {
384
384
  var _a, _b, _c, _d, _e;
385
385
  return {
386
386
  eventUuid: this.eventUuid.value,
387
+ eventType: this.eventType,
387
388
  tenantUuid: this.tenantUuid.value,
388
389
  aggregateUuid: this.aggregateUuid.value,
389
390
  aggregateType: this.aggregateType,
390
- eventType: this.eventType,
391
391
  topic: this.topic,
392
392
  payload: this.payload,
393
393
  status: this.status.value,
@@ -402,10 +402,10 @@ var DomainEvent = class _DomainEvent {
402
402
  var _a;
403
403
  return new _DomainEvent(
404
404
  UUID.create(data.event_uuid),
405
+ String(data.event_type),
405
406
  UUID.create(data.tenant_uuid),
406
407
  UUID.create(data.aggregate_uuid),
407
408
  String(data.aggregate_type),
408
- String(data.event_type),
409
409
  String(data.topic),
410
410
  String(data.payload),
411
411
  DomainEventStatus.create(data.status),
@@ -848,6 +848,9 @@ var _PaymentStatus = class _PaymentStatus extends ValueObject {
848
848
  get isHold() {
849
849
  return this.value === "HOLD";
850
850
  }
851
+ get isPendingRefund() {
852
+ return this.value === "PENDING_REFUND";
853
+ }
851
854
  get isRefunded() {
852
855
  return this.value === "REFUNDED";
853
856
  }
@@ -858,13 +861,14 @@ var _PaymentStatus = class _PaymentStatus extends ValueObject {
858
861
  return new _PaymentStatus(gateway.trim().toUpperCase());
859
862
  }
860
863
  };
861
- _PaymentStatus.SUPPORTED = ["DONE", "PENDING", "FAILED", "CANCELED", "HOLD", "REFUNDED", "IN_PROGRESS"];
864
+ _PaymentStatus.SUPPORTED = ["DONE", "PENDING", "FAILED", "CANCELED", "HOLD", "PENDING_REFUND", "REFUNDED", "IN_PROGRESS"];
862
865
  _PaymentStatus.DONE = new _PaymentStatus("DONE");
863
866
  _PaymentStatus.PENDING = new _PaymentStatus("PENDING");
864
867
  _PaymentStatus.IN_PROGRESS = new _PaymentStatus("IN_PROGRESS");
865
868
  _PaymentStatus.FAILED = new _PaymentStatus("FAILED");
866
869
  _PaymentStatus.CANCELED = new _PaymentStatus("CANCELED");
867
870
  _PaymentStatus.HOLD = new _PaymentStatus("HOLD");
871
+ _PaymentStatus.PENDING_REFUND = new _PaymentStatus("PENDING_REFUND");
868
872
  _PaymentStatus.REFUNDED = new _PaymentStatus("REFUNDED");
869
873
  var PaymentStatus = _PaymentStatus;
870
874
 
@@ -1158,10 +1162,10 @@ var EventBusMysqlRepository = class {
1158
1162
  var _a, _b;
1159
1163
  return [
1160
1164
  e.eventUuid.value,
1165
+ e.eventType,
1161
1166
  e.tenantUuid.value,
1162
1167
  e.aggregateUuid.value,
1163
1168
  e.aggregateType,
1164
- e.eventType,
1165
1169
  e.topic,
1166
1170
  e.payload,
1167
1171
  e.status.value,
@@ -1175,7 +1179,7 @@ var EventBusMysqlRepository = class {
1175
1179
  async create(event) {
1176
1180
  const values = this.eventToRowValues(event);
1177
1181
  await this.connection.query(
1178
- `INSERT INTO events_outbox (event_uuid, tenant_uuid, aggregate_uuid, aggregate_type, event_type, topic,
1182
+ `INSERT INTO events_outbox (event_uuid, event_type, tenant_uuid, aggregate_uuid, aggregate_type, topic,
1179
1183
  payload, status, attempts, error_message, published_at, last_attempt, created_at)
1180
1184
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
1181
1185
  values
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/errors/InternalError.ts","../src/domain/value-objects/UUID.ts","../src/domain/value-objects/DomainEventStatus.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/payments/PaymentGateway.ts","../src/domain/value-objects/payments/PaymentStatus.ts","../src/application/event-bus/EventBus.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/infrastructure/event-bus/EventBusMysqlRepository.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["/* ──────────────────────────────────────────────── *\n * DOMAIN *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DomainEntity, BaseEntity} from './domain/contracts/DomainEntity';\nexport {DomainError} from './domain/contracts/DomainError';\nexport {DomainEvent} from './domain/contracts/DomainEvent';\nexport {ValueObject} from './domain/contracts/ValueObject';\nexport {BaseObject} from './domain/contracts/BaseObject';\n// Errors\nexport {FatalError} from './domain/errors/FatalError';\nexport {InternalError} from './domain/errors/InternalError';\nexport {UsageError} from './domain/errors/UsageError';\n// Value objects\nexport {Currency} from './domain/value-objects/Currency';\nexport {DateTime} from './domain/value-objects/DateTime';\nexport {Email} from './domain/value-objects/Email';\nexport {Language} from './domain/value-objects/Language';\nexport {DomainEventStatus} from '@domain/value-objects/DomainEventStatus';\nexport {Price} from './domain/value-objects/Price';\nexport {UUID} from './domain/value-objects/UUID';\nexport {PaymentGateway} from '@domain/value-objects/payments/PaymentGateway';\nexport {PaymentStatus} from '@domain/value-objects/payments/PaymentStatus';\n\n\n/* ──────────────────────────────────────────────── *\n * APPLICATION *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {EventBus} from '@application/event-bus/EventBus';\nexport {EventBusRepository} from './application/contracts/EventBusRepository';\nexport {UnitOfWork} from './application/contracts/UnitOfWork';\n// Unit of work\nexport {BasicUnitOfWork} from './application/unit-of-work/BasicUnitOfWork';\nexport {BasicUnitOfWorkFactory} from './application/unit-of-work/BasicUnitOfWorkFactory';\n\n\n/* ──────────────────────────────────────────────── *\n * INFRASTRUCTURE *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DatabaseConnector, DatabaseConnection} from './infrastructure/contracts/Database';\nexport {Logger} from './infrastructure/contracts/Logger';\nexport {HttpRequest, HttpResponse, HttpController, UploadedFile} from './infrastructure/contracts/Http';\n// Errors\nexport {ErrorManager, ErrorManagerHandleResult, ErrorTemplate} from './infrastructure/errors/ErrorManager';\n// Mysql\nexport {MysqlConnector, MysqlConnection} from './infrastructure/mysql/Mysql';\n// http\nexport {HttpHealthCheckController, HttpNotFoundController} from './infrastructure/http/DefaultController';\n// express\nexport {adaptExpressRoute, adaptExpressErrorHandler} from './infrastructure/express/ExpressAdapters';\nexport {EventBusMysqlRepository} from './infrastructure/event-bus/EventBusMysqlRepository';\n\n/* ──────────────────────────────────────────────── *\n * UTILS *\n * ──────────────────────────────────────────────── */\n\nexport {ExchangeRates} from './utils/ExchangeRates';","import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n protected _events: DomainEvent[] = [];\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected recordEvent(event: DomainEvent): void {\n this._events.push(event);\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public pullEvents(): DomainEvent[] {\n const events = this._events;\n this._events = [];\n return events;\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import { ValueObject } from \"@domain/contracts/ValueObject\";\nimport { InternalError } from \"@domain/errors/InternalError\";\nimport * as crypto from \"node:crypto\";\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface UUIDValidationOptions {\n /** Versiones permitidas (por defecto: 1–8) */\n allowedVersions?: UUIDVersion[];\n /** Permitir el NIL UUID \"00000000-0000-0000-0000-000000000000\" (por defecto: false) */\n allowNil?: boolean;\n}\n\nexport class UUID extends ValueObject<string> {\n public static readonly NIL = \"00000000-0000-0000-0000-000000000000\";\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static version(uuid: string): UUIDVersion | undefined {\n const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);\n return m ? (Number(m[1]) as UUIDVersion) : undefined;\n }\n\n public static isNil(uuid: string): boolean {\n return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);\n }\n\n public static isRFCStyle(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n public static isValid(uuid: string, opts: UUIDValidationOptions = {}): boolean {\n const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];\n const allowNil = opts.allowNil ?? false;\n\n if (allowNil && UUID.isNil(uuid)) return true;\n if (!UUID.isRFCStyle(uuid)) return false;\n\n const v = UUID.version(uuid);\n return !!v && allowed.includes(v);\n }\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class DomainEventStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['PENDING', 'PROCESSING', 'PROCESSED', 'FAILED', 'DEAD'];\n\n public static readonly PENDING: DomainEventStatus = new DomainEventStatus('PENDING');\n public static readonly PROCESSING: DomainEventStatus = new DomainEventStatus('PROCESSING');\n public static readonly PROCESSED: DomainEventStatus = new DomainEventStatus('PROCESSED');\n public static readonly FAILED: DomainEventStatus = new DomainEventStatus('FAILED');\n public static readonly DEAD: DomainEventStatus = new DomainEventStatus('DEAD');\n\n private constructor(status: string) {\n super(status.trim().toUpperCase());\n }\n\n protected validate(value: string): void {\n if (!DomainEventStatus.SUPPORTED.includes(value)) {\n throw new InternalError(`Domain event status <${value}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return undefined;\n }\n\n public static create(status: string): DomainEventStatus {\n return new DomainEventStatus(status);\n }\n\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\nimport {UUID} from \"@domain/value-objects/UUID\";\nimport {DomainEventStatus} from \"@domain/value-objects/DomainEventStatus\";\n\nexport class DomainEvent {\n\n private readonly _eventUuid: UUID;\n private readonly _tenantUuid: UUID;\n private readonly _aggregateUuid: UUID;\n private readonly _aggregateType: string;\n private readonly _eventType: string;\n private readonly _topic: string;\n private readonly _payload: string;\n private _status: DomainEventStatus;\n private _attempts: number;\n private _errorMessage: string | undefined;\n private _publishedAt: DateTime | undefined;\n private _lastAttempt: DateTime | undefined;\n private readonly _createdAt: DateTime;\n\n protected constructor(\n eventUuid: UUID,\n tenantUuid: UUID,\n aggregateUuid: UUID,\n aggregateType: string,\n eventType: string,\n topic: string,\n payload: string,\n status: DomainEventStatus,\n attempts: number,\n errorMessage: string | undefined,\n publishedAt: DateTime | undefined,\n lastAttempt: DateTime | undefined,\n createdAt: DateTime\n ) {\n this._eventUuid = eventUuid;\n this._tenantUuid = tenantUuid;\n this._aggregateUuid = aggregateUuid;\n this._aggregateType = aggregateType;\n this._eventType = eventType;\n this._topic = topic;\n this._payload = payload;\n this._status = status;\n this._attempts = 0;\n this._errorMessage = errorMessage;\n this._publishedAt = publishedAt;\n this._lastAttempt = lastAttempt;\n this._createdAt = createdAt;\n }\n\n public get eventUuid(): UUID {\n return this._eventUuid;\n }\n public get tenantUuid(): UUID {\n return this._tenantUuid;\n }\n public get aggregateUuid(): UUID {\n return this._aggregateUuid;\n }\n public get aggregateType(): string {\n return this._aggregateType;\n }\n public get eventType(): string {\n return this._eventType;\n }\n public get topic(): string {\n return this._topic;\n }\n public get payload(): string {\n return this._payload;\n }\n public get status(): DomainEventStatus {\n return this._status;\n }\n public get attempts(): number {\n return this._attempts;\n }\n public get errorMessage(): string | undefined {\n return this._errorMessage;\n }\n public get publishedAt(): DateTime | undefined {\n return this._publishedAt;\n }\n public get lastAttempt(): DateTime | undefined {\n return this._lastAttempt;\n }\n public get createdAt(): DateTime {\n return this._createdAt;\n }\n\n public incrementAttempts(): void {\n this._attempts++;\n this._lastAttempt = DateTime.now();\n }\n public markProcessed(): void {\n this._status = DomainEventStatus.PROCESSED\n this._publishedAt = DateTime.now();\n }\n public markProcessing(): void {\n this._status = DomainEventStatus.PROCESSING;\n }\n public markWithError(error: string): void {\n this._status = DomainEventStatus.FAILED;\n this._errorMessage = error;\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n eventUuid: this.eventUuid.value,\n tenantUuid: this.tenantUuid.value,\n aggregateUuid: this.aggregateUuid.value,\n aggregateType: this.aggregateType,\n eventType: this.eventType,\n topic: this.topic,\n payload: this.payload,\n status: this.status.value,\n attempts: this.attempts,\n errorMessage: this.errorMessage ?? undefined,\n publishedAt: this.publishedAt?.value ?? undefined,\n lastAttempt: this.lastAttempt?.value ?? undefined,\n createdAt: this.createdAt.value\n }\n }\n\n public static reconstitute(data: Record<string, any>): DomainEvent {\n return new DomainEvent(\n UUID.create(data.event_uuid),\n UUID.create(data.tenant_uuid),\n UUID.create(data.aggregate_uuid),\n String(data.aggregate_type),\n String(data.event_type),\n String(data.topic),\n String(data.payload),\n DomainEventStatus.create(data.status),\n Number(data.attempts),\n data.error_message ?? undefined,\n data.published_at ? DateTime.create(data.published_at) : undefined,\n data.last_attempt ? DateTime.create(data.last_attempt) : undefined,\n data.created_at ? DateTime.create(data.created_at) : undefined\n )\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import {ValueObject} from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentGateway extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'MERCADOPAGO',\n 'HANDY',\n 'WONA_DEBIT',\n 'WONA_CARD',\n 'WONA_CASH',\n 'WONA_TRANSFER',\n 'WONA_MERCADOPAGO',\n ] as const;\n\n private static readonly EXTERNALS: readonly string[] = ['MERCADOPAGO', 'STRIPE'];\n\n public static readonly MERCADOPAGO: PaymentGateway = new PaymentGateway('MERCADOPAGO');\n public static readonly HANDY: PaymentGateway = new PaymentGateway('HANDY');\n public static readonly WONA_DEBIT: PaymentGateway = new PaymentGateway('WONA_DEBIT');\n public static readonly WONA_CARD: PaymentGateway = new PaymentGateway('WONA_CARD');\n public static readonly WONA_CASH: PaymentGateway = new PaymentGateway('WONA_CASH');\n public static readonly WONA_TRANSFER: PaymentGateway = new PaymentGateway('WONA_TRANSFER');\n public static readonly WONA_MERCADOPAGO: PaymentGateway = new PaymentGateway('WONA_MERCADOPAGO');\n\n private constructor(gateway: string) {\n super(gateway);\n }\n\n protected validate(value: string): void {\n if (!PaymentGateway.SUPPORTED.includes(value)) {\n throw new InternalError(`Payment gateway <${value}> is not supported`);\n }\n }\n\n public isExternal(): boolean {\n return PaymentGateway.EXTERNALS.includes(this.value);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentGateway {\n return new PaymentGateway(gateway.trim().toUpperCase());\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['DONE', 'PENDING', 'FAILED', 'CANCELED', 'HOLD', 'REFUNDED', 'IN_PROGRESS'] as const;\n\n public static readonly DONE: PaymentStatus = new PaymentStatus('DONE');\n public static readonly PENDING: PaymentStatus = new PaymentStatus('PENDING');\n public static readonly IN_PROGRESS: PaymentStatus = new PaymentStatus('IN_PROGRESS');\n public static readonly FAILED: PaymentStatus = new PaymentStatus('FAILED');\n public static readonly CANCELED: PaymentStatus = new PaymentStatus('CANCELED');\n public static readonly HOLD: PaymentStatus = new PaymentStatus('HOLD');\n public static readonly REFUNDED: PaymentStatus = new PaymentStatus('REFUNDED');\n\n private constructor(status: string) {\n super(status);\n }\n\n protected validate(status: string): void {\n if (!PaymentStatus.SUPPORTED.includes(status)) {\n throw new InternalError(`Payment status <${status}> is not supported`);\n }\n }\n\n public get isDone(): boolean {\n return this.value === 'DONE';\n }\n public get isPending(): boolean {\n return this.value === 'PENDING';\n }\n public get isInProgress(): boolean {\n return this.value === 'IN_PROGRESS';\n }\n public get isFailed(): boolean {\n return this.value === 'FAILED';\n }\n public get isCanceled(): boolean {\n return this.value === 'CANCELED';\n }\n public get isHold(): boolean {\n return this.value === 'HOLD';\n }\n public get isRefunded(): boolean {\n return this.value === 'REFUNDED';\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentStatus {\n return new PaymentStatus(gateway.trim().toUpperCase());\n }\n\n}\n","import {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {EventBusRepository} from \"@application/contracts/EventBusRepository\";\n\nexport class EventBus {\n\n private readonly repository: EventBusRepository;\n\n public constructor(repository: EventBusRepository) {\n this.repository = repository;\n }\n\n public async publish(event: DomainEvent): Promise<void> {\n await this.repository.create(event);\n }\n\n public async publishMany(events: DomainEvent[]): Promise<void> {\n for (let event of events) {\n await this.publish(event);\n }\n }\n\n}","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n\n public static readonly DEFAULT_POOL_SIZE: number = 20;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool = pool ?? createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async query(sql: string, params: any[] = []): Promise<any[]> {\n const [rows] = await this._pool.query<any[]>(sql, params);\n return rows;\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n await this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\nfunction hasHeader(headers: HttpResponse['headers'] | undefined, name: string): boolean {\n if (!headers) return false;\n const lname = name.toLowerCase();\n return Object.keys(headers).some(h => h.toLowerCase() === lname);\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n if (headers) res.set(headers as any);\n\n // 1) Streams\n if (isReadableStream(body)) {\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n // 2) Binarios (Buffer / ArrayBuffer / TypedArray)\n const isArrayBuffer = typeof body === 'object' && body instanceof ArrayBuffer;\n const isArrayBufferView = typeof body === 'object' && body != null && ArrayBuffer.isView(body as any);\n\n if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {\n let buf: Buffer;\n if (Buffer.isBuffer(body)) {\n buf = body as Buffer;\n } else if (isArrayBuffer) {\n buf = Buffer.from(body as ArrayBuffer);\n } else {\n const view = body as ArrayBufferView;\n buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n if (!res.getHeader('Content-Length')) res.set('Content-Length', String(buf.length));\n\n res.status(statusCode);\n res.end(buf);\n return;\n }\n\n // 3) String o Content-Type custom → send()\n const hasCT = hasHeader(headers, 'Content-Type');\n if (typeof body === 'string' || hasCT) {\n res.status(statusCode).send(body as any);\n return;\n }\n // 4) Default: JSON\n res.status(statusCode).json(body ?? {});\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {EventBusRepository} from \"@application/contracts/EventBusRepository\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {MysqlConnection} from \"@infrastructure/mysql/Mysql\";\n\nexport class EventBusMysqlRepository implements EventBusRepository {\n\n private readonly connection: MysqlConnection;\n\n public constructor(connection: MysqlConnection) {\n this.connection = connection;\n }\n\n private eventToRowValues(e: DomainEvent): any[] {\n return [\n e.eventUuid.value, e.tenantUuid.value, e.aggregateUuid.value, e.aggregateType, e.eventType, e.topic, e.payload, e.status.value, e.attempts,\n e.errorMessage, e.publishedAt?.value, e.lastAttempt?.value, e.createdAt.value\n ];\n }\n\n public async create(event: DomainEvent): Promise<void> {\n const values = this.eventToRowValues(event);\n await this.connection.query(\n `INSERT INTO events_outbox (event_uuid, tenant_uuid, aggregate_uuid, aggregate_type, event_type, topic, \n payload, status, attempts, error_message, published_at, last_attempt, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n values\n );\n }\n\n public async update(event: DomainEvent): Promise<void> {\n const values = [event.status.value, event.attempts, event.errorMessage, event.publishedAt?.value, event.lastAttempt?.value, event.eventUuid.value];\n await this.connection.query(\n `UPDATE events_outbox\n SET status = ?,\n attempts = ?,\n error_message = ?,\n published_at = ?,\n last_attempt = ?\n WHERE event_uuid = ?`,\n values\n );\n }\n\n public async listPending(limit: number): Promise<DomainEvent[]> {\n const result = await this.connection.query(\n `SELECT * FROM events_outbox WHERE published_at IS NULL LIMIT 50`,\n []\n );\n return result.length > 0 ? result.map(r => DomainEvent.reconstitute(r)) : [];\n }\n\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":["LuxonDateTime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/errors/InternalError.ts","../src/domain/value-objects/UUID.ts","../src/domain/value-objects/DomainEventStatus.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/payments/PaymentGateway.ts","../src/domain/value-objects/payments/PaymentStatus.ts","../src/application/event-bus/EventBus.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/infrastructure/event-bus/EventBusMysqlRepository.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["/* ──────────────────────────────────────────────── *\n * DOMAIN *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DomainEntity, BaseEntity} from './domain/contracts/DomainEntity';\nexport {DomainError} from './domain/contracts/DomainError';\nexport {DomainEvent} from './domain/contracts/DomainEvent';\nexport {ValueObject} from './domain/contracts/ValueObject';\nexport {BaseObject} from './domain/contracts/BaseObject';\n// Errors\nexport {FatalError} from './domain/errors/FatalError';\nexport {InternalError} from './domain/errors/InternalError';\nexport {UsageError} from './domain/errors/UsageError';\n// Value objects\nexport {Currency} from './domain/value-objects/Currency';\nexport {DateTime} from './domain/value-objects/DateTime';\nexport {Email} from './domain/value-objects/Email';\nexport {Language} from './domain/value-objects/Language';\nexport {DomainEventStatus} from '@domain/value-objects/DomainEventStatus';\nexport {Price} from './domain/value-objects/Price';\nexport {UUID} from './domain/value-objects/UUID';\nexport {PaymentGateway} from '@domain/value-objects/payments/PaymentGateway';\nexport {PaymentStatus} from '@domain/value-objects/payments/PaymentStatus';\n\n\n/* ──────────────────────────────────────────────── *\n * APPLICATION *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {EventBus} from '@application/event-bus/EventBus';\nexport {EventBusRepository} from './application/contracts/EventBusRepository';\nexport {UnitOfWork} from './application/contracts/UnitOfWork';\n// Unit of work\nexport {BasicUnitOfWork} from './application/unit-of-work/BasicUnitOfWork';\nexport {BasicUnitOfWorkFactory} from './application/unit-of-work/BasicUnitOfWorkFactory';\n\n\n/* ──────────────────────────────────────────────── *\n * INFRASTRUCTURE *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DatabaseConnector, DatabaseConnection} from './infrastructure/contracts/Database';\nexport {Logger} from './infrastructure/contracts/Logger';\nexport {HttpRequest, HttpResponse, HttpController, UploadedFile} from './infrastructure/contracts/Http';\n// Errors\nexport {ErrorManager, ErrorManagerHandleResult, ErrorTemplate} from './infrastructure/errors/ErrorManager';\n// Mysql\nexport {MysqlConnector, MysqlConnection} from './infrastructure/mysql/Mysql';\n// http\nexport {HttpHealthCheckController, HttpNotFoundController} from './infrastructure/http/DefaultController';\n// express\nexport {adaptExpressRoute, adaptExpressErrorHandler} from './infrastructure/express/ExpressAdapters';\nexport {EventBusMysqlRepository} from './infrastructure/event-bus/EventBusMysqlRepository';\n\n/* ──────────────────────────────────────────────── *\n * UTILS *\n * ──────────────────────────────────────────────── */\n\nexport {ExchangeRates} from './utils/ExchangeRates';","import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n protected _events: DomainEvent[] = [];\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected recordEvent(event: DomainEvent): void {\n this._events.push(event);\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public pullEvents(): DomainEvent[] {\n const events = this._events;\n this._events = [];\n return events;\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import { ValueObject } from \"@domain/contracts/ValueObject\";\nimport { InternalError } from \"@domain/errors/InternalError\";\nimport * as crypto from \"node:crypto\";\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface UUIDValidationOptions {\n /** Versiones permitidas (por defecto: 1–8) */\n allowedVersions?: UUIDVersion[];\n /** Permitir el NIL UUID \"00000000-0000-0000-0000-000000000000\" (por defecto: false) */\n allowNil?: boolean;\n}\n\nexport class UUID extends ValueObject<string> {\n public static readonly NIL = \"00000000-0000-0000-0000-000000000000\";\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static version(uuid: string): UUIDVersion | undefined {\n const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);\n return m ? (Number(m[1]) as UUIDVersion) : undefined;\n }\n\n public static isNil(uuid: string): boolean {\n return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);\n }\n\n public static isRFCStyle(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n public static isValid(uuid: string, opts: UUIDValidationOptions = {}): boolean {\n const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];\n const allowNil = opts.allowNil ?? false;\n\n if (allowNil && UUID.isNil(uuid)) return true;\n if (!UUID.isRFCStyle(uuid)) return false;\n\n const v = UUID.version(uuid);\n return !!v && allowed.includes(v);\n }\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class DomainEventStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['PENDING', 'PROCESSING', 'PROCESSED', 'FAILED', 'DEAD'];\n\n public static readonly PENDING: DomainEventStatus = new DomainEventStatus('PENDING');\n public static readonly PROCESSING: DomainEventStatus = new DomainEventStatus('PROCESSING');\n public static readonly PROCESSED: DomainEventStatus = new DomainEventStatus('PROCESSED');\n public static readonly FAILED: DomainEventStatus = new DomainEventStatus('FAILED');\n public static readonly DEAD: DomainEventStatus = new DomainEventStatus('DEAD');\n\n private constructor(status: string) {\n super(status.trim().toUpperCase());\n }\n\n protected validate(value: string): void {\n if (!DomainEventStatus.SUPPORTED.includes(value)) {\n throw new InternalError(`Domain event status <${value}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return undefined;\n }\n\n public static create(status: string): DomainEventStatus {\n return new DomainEventStatus(status);\n }\n\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\nimport {UUID} from \"@domain/value-objects/UUID\";\nimport {DomainEventStatus} from \"@domain/value-objects/DomainEventStatus\";\n\nexport class DomainEvent {\n\n private readonly _eventUuid: UUID;\n private readonly _eventType: string;\n private readonly _tenantUuid: UUID;\n private readonly _aggregateUuid: UUID;\n private readonly _aggregateType: string;\n private readonly _topic: string;\n private readonly _payload: string;\n private _status: DomainEventStatus;\n private _attempts: number;\n private _errorMessage: string | undefined;\n private _publishedAt: DateTime | undefined;\n private _lastAttempt: DateTime | undefined;\n private readonly _createdAt: DateTime;\n\n protected constructor(\n eventUuid: UUID,\n eventType: string,\n tenantUuid: UUID,\n aggregateUuid: UUID,\n aggregateType: string,\n topic: string,\n payload: string,\n status: DomainEventStatus,\n attempts: number,\n errorMessage: string | undefined,\n publishedAt: DateTime | undefined,\n lastAttempt: DateTime | undefined,\n createdAt: DateTime\n ) {\n this._eventUuid = eventUuid;\n this._tenantUuid = tenantUuid;\n this._aggregateUuid = aggregateUuid;\n this._aggregateType = aggregateType;\n this._eventType = eventType;\n this._topic = topic;\n this._payload = payload;\n this._status = status;\n this._attempts = 0;\n this._errorMessage = errorMessage;\n this._publishedAt = publishedAt;\n this._lastAttempt = lastAttempt;\n this._createdAt = createdAt;\n }\n\n public get eventUuid(): UUID {\n return this._eventUuid;\n }\n public get tenantUuid(): UUID {\n return this._tenantUuid;\n }\n public get aggregateUuid(): UUID {\n return this._aggregateUuid;\n }\n public get aggregateType(): string {\n return this._aggregateType;\n }\n public get eventType(): string {\n return this._eventType;\n }\n public get topic(): string {\n return this._topic;\n }\n public get payload(): string {\n return this._payload;\n }\n public get status(): DomainEventStatus {\n return this._status;\n }\n public get attempts(): number {\n return this._attempts;\n }\n public get errorMessage(): string | undefined {\n return this._errorMessage;\n }\n public get publishedAt(): DateTime | undefined {\n return this._publishedAt;\n }\n public get lastAttempt(): DateTime | undefined {\n return this._lastAttempt;\n }\n public get createdAt(): DateTime {\n return this._createdAt;\n }\n\n public incrementAttempts(): void {\n this._attempts++;\n this._lastAttempt = DateTime.now();\n }\n public markProcessed(): void {\n this._status = DomainEventStatus.PROCESSED\n this._publishedAt = DateTime.now();\n }\n public markProcessing(): void {\n this._status = DomainEventStatus.PROCESSING;\n }\n public markWithError(error: string): void {\n this._status = DomainEventStatus.FAILED;\n this._errorMessage = error;\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n eventUuid: this.eventUuid.value,\n eventType: this.eventType,\n tenantUuid: this.tenantUuid.value,\n aggregateUuid: this.aggregateUuid.value,\n aggregateType: this.aggregateType,\n topic: this.topic,\n payload: this.payload,\n status: this.status.value,\n attempts: this.attempts,\n errorMessage: this.errorMessage ?? undefined,\n publishedAt: this.publishedAt?.value ?? undefined,\n lastAttempt: this.lastAttempt?.value ?? undefined,\n createdAt: this.createdAt.value\n }\n }\n\n public static reconstitute(data: Record<string, any>): DomainEvent {\n return new DomainEvent(\n UUID.create(data.event_uuid),\n String(data.event_type),\n UUID.create(data.tenant_uuid),\n UUID.create(data.aggregate_uuid),\n String(data.aggregate_type),\n String(data.topic),\n String(data.payload),\n DomainEventStatus.create(data.status),\n Number(data.attempts),\n data.error_message ?? undefined,\n data.published_at ? DateTime.create(data.published_at) : undefined,\n data.last_attempt ? DateTime.create(data.last_attempt) : undefined,\n data.created_at ? DateTime.create(data.created_at) : undefined\n )\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import {ValueObject} from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentGateway extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'MERCADOPAGO',\n 'HANDY',\n 'WONA_DEBIT',\n 'WONA_CARD',\n 'WONA_CASH',\n 'WONA_TRANSFER',\n 'WONA_MERCADOPAGO',\n ] as const;\n\n private static readonly EXTERNALS: readonly string[] = ['MERCADOPAGO', 'STRIPE'];\n\n public static readonly MERCADOPAGO: PaymentGateway = new PaymentGateway('MERCADOPAGO');\n public static readonly HANDY: PaymentGateway = new PaymentGateway('HANDY');\n public static readonly WONA_DEBIT: PaymentGateway = new PaymentGateway('WONA_DEBIT');\n public static readonly WONA_CARD: PaymentGateway = new PaymentGateway('WONA_CARD');\n public static readonly WONA_CASH: PaymentGateway = new PaymentGateway('WONA_CASH');\n public static readonly WONA_TRANSFER: PaymentGateway = new PaymentGateway('WONA_TRANSFER');\n public static readonly WONA_MERCADOPAGO: PaymentGateway = new PaymentGateway('WONA_MERCADOPAGO');\n\n private constructor(gateway: string) {\n super(gateway);\n }\n\n protected validate(value: string): void {\n if (!PaymentGateway.SUPPORTED.includes(value)) {\n throw new InternalError(`Payment gateway <${value}> is not supported`);\n }\n }\n\n public isExternal(): boolean {\n return PaymentGateway.EXTERNALS.includes(this.value);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentGateway {\n return new PaymentGateway(gateway.trim().toUpperCase());\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['DONE', 'PENDING', 'FAILED', 'CANCELED', 'HOLD', 'PENDING_REFUND', 'REFUNDED', 'IN_PROGRESS'] as const;\n\n public static readonly DONE: PaymentStatus = new PaymentStatus('DONE');\n public static readonly PENDING: PaymentStatus = new PaymentStatus('PENDING');\n public static readonly IN_PROGRESS: PaymentStatus = new PaymentStatus('IN_PROGRESS');\n public static readonly FAILED: PaymentStatus = new PaymentStatus('FAILED');\n public static readonly CANCELED: PaymentStatus = new PaymentStatus('CANCELED');\n public static readonly HOLD: PaymentStatus = new PaymentStatus('HOLD');\n public static readonly PENDING_REFUND: PaymentStatus = new PaymentStatus('PENDING_REFUND');\n public static readonly REFUNDED: PaymentStatus = new PaymentStatus('REFUNDED');\n\n private constructor(status: string) {\n super(status);\n }\n\n protected validate(status: string): void {\n if (!PaymentStatus.SUPPORTED.includes(status)) {\n throw new InternalError(`Payment status <${status}> is not supported`);\n }\n }\n\n public get isDone(): boolean {\n return this.value === 'DONE';\n }\n public get isPending(): boolean {\n return this.value === 'PENDING';\n }\n public get isInProgress(): boolean {\n return this.value === 'IN_PROGRESS';\n }\n public get isFailed(): boolean {\n return this.value === 'FAILED';\n }\n public get isCanceled(): boolean {\n return this.value === 'CANCELED';\n }\n public get isHold(): boolean {\n return this.value === 'HOLD';\n }\n public get isPendingRefund(): boolean {\n return this.value === 'PENDING_REFUND';\n }\n public get isRefunded(): boolean {\n return this.value === 'REFUNDED';\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentStatus {\n return new PaymentStatus(gateway.trim().toUpperCase());\n }\n\n}\n","import {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {EventBusRepository} from \"@application/contracts/EventBusRepository\";\n\nexport class EventBus {\n\n private readonly repository: EventBusRepository;\n\n public constructor(repository: EventBusRepository) {\n this.repository = repository;\n }\n\n public async publish(event: DomainEvent): Promise<void> {\n await this.repository.create(event);\n }\n\n public async publishMany(events: DomainEvent[]): Promise<void> {\n for (let event of events) {\n await this.publish(event);\n }\n }\n\n}","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n\n public static readonly DEFAULT_POOL_SIZE: number = 20;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool = pool ?? createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async query(sql: string, params: any[] = []): Promise<any[]> {\n const [rows] = await this._pool.query<any[]>(sql, params);\n return rows;\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n await this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\nfunction hasHeader(headers: HttpResponse['headers'] | undefined, name: string): boolean {\n if (!headers) return false;\n const lname = name.toLowerCase();\n return Object.keys(headers).some(h => h.toLowerCase() === lname);\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n if (headers) res.set(headers as any);\n\n // 1) Streams\n if (isReadableStream(body)) {\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n // 2) Binarios (Buffer / ArrayBuffer / TypedArray)\n const isArrayBuffer = typeof body === 'object' && body instanceof ArrayBuffer;\n const isArrayBufferView = typeof body === 'object' && body != null && ArrayBuffer.isView(body as any);\n\n if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {\n let buf: Buffer;\n if (Buffer.isBuffer(body)) {\n buf = body as Buffer;\n } else if (isArrayBuffer) {\n buf = Buffer.from(body as ArrayBuffer);\n } else {\n const view = body as ArrayBufferView;\n buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n if (!res.getHeader('Content-Length')) res.set('Content-Length', String(buf.length));\n\n res.status(statusCode);\n res.end(buf);\n return;\n }\n\n // 3) String o Content-Type custom → send()\n const hasCT = hasHeader(headers, 'Content-Type');\n if (typeof body === 'string' || hasCT) {\n res.status(statusCode).send(body as any);\n return;\n }\n // 4) Default: JSON\n res.status(statusCode).json(body ?? {});\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {EventBusRepository} from \"@application/contracts/EventBusRepository\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {DatabaseConnection} from \"@infrastructure/contracts/Database\";\n\nexport class EventBusMysqlRepository implements EventBusRepository {\n\n private readonly connection: DatabaseConnection;\n\n public constructor(connection: DatabaseConnection) {\n this.connection = connection;\n }\n\n private eventToRowValues(e: DomainEvent): any[] {\n return [\n e.eventUuid.value, e.eventType, e.tenantUuid.value, e.aggregateUuid.value, e.aggregateType, e.topic, e.payload, e.status.value, e.attempts,\n e.errorMessage, e.publishedAt?.value, e.lastAttempt?.value, e.createdAt.value\n ];\n }\n\n public async create(event: DomainEvent): Promise<void> {\n const values = this.eventToRowValues(event);\n await this.connection.query(\n `INSERT INTO events_outbox (event_uuid, event_type, tenant_uuid, aggregate_uuid, aggregate_type, topic, \n payload, status, attempts, error_message, published_at, last_attempt, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n values\n );\n }\n\n public async update(event: DomainEvent): Promise<void> {\n const values = [event.status.value, event.attempts, event.errorMessage, event.publishedAt?.value, event.lastAttempt?.value, event.eventUuid.value];\n await this.connection.query(\n `UPDATE events_outbox\n SET status = ?,\n attempts = ?,\n error_message = ?,\n published_at = ?,\n last_attempt = ?\n WHERE event_uuid = ?`,\n values\n );\n }\n\n public async listPending(limit: number): Promise<DomainEvent[]> {\n const result = await this.connection.query(\n `SELECT * FROM events_outbox WHERE published_at IS NULL LIMIT 50`,\n []\n );\n return result.length > 0 ? result.map(r => DomainEvent.reconstitute(r)) : [];\n }\n\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":["LuxonDateTime"]}
package/dist/index.d.mts CHANGED
@@ -78,10 +78,10 @@ declare class DomainEventStatus extends ValueObject<string> {
78
78
 
79
79
  declare class DomainEvent {
80
80
  private readonly _eventUuid;
81
+ private readonly _eventType;
81
82
  private readonly _tenantUuid;
82
83
  private readonly _aggregateUuid;
83
84
  private readonly _aggregateType;
84
- private readonly _eventType;
85
85
  private readonly _topic;
86
86
  private readonly _payload;
87
87
  private _status;
@@ -90,7 +90,7 @@ declare class DomainEvent {
90
90
  private _publishedAt;
91
91
  private _lastAttempt;
92
92
  private readonly _createdAt;
93
- protected constructor(eventUuid: UUID, tenantUuid: UUID, aggregateUuid: UUID, aggregateType: string, eventType: string, topic: string, payload: string, status: DomainEventStatus, attempts: number, errorMessage: string | undefined, publishedAt: DateTime | undefined, lastAttempt: DateTime | undefined, createdAt: DateTime);
93
+ protected constructor(eventUuid: UUID, eventType: string, tenantUuid: UUID, aggregateUuid: UUID, aggregateType: string, topic: string, payload: string, status: DomainEventStatus, attempts: number, errorMessage: string | undefined, publishedAt: DateTime | undefined, lastAttempt: DateTime | undefined, createdAt: DateTime);
94
94
  get eventUuid(): UUID;
95
95
  get tenantUuid(): UUID;
96
96
  get aggregateUuid(): UUID;
@@ -277,6 +277,7 @@ declare class PaymentStatus extends ValueObject<string> {
277
277
  static readonly FAILED: PaymentStatus;
278
278
  static readonly CANCELED: PaymentStatus;
279
279
  static readonly HOLD: PaymentStatus;
280
+ static readonly PENDING_REFUND: PaymentStatus;
280
281
  static readonly REFUNDED: PaymentStatus;
281
282
  private constructor();
282
283
  protected validate(status: string): void;
@@ -286,6 +287,7 @@ declare class PaymentStatus extends ValueObject<string> {
286
287
  get isFailed(): boolean;
287
288
  get isCanceled(): boolean;
288
289
  get isHold(): boolean;
290
+ get isPendingRefund(): boolean;
289
291
  get isRefunded(): boolean;
290
292
  toPrimitives(): Record<string, unknown>;
291
293
  static create(gateway: string): PaymentStatus;
@@ -430,7 +432,7 @@ declare function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequ
430
432
 
431
433
  declare class EventBusMysqlRepository implements EventBusRepository {
432
434
  private readonly connection;
433
- constructor(connection: MysqlConnection);
435
+ constructor(connection: DatabaseConnection);
434
436
  private eventToRowValues;
435
437
  create(event: DomainEvent): Promise<void>;
436
438
  update(event: DomainEvent): Promise<void>;
package/dist/index.d.ts CHANGED
@@ -78,10 +78,10 @@ declare class DomainEventStatus extends ValueObject<string> {
78
78
 
79
79
  declare class DomainEvent {
80
80
  private readonly _eventUuid;
81
+ private readonly _eventType;
81
82
  private readonly _tenantUuid;
82
83
  private readonly _aggregateUuid;
83
84
  private readonly _aggregateType;
84
- private readonly _eventType;
85
85
  private readonly _topic;
86
86
  private readonly _payload;
87
87
  private _status;
@@ -90,7 +90,7 @@ declare class DomainEvent {
90
90
  private _publishedAt;
91
91
  private _lastAttempt;
92
92
  private readonly _createdAt;
93
- protected constructor(eventUuid: UUID, tenantUuid: UUID, aggregateUuid: UUID, aggregateType: string, eventType: string, topic: string, payload: string, status: DomainEventStatus, attempts: number, errorMessage: string | undefined, publishedAt: DateTime | undefined, lastAttempt: DateTime | undefined, createdAt: DateTime);
93
+ protected constructor(eventUuid: UUID, eventType: string, tenantUuid: UUID, aggregateUuid: UUID, aggregateType: string, topic: string, payload: string, status: DomainEventStatus, attempts: number, errorMessage: string | undefined, publishedAt: DateTime | undefined, lastAttempt: DateTime | undefined, createdAt: DateTime);
94
94
  get eventUuid(): UUID;
95
95
  get tenantUuid(): UUID;
96
96
  get aggregateUuid(): UUID;
@@ -277,6 +277,7 @@ declare class PaymentStatus extends ValueObject<string> {
277
277
  static readonly FAILED: PaymentStatus;
278
278
  static readonly CANCELED: PaymentStatus;
279
279
  static readonly HOLD: PaymentStatus;
280
+ static readonly PENDING_REFUND: PaymentStatus;
280
281
  static readonly REFUNDED: PaymentStatus;
281
282
  private constructor();
282
283
  protected validate(status: string): void;
@@ -286,6 +287,7 @@ declare class PaymentStatus extends ValueObject<string> {
286
287
  get isFailed(): boolean;
287
288
  get isCanceled(): boolean;
288
289
  get isHold(): boolean;
290
+ get isPendingRefund(): boolean;
289
291
  get isRefunded(): boolean;
290
292
  toPrimitives(): Record<string, unknown>;
291
293
  static create(gateway: string): PaymentStatus;
@@ -430,7 +432,7 @@ declare function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequ
430
432
 
431
433
  declare class EventBusMysqlRepository implements EventBusRepository {
432
434
  private readonly connection;
433
- constructor(connection: MysqlConnection);
435
+ constructor(connection: DatabaseConnection);
434
436
  private eventToRowValues;
435
437
  create(event: DomainEvent): Promise<void>;
436
438
  update(event: DomainEvent): Promise<void>;
package/dist/index.js CHANGED
@@ -248,7 +248,7 @@ var DomainEventStatus = _DomainEventStatus;
248
248
 
249
249
  // src/domain/contracts/DomainEvent.ts
250
250
  var DomainEvent = class _DomainEvent {
251
- constructor(eventUuid, tenantUuid, aggregateUuid, aggregateType, eventType, topic, payload, status, attempts, errorMessage, publishedAt, lastAttempt, createdAt) {
251
+ constructor(eventUuid, eventType, tenantUuid, aggregateUuid, aggregateType, topic, payload, status, attempts, errorMessage, publishedAt, lastAttempt, createdAt) {
252
252
  this._eventUuid = eventUuid;
253
253
  this._tenantUuid = tenantUuid;
254
254
  this._aggregateUuid = aggregateUuid;
@@ -321,10 +321,10 @@ var DomainEvent = class _DomainEvent {
321
321
  var _a, _b, _c, _d, _e;
322
322
  return {
323
323
  eventUuid: this.eventUuid.value,
324
+ eventType: this.eventType,
324
325
  tenantUuid: this.tenantUuid.value,
325
326
  aggregateUuid: this.aggregateUuid.value,
326
327
  aggregateType: this.aggregateType,
327
- eventType: this.eventType,
328
328
  topic: this.topic,
329
329
  payload: this.payload,
330
330
  status: this.status.value,
@@ -339,10 +339,10 @@ var DomainEvent = class _DomainEvent {
339
339
  var _a;
340
340
  return new _DomainEvent(
341
341
  UUID.create(data.event_uuid),
342
+ String(data.event_type),
342
343
  UUID.create(data.tenant_uuid),
343
344
  UUID.create(data.aggregate_uuid),
344
345
  String(data.aggregate_type),
345
- String(data.event_type),
346
346
  String(data.topic),
347
347
  String(data.payload),
348
348
  DomainEventStatus.create(data.status),
@@ -785,6 +785,9 @@ var _PaymentStatus = class _PaymentStatus extends ValueObject {
785
785
  get isHold() {
786
786
  return this.value === "HOLD";
787
787
  }
788
+ get isPendingRefund() {
789
+ return this.value === "PENDING_REFUND";
790
+ }
788
791
  get isRefunded() {
789
792
  return this.value === "REFUNDED";
790
793
  }
@@ -795,13 +798,14 @@ var _PaymentStatus = class _PaymentStatus extends ValueObject {
795
798
  return new _PaymentStatus(gateway.trim().toUpperCase());
796
799
  }
797
800
  };
798
- _PaymentStatus.SUPPORTED = ["DONE", "PENDING", "FAILED", "CANCELED", "HOLD", "REFUNDED", "IN_PROGRESS"];
801
+ _PaymentStatus.SUPPORTED = ["DONE", "PENDING", "FAILED", "CANCELED", "HOLD", "PENDING_REFUND", "REFUNDED", "IN_PROGRESS"];
799
802
  _PaymentStatus.DONE = new _PaymentStatus("DONE");
800
803
  _PaymentStatus.PENDING = new _PaymentStatus("PENDING");
801
804
  _PaymentStatus.IN_PROGRESS = new _PaymentStatus("IN_PROGRESS");
802
805
  _PaymentStatus.FAILED = new _PaymentStatus("FAILED");
803
806
  _PaymentStatus.CANCELED = new _PaymentStatus("CANCELED");
804
807
  _PaymentStatus.HOLD = new _PaymentStatus("HOLD");
808
+ _PaymentStatus.PENDING_REFUND = new _PaymentStatus("PENDING_REFUND");
805
809
  _PaymentStatus.REFUNDED = new _PaymentStatus("REFUNDED");
806
810
  var PaymentStatus = _PaymentStatus;
807
811
 
@@ -1095,10 +1099,10 @@ var EventBusMysqlRepository = class {
1095
1099
  var _a, _b;
1096
1100
  return [
1097
1101
  e.eventUuid.value,
1102
+ e.eventType,
1098
1103
  e.tenantUuid.value,
1099
1104
  e.aggregateUuid.value,
1100
1105
  e.aggregateType,
1101
- e.eventType,
1102
1106
  e.topic,
1103
1107
  e.payload,
1104
1108
  e.status.value,
@@ -1112,7 +1116,7 @@ var EventBusMysqlRepository = class {
1112
1116
  async create(event) {
1113
1117
  const values = this.eventToRowValues(event);
1114
1118
  await this.connection.query(
1115
- `INSERT INTO events_outbox (event_uuid, tenant_uuid, aggregate_uuid, aggregate_type, event_type, topic,
1119
+ `INSERT INTO events_outbox (event_uuid, event_type, tenant_uuid, aggregate_uuid, aggregate_type, topic,
1116
1120
  payload, status, attempts, error_message, published_at, last_attempt, created_at)
1117
1121
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
1118
1122
  values
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/errors/InternalError.ts","../src/domain/value-objects/UUID.ts","../src/domain/value-objects/DomainEventStatus.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/payments/PaymentGateway.ts","../src/domain/value-objects/payments/PaymentStatus.ts","../src/application/event-bus/EventBus.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/infrastructure/event-bus/EventBusMysqlRepository.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n protected _events: DomainEvent[] = [];\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected recordEvent(event: DomainEvent): void {\n this._events.push(event);\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public pullEvents(): DomainEvent[] {\n const events = this._events;\n this._events = [];\n return events;\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import { ValueObject } from \"@domain/contracts/ValueObject\";\nimport { InternalError } from \"@domain/errors/InternalError\";\nimport * as crypto from \"node:crypto\";\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface UUIDValidationOptions {\n /** Versiones permitidas (por defecto: 1–8) */\n allowedVersions?: UUIDVersion[];\n /** Permitir el NIL UUID \"00000000-0000-0000-0000-000000000000\" (por defecto: false) */\n allowNil?: boolean;\n}\n\nexport class UUID extends ValueObject<string> {\n public static readonly NIL = \"00000000-0000-0000-0000-000000000000\";\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static version(uuid: string): UUIDVersion | undefined {\n const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);\n return m ? (Number(m[1]) as UUIDVersion) : undefined;\n }\n\n public static isNil(uuid: string): boolean {\n return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);\n }\n\n public static isRFCStyle(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n public static isValid(uuid: string, opts: UUIDValidationOptions = {}): boolean {\n const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];\n const allowNil = opts.allowNil ?? false;\n\n if (allowNil && UUID.isNil(uuid)) return true;\n if (!UUID.isRFCStyle(uuid)) return false;\n\n const v = UUID.version(uuid);\n return !!v && allowed.includes(v);\n }\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class DomainEventStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['PENDING', 'PROCESSING', 'PROCESSED', 'FAILED', 'DEAD'];\n\n public static readonly PENDING: DomainEventStatus = new DomainEventStatus('PENDING');\n public static readonly PROCESSING: DomainEventStatus = new DomainEventStatus('PROCESSING');\n public static readonly PROCESSED: DomainEventStatus = new DomainEventStatus('PROCESSED');\n public static readonly FAILED: DomainEventStatus = new DomainEventStatus('FAILED');\n public static readonly DEAD: DomainEventStatus = new DomainEventStatus('DEAD');\n\n private constructor(status: string) {\n super(status.trim().toUpperCase());\n }\n\n protected validate(value: string): void {\n if (!DomainEventStatus.SUPPORTED.includes(value)) {\n throw new InternalError(`Domain event status <${value}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return undefined;\n }\n\n public static create(status: string): DomainEventStatus {\n return new DomainEventStatus(status);\n }\n\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\nimport {UUID} from \"@domain/value-objects/UUID\";\nimport {DomainEventStatus} from \"@domain/value-objects/DomainEventStatus\";\n\nexport class DomainEvent {\n\n private readonly _eventUuid: UUID;\n private readonly _tenantUuid: UUID;\n private readonly _aggregateUuid: UUID;\n private readonly _aggregateType: string;\n private readonly _eventType: string;\n private readonly _topic: string;\n private readonly _payload: string;\n private _status: DomainEventStatus;\n private _attempts: number;\n private _errorMessage: string | undefined;\n private _publishedAt: DateTime | undefined;\n private _lastAttempt: DateTime | undefined;\n private readonly _createdAt: DateTime;\n\n protected constructor(\n eventUuid: UUID,\n tenantUuid: UUID,\n aggregateUuid: UUID,\n aggregateType: string,\n eventType: string,\n topic: string,\n payload: string,\n status: DomainEventStatus,\n attempts: number,\n errorMessage: string | undefined,\n publishedAt: DateTime | undefined,\n lastAttempt: DateTime | undefined,\n createdAt: DateTime\n ) {\n this._eventUuid = eventUuid;\n this._tenantUuid = tenantUuid;\n this._aggregateUuid = aggregateUuid;\n this._aggregateType = aggregateType;\n this._eventType = eventType;\n this._topic = topic;\n this._payload = payload;\n this._status = status;\n this._attempts = 0;\n this._errorMessage = errorMessage;\n this._publishedAt = publishedAt;\n this._lastAttempt = lastAttempt;\n this._createdAt = createdAt;\n }\n\n public get eventUuid(): UUID {\n return this._eventUuid;\n }\n public get tenantUuid(): UUID {\n return this._tenantUuid;\n }\n public get aggregateUuid(): UUID {\n return this._aggregateUuid;\n }\n public get aggregateType(): string {\n return this._aggregateType;\n }\n public get eventType(): string {\n return this._eventType;\n }\n public get topic(): string {\n return this._topic;\n }\n public get payload(): string {\n return this._payload;\n }\n public get status(): DomainEventStatus {\n return this._status;\n }\n public get attempts(): number {\n return this._attempts;\n }\n public get errorMessage(): string | undefined {\n return this._errorMessage;\n }\n public get publishedAt(): DateTime | undefined {\n return this._publishedAt;\n }\n public get lastAttempt(): DateTime | undefined {\n return this._lastAttempt;\n }\n public get createdAt(): DateTime {\n return this._createdAt;\n }\n\n public incrementAttempts(): void {\n this._attempts++;\n this._lastAttempt = DateTime.now();\n }\n public markProcessed(): void {\n this._status = DomainEventStatus.PROCESSED\n this._publishedAt = DateTime.now();\n }\n public markProcessing(): void {\n this._status = DomainEventStatus.PROCESSING;\n }\n public markWithError(error: string): void {\n this._status = DomainEventStatus.FAILED;\n this._errorMessage = error;\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n eventUuid: this.eventUuid.value,\n tenantUuid: this.tenantUuid.value,\n aggregateUuid: this.aggregateUuid.value,\n aggregateType: this.aggregateType,\n eventType: this.eventType,\n topic: this.topic,\n payload: this.payload,\n status: this.status.value,\n attempts: this.attempts,\n errorMessage: this.errorMessage ?? undefined,\n publishedAt: this.publishedAt?.value ?? undefined,\n lastAttempt: this.lastAttempt?.value ?? undefined,\n createdAt: this.createdAt.value\n }\n }\n\n public static reconstitute(data: Record<string, any>): DomainEvent {\n return new DomainEvent(\n UUID.create(data.event_uuid),\n UUID.create(data.tenant_uuid),\n UUID.create(data.aggregate_uuid),\n String(data.aggregate_type),\n String(data.event_type),\n String(data.topic),\n String(data.payload),\n DomainEventStatus.create(data.status),\n Number(data.attempts),\n data.error_message ?? undefined,\n data.published_at ? DateTime.create(data.published_at) : undefined,\n data.last_attempt ? DateTime.create(data.last_attempt) : undefined,\n data.created_at ? DateTime.create(data.created_at) : undefined\n )\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import {ValueObject} from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentGateway extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'MERCADOPAGO',\n 'HANDY',\n 'WONA_DEBIT',\n 'WONA_CARD',\n 'WONA_CASH',\n 'WONA_TRANSFER',\n 'WONA_MERCADOPAGO',\n ] as const;\n\n private static readonly EXTERNALS: readonly string[] = ['MERCADOPAGO', 'STRIPE'];\n\n public static readonly MERCADOPAGO: PaymentGateway = new PaymentGateway('MERCADOPAGO');\n public static readonly HANDY: PaymentGateway = new PaymentGateway('HANDY');\n public static readonly WONA_DEBIT: PaymentGateway = new PaymentGateway('WONA_DEBIT');\n public static readonly WONA_CARD: PaymentGateway = new PaymentGateway('WONA_CARD');\n public static readonly WONA_CASH: PaymentGateway = new PaymentGateway('WONA_CASH');\n public static readonly WONA_TRANSFER: PaymentGateway = new PaymentGateway('WONA_TRANSFER');\n public static readonly WONA_MERCADOPAGO: PaymentGateway = new PaymentGateway('WONA_MERCADOPAGO');\n\n private constructor(gateway: string) {\n super(gateway);\n }\n\n protected validate(value: string): void {\n if (!PaymentGateway.SUPPORTED.includes(value)) {\n throw new InternalError(`Payment gateway <${value}> is not supported`);\n }\n }\n\n public isExternal(): boolean {\n return PaymentGateway.EXTERNALS.includes(this.value);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentGateway {\n return new PaymentGateway(gateway.trim().toUpperCase());\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['DONE', 'PENDING', 'FAILED', 'CANCELED', 'HOLD', 'REFUNDED', 'IN_PROGRESS'] as const;\n\n public static readonly DONE: PaymentStatus = new PaymentStatus('DONE');\n public static readonly PENDING: PaymentStatus = new PaymentStatus('PENDING');\n public static readonly IN_PROGRESS: PaymentStatus = new PaymentStatus('IN_PROGRESS');\n public static readonly FAILED: PaymentStatus = new PaymentStatus('FAILED');\n public static readonly CANCELED: PaymentStatus = new PaymentStatus('CANCELED');\n public static readonly HOLD: PaymentStatus = new PaymentStatus('HOLD');\n public static readonly REFUNDED: PaymentStatus = new PaymentStatus('REFUNDED');\n\n private constructor(status: string) {\n super(status);\n }\n\n protected validate(status: string): void {\n if (!PaymentStatus.SUPPORTED.includes(status)) {\n throw new InternalError(`Payment status <${status}> is not supported`);\n }\n }\n\n public get isDone(): boolean {\n return this.value === 'DONE';\n }\n public get isPending(): boolean {\n return this.value === 'PENDING';\n }\n public get isInProgress(): boolean {\n return this.value === 'IN_PROGRESS';\n }\n public get isFailed(): boolean {\n return this.value === 'FAILED';\n }\n public get isCanceled(): boolean {\n return this.value === 'CANCELED';\n }\n public get isHold(): boolean {\n return this.value === 'HOLD';\n }\n public get isRefunded(): boolean {\n return this.value === 'REFUNDED';\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentStatus {\n return new PaymentStatus(gateway.trim().toUpperCase());\n }\n\n}\n","import {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {EventBusRepository} from \"@application/contracts/EventBusRepository\";\n\nexport class EventBus {\n\n private readonly repository: EventBusRepository;\n\n public constructor(repository: EventBusRepository) {\n this.repository = repository;\n }\n\n public async publish(event: DomainEvent): Promise<void> {\n await this.repository.create(event);\n }\n\n public async publishMany(events: DomainEvent[]): Promise<void> {\n for (let event of events) {\n await this.publish(event);\n }\n }\n\n}","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n\n public static readonly DEFAULT_POOL_SIZE: number = 20;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool = pool ?? createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async query(sql: string, params: any[] = []): Promise<any[]> {\n const [rows] = await this._pool.query<any[]>(sql, params);\n return rows;\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n await this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\nfunction hasHeader(headers: HttpResponse['headers'] | undefined, name: string): boolean {\n if (!headers) return false;\n const lname = name.toLowerCase();\n return Object.keys(headers).some(h => h.toLowerCase() === lname);\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n if (headers) res.set(headers as any);\n\n // 1) Streams\n if (isReadableStream(body)) {\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n // 2) Binarios (Buffer / ArrayBuffer / TypedArray)\n const isArrayBuffer = typeof body === 'object' && body instanceof ArrayBuffer;\n const isArrayBufferView = typeof body === 'object' && body != null && ArrayBuffer.isView(body as any);\n\n if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {\n let buf: Buffer;\n if (Buffer.isBuffer(body)) {\n buf = body as Buffer;\n } else if (isArrayBuffer) {\n buf = Buffer.from(body as ArrayBuffer);\n } else {\n const view = body as ArrayBufferView;\n buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n if (!res.getHeader('Content-Length')) res.set('Content-Length', String(buf.length));\n\n res.status(statusCode);\n res.end(buf);\n return;\n }\n\n // 3) String o Content-Type custom → send()\n const hasCT = hasHeader(headers, 'Content-Type');\n if (typeof body === 'string' || hasCT) {\n res.status(statusCode).send(body as any);\n return;\n }\n // 4) Default: JSON\n res.status(statusCode).json(body ?? {});\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {EventBusRepository} from \"@application/contracts/EventBusRepository\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {MysqlConnection} from \"@infrastructure/mysql/Mysql\";\n\nexport class EventBusMysqlRepository implements EventBusRepository {\n\n private readonly connection: MysqlConnection;\n\n public constructor(connection: MysqlConnection) {\n this.connection = connection;\n }\n\n private eventToRowValues(e: DomainEvent): any[] {\n return [\n e.eventUuid.value, e.tenantUuid.value, e.aggregateUuid.value, e.aggregateType, e.eventType, e.topic, e.payload, e.status.value, e.attempts,\n e.errorMessage, e.publishedAt?.value, e.lastAttempt?.value, e.createdAt.value\n ];\n }\n\n public async create(event: DomainEvent): Promise<void> {\n const values = this.eventToRowValues(event);\n await this.connection.query(\n `INSERT INTO events_outbox (event_uuid, tenant_uuid, aggregate_uuid, aggregate_type, event_type, topic, \n payload, status, attempts, error_message, published_at, last_attempt, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n values\n );\n }\n\n public async update(event: DomainEvent): Promise<void> {\n const values = [event.status.value, event.attempts, event.errorMessage, event.publishedAt?.value, event.lastAttempt?.value, event.eventUuid.value];\n await this.connection.query(\n `UPDATE events_outbox\n SET status = ?,\n attempts = ?,\n error_message = ?,\n published_at = ?,\n last_attempt = ?\n WHERE event_uuid = ?`,\n values\n );\n }\n\n public async listPending(limit: number): Promise<DomainEvent[]> {\n const result = await this.connection.query(\n `SELECT * FROM events_outbox WHERE published_at IS NULL LIMIT 50`,\n []\n );\n return result.length > 0 ? result.map(r => DomainEvent.reconstitute(r)) : [];\n }\n\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/errors/InternalError.ts","../src/domain/value-objects/UUID.ts","../src/domain/value-objects/DomainEventStatus.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/payments/PaymentGateway.ts","../src/domain/value-objects/payments/PaymentStatus.ts","../src/application/event-bus/EventBus.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/infrastructure/event-bus/EventBusMysqlRepository.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n protected _events: DomainEvent[] = [];\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected recordEvent(event: DomainEvent): void {\n this._events.push(event);\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public pullEvents(): DomainEvent[] {\n const events = this._events;\n this._events = [];\n return events;\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import { ValueObject } from \"@domain/contracts/ValueObject\";\nimport { InternalError } from \"@domain/errors/InternalError\";\nimport * as crypto from \"node:crypto\";\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface UUIDValidationOptions {\n /** Versiones permitidas (por defecto: 1–8) */\n allowedVersions?: UUIDVersion[];\n /** Permitir el NIL UUID \"00000000-0000-0000-0000-000000000000\" (por defecto: false) */\n allowNil?: boolean;\n}\n\nexport class UUID extends ValueObject<string> {\n public static readonly NIL = \"00000000-0000-0000-0000-000000000000\";\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static version(uuid: string): UUIDVersion | undefined {\n const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);\n return m ? (Number(m[1]) as UUIDVersion) : undefined;\n }\n\n public static isNil(uuid: string): boolean {\n return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);\n }\n\n public static isRFCStyle(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n public static isValid(uuid: string, opts: UUIDValidationOptions = {}): boolean {\n const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];\n const allowNil = opts.allowNil ?? false;\n\n if (allowNil && UUID.isNil(uuid)) return true;\n if (!UUID.isRFCStyle(uuid)) return false;\n\n const v = UUID.version(uuid);\n return !!v && allowed.includes(v);\n }\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class DomainEventStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['PENDING', 'PROCESSING', 'PROCESSED', 'FAILED', 'DEAD'];\n\n public static readonly PENDING: DomainEventStatus = new DomainEventStatus('PENDING');\n public static readonly PROCESSING: DomainEventStatus = new DomainEventStatus('PROCESSING');\n public static readonly PROCESSED: DomainEventStatus = new DomainEventStatus('PROCESSED');\n public static readonly FAILED: DomainEventStatus = new DomainEventStatus('FAILED');\n public static readonly DEAD: DomainEventStatus = new DomainEventStatus('DEAD');\n\n private constructor(status: string) {\n super(status.trim().toUpperCase());\n }\n\n protected validate(value: string): void {\n if (!DomainEventStatus.SUPPORTED.includes(value)) {\n throw new InternalError(`Domain event status <${value}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return undefined;\n }\n\n public static create(status: string): DomainEventStatus {\n return new DomainEventStatus(status);\n }\n\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\nimport {UUID} from \"@domain/value-objects/UUID\";\nimport {DomainEventStatus} from \"@domain/value-objects/DomainEventStatus\";\n\nexport class DomainEvent {\n\n private readonly _eventUuid: UUID;\n private readonly _eventType: string;\n private readonly _tenantUuid: UUID;\n private readonly _aggregateUuid: UUID;\n private readonly _aggregateType: string;\n private readonly _topic: string;\n private readonly _payload: string;\n private _status: DomainEventStatus;\n private _attempts: number;\n private _errorMessage: string | undefined;\n private _publishedAt: DateTime | undefined;\n private _lastAttempt: DateTime | undefined;\n private readonly _createdAt: DateTime;\n\n protected constructor(\n eventUuid: UUID,\n eventType: string,\n tenantUuid: UUID,\n aggregateUuid: UUID,\n aggregateType: string,\n topic: string,\n payload: string,\n status: DomainEventStatus,\n attempts: number,\n errorMessage: string | undefined,\n publishedAt: DateTime | undefined,\n lastAttempt: DateTime | undefined,\n createdAt: DateTime\n ) {\n this._eventUuid = eventUuid;\n this._tenantUuid = tenantUuid;\n this._aggregateUuid = aggregateUuid;\n this._aggregateType = aggregateType;\n this._eventType = eventType;\n this._topic = topic;\n this._payload = payload;\n this._status = status;\n this._attempts = 0;\n this._errorMessage = errorMessage;\n this._publishedAt = publishedAt;\n this._lastAttempt = lastAttempt;\n this._createdAt = createdAt;\n }\n\n public get eventUuid(): UUID {\n return this._eventUuid;\n }\n public get tenantUuid(): UUID {\n return this._tenantUuid;\n }\n public get aggregateUuid(): UUID {\n return this._aggregateUuid;\n }\n public get aggregateType(): string {\n return this._aggregateType;\n }\n public get eventType(): string {\n return this._eventType;\n }\n public get topic(): string {\n return this._topic;\n }\n public get payload(): string {\n return this._payload;\n }\n public get status(): DomainEventStatus {\n return this._status;\n }\n public get attempts(): number {\n return this._attempts;\n }\n public get errorMessage(): string | undefined {\n return this._errorMessage;\n }\n public get publishedAt(): DateTime | undefined {\n return this._publishedAt;\n }\n public get lastAttempt(): DateTime | undefined {\n return this._lastAttempt;\n }\n public get createdAt(): DateTime {\n return this._createdAt;\n }\n\n public incrementAttempts(): void {\n this._attempts++;\n this._lastAttempt = DateTime.now();\n }\n public markProcessed(): void {\n this._status = DomainEventStatus.PROCESSED\n this._publishedAt = DateTime.now();\n }\n public markProcessing(): void {\n this._status = DomainEventStatus.PROCESSING;\n }\n public markWithError(error: string): void {\n this._status = DomainEventStatus.FAILED;\n this._errorMessage = error;\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n eventUuid: this.eventUuid.value,\n eventType: this.eventType,\n tenantUuid: this.tenantUuid.value,\n aggregateUuid: this.aggregateUuid.value,\n aggregateType: this.aggregateType,\n topic: this.topic,\n payload: this.payload,\n status: this.status.value,\n attempts: this.attempts,\n errorMessage: this.errorMessage ?? undefined,\n publishedAt: this.publishedAt?.value ?? undefined,\n lastAttempt: this.lastAttempt?.value ?? undefined,\n createdAt: this.createdAt.value\n }\n }\n\n public static reconstitute(data: Record<string, any>): DomainEvent {\n return new DomainEvent(\n UUID.create(data.event_uuid),\n String(data.event_type),\n UUID.create(data.tenant_uuid),\n UUID.create(data.aggregate_uuid),\n String(data.aggregate_type),\n String(data.topic),\n String(data.payload),\n DomainEventStatus.create(data.status),\n Number(data.attempts),\n data.error_message ?? undefined,\n data.published_at ? DateTime.create(data.published_at) : undefined,\n data.last_attempt ? DateTime.create(data.last_attempt) : undefined,\n data.created_at ? DateTime.create(data.created_at) : undefined\n )\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import {ValueObject} from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentGateway extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'MERCADOPAGO',\n 'HANDY',\n 'WONA_DEBIT',\n 'WONA_CARD',\n 'WONA_CASH',\n 'WONA_TRANSFER',\n 'WONA_MERCADOPAGO',\n ] as const;\n\n private static readonly EXTERNALS: readonly string[] = ['MERCADOPAGO', 'STRIPE'];\n\n public static readonly MERCADOPAGO: PaymentGateway = new PaymentGateway('MERCADOPAGO');\n public static readonly HANDY: PaymentGateway = new PaymentGateway('HANDY');\n public static readonly WONA_DEBIT: PaymentGateway = new PaymentGateway('WONA_DEBIT');\n public static readonly WONA_CARD: PaymentGateway = new PaymentGateway('WONA_CARD');\n public static readonly WONA_CASH: PaymentGateway = new PaymentGateway('WONA_CASH');\n public static readonly WONA_TRANSFER: PaymentGateway = new PaymentGateway('WONA_TRANSFER');\n public static readonly WONA_MERCADOPAGO: PaymentGateway = new PaymentGateway('WONA_MERCADOPAGO');\n\n private constructor(gateway: string) {\n super(gateway);\n }\n\n protected validate(value: string): void {\n if (!PaymentGateway.SUPPORTED.includes(value)) {\n throw new InternalError(`Payment gateway <${value}> is not supported`);\n }\n }\n\n public isExternal(): boolean {\n return PaymentGateway.EXTERNALS.includes(this.value);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentGateway {\n return new PaymentGateway(gateway.trim().toUpperCase());\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class PaymentStatus extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = ['DONE', 'PENDING', 'FAILED', 'CANCELED', 'HOLD', 'PENDING_REFUND', 'REFUNDED', 'IN_PROGRESS'] as const;\n\n public static readonly DONE: PaymentStatus = new PaymentStatus('DONE');\n public static readonly PENDING: PaymentStatus = new PaymentStatus('PENDING');\n public static readonly IN_PROGRESS: PaymentStatus = new PaymentStatus('IN_PROGRESS');\n public static readonly FAILED: PaymentStatus = new PaymentStatus('FAILED');\n public static readonly CANCELED: PaymentStatus = new PaymentStatus('CANCELED');\n public static readonly HOLD: PaymentStatus = new PaymentStatus('HOLD');\n public static readonly PENDING_REFUND: PaymentStatus = new PaymentStatus('PENDING_REFUND');\n public static readonly REFUNDED: PaymentStatus = new PaymentStatus('REFUNDED');\n\n private constructor(status: string) {\n super(status);\n }\n\n protected validate(status: string): void {\n if (!PaymentStatus.SUPPORTED.includes(status)) {\n throw new InternalError(`Payment status <${status}> is not supported`);\n }\n }\n\n public get isDone(): boolean {\n return this.value === 'DONE';\n }\n public get isPending(): boolean {\n return this.value === 'PENDING';\n }\n public get isInProgress(): boolean {\n return this.value === 'IN_PROGRESS';\n }\n public get isFailed(): boolean {\n return this.value === 'FAILED';\n }\n public get isCanceled(): boolean {\n return this.value === 'CANCELED';\n }\n public get isHold(): boolean {\n return this.value === 'HOLD';\n }\n public get isPendingRefund(): boolean {\n return this.value === 'PENDING_REFUND';\n }\n public get isRefunded(): boolean {\n return this.value === 'REFUNDED';\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(gateway: string): PaymentStatus {\n return new PaymentStatus(gateway.trim().toUpperCase());\n }\n\n}\n","import {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {EventBusRepository} from \"@application/contracts/EventBusRepository\";\n\nexport class EventBus {\n\n private readonly repository: EventBusRepository;\n\n public constructor(repository: EventBusRepository) {\n this.repository = repository;\n }\n\n public async publish(event: DomainEvent): Promise<void> {\n await this.repository.create(event);\n }\n\n public async publishMany(events: DomainEvent[]): Promise<void> {\n for (let event of events) {\n await this.publish(event);\n }\n }\n\n}","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n\n public static readonly DEFAULT_POOL_SIZE: number = 20;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool = pool ?? createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async query(sql: string, params: any[] = []): Promise<any[]> {\n const [rows] = await this._pool.query<any[]>(sql, params);\n return rows;\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n await this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\nfunction hasHeader(headers: HttpResponse['headers'] | undefined, name: string): boolean {\n if (!headers) return false;\n const lname = name.toLowerCase();\n return Object.keys(headers).some(h => h.toLowerCase() === lname);\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n if (headers) res.set(headers as any);\n\n // 1) Streams\n if (isReadableStream(body)) {\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n // 2) Binarios (Buffer / ArrayBuffer / TypedArray)\n const isArrayBuffer = typeof body === 'object' && body instanceof ArrayBuffer;\n const isArrayBufferView = typeof body === 'object' && body != null && ArrayBuffer.isView(body as any);\n\n if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {\n let buf: Buffer;\n if (Buffer.isBuffer(body)) {\n buf = body as Buffer;\n } else if (isArrayBuffer) {\n buf = Buffer.from(body as ArrayBuffer);\n } else {\n const view = body as ArrayBufferView;\n buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n if (!res.getHeader('Content-Length')) res.set('Content-Length', String(buf.length));\n\n res.status(statusCode);\n res.end(buf);\n return;\n }\n\n // 3) String o Content-Type custom → send()\n const hasCT = hasHeader(headers, 'Content-Type');\n if (typeof body === 'string' || hasCT) {\n res.status(statusCode).send(body as any);\n return;\n }\n // 4) Default: JSON\n res.status(statusCode).json(body ?? {});\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {EventBusRepository} from \"@application/contracts/EventBusRepository\";\nimport {DomainEvent} from \"@domain/contracts/DomainEvent\";\nimport {DatabaseConnection} from \"@infrastructure/contracts/Database\";\n\nexport class EventBusMysqlRepository implements EventBusRepository {\n\n private readonly connection: DatabaseConnection;\n\n public constructor(connection: DatabaseConnection) {\n this.connection = connection;\n }\n\n private eventToRowValues(e: DomainEvent): any[] {\n return [\n e.eventUuid.value, e.eventType, e.tenantUuid.value, e.aggregateUuid.value, e.aggregateType, e.topic, e.payload, e.status.value, e.attempts,\n e.errorMessage, e.publishedAt?.value, e.lastAttempt?.value, e.createdAt.value\n ];\n }\n\n public async create(event: DomainEvent): Promise<void> {\n const values = this.eventToRowValues(event);\n await this.connection.query(\n `INSERT INTO events_outbox (event_uuid, event_type, tenant_uuid, aggregate_uuid, aggregate_type, topic, \n payload, status, attempts, error_message, published_at, last_attempt, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n values\n );\n }\n\n public async update(event: DomainEvent): Promise<void> {\n const values = [event.status.value, event.attempts, event.errorMessage, event.publishedAt?.value, event.lastAttempt?.value, event.eventUuid.value];\n await this.connection.query(\n `UPDATE events_outbox\n SET status = ?,\n attempts = ?,\n error_message = ?,\n published_at = ?,\n last_attempt = ?\n WHERE event_uuid = ?`,\n values\n );\n }\n\n public async listPending(limit: number): Promise<DomainEvent[]> {\n const result = await this.connection.query(\n `SELECT * FROM events_outbox WHERE published_at IS NULL LIMIT 50`,\n []\n );\n return result.length > 0 ? result.map(r => DomainEvent.reconstitute(r)) : [];\n }\n\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wsp-ms-core",
3
3
  "author": "Wonasports",
4
- "version": "1.0.66",
4
+ "version": "1.0.68",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/index.d.ts",