wsp-ms-core 1.0.36 → 1.0.37
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 +167 -121
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +30 -18
- package/dist/index.d.ts +30 -18
- package/dist/index.js +167 -121
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -7,6 +7,9 @@ var ValueObject = class {
|
|
|
7
7
|
this.validate(value);
|
|
8
8
|
this._value = Object.freeze(value);
|
|
9
9
|
}
|
|
10
|
+
toProps() {
|
|
11
|
+
return this._value;
|
|
12
|
+
}
|
|
10
13
|
get value() {
|
|
11
14
|
return this._value;
|
|
12
15
|
}
|
|
@@ -100,6 +103,11 @@ var _DateTime = class _DateTime extends ValueObject {
|
|
|
100
103
|
getWeekdayName(locale = "en") {
|
|
101
104
|
return this._dt.setLocale(locale).toFormat("cccc");
|
|
102
105
|
}
|
|
106
|
+
toPrimitives() {
|
|
107
|
+
return {
|
|
108
|
+
value: this.value
|
|
109
|
+
};
|
|
110
|
+
}
|
|
103
111
|
static create(input) {
|
|
104
112
|
if (input === void 0) {
|
|
105
113
|
return new _DateTime(_DateTime.toUtcFormat(LuxonDateTime.now()));
|
|
@@ -206,6 +214,11 @@ var _Currency = class _Currency extends ValueObject {
|
|
|
206
214
|
throw new Error(`Currency <${code}> is not supported`);
|
|
207
215
|
}
|
|
208
216
|
}
|
|
217
|
+
toPrimitives() {
|
|
218
|
+
return {
|
|
219
|
+
value: this.value
|
|
220
|
+
};
|
|
221
|
+
}
|
|
209
222
|
static create(raw) {
|
|
210
223
|
if (typeof raw === "number" || _Currency.NUM_REGEX.test(raw)) {
|
|
211
224
|
const num = Number(raw);
|
|
@@ -259,6 +272,11 @@ var _Email = class _Email extends ValueObject {
|
|
|
259
272
|
throw new Error(`Email <${value}> is not a valid address`);
|
|
260
273
|
}
|
|
261
274
|
}
|
|
275
|
+
toPrimitives() {
|
|
276
|
+
return {
|
|
277
|
+
value: this.value
|
|
278
|
+
};
|
|
279
|
+
}
|
|
262
280
|
static create(raw) {
|
|
263
281
|
return new _Email(raw);
|
|
264
282
|
}
|
|
@@ -276,12 +294,18 @@ var _Language = class _Language extends ValueObject {
|
|
|
276
294
|
}
|
|
277
295
|
validate(value) {
|
|
278
296
|
if (!_Language.SUPPORTED.includes(value)) {
|
|
279
|
-
throw new
|
|
297
|
+
throw new InternalError(`Language <${value}> is not supported`);
|
|
280
298
|
}
|
|
281
299
|
}
|
|
282
300
|
base() {
|
|
283
301
|
return this.value.split("-")[0];
|
|
284
302
|
}
|
|
303
|
+
toPrimitives() {
|
|
304
|
+
return {
|
|
305
|
+
base: this.base(),
|
|
306
|
+
value: this.value
|
|
307
|
+
};
|
|
308
|
+
}
|
|
285
309
|
static create(raw) {
|
|
286
310
|
const normalized = raw.trim().toLowerCase().replace("_", "-");
|
|
287
311
|
try {
|
|
@@ -361,47 +385,144 @@ _Language.SPANISH_NICARAGUA = new _Language("es-ni");
|
|
|
361
385
|
_Language.SPANISH_PUERTO_RICO = new _Language("es-pr");
|
|
362
386
|
var Language = _Language;
|
|
363
387
|
|
|
388
|
+
// src/utils/StringVars.ts
|
|
389
|
+
var StringVars = class {
|
|
390
|
+
static parse(str, ob) {
|
|
391
|
+
const regex = /{{(.*?)}}/g;
|
|
392
|
+
return str.replace(regex, (match, variable) => {
|
|
393
|
+
if (ob.hasOwnProperty(variable.trim())) {
|
|
394
|
+
return ob[variable.trim()];
|
|
395
|
+
} else {
|
|
396
|
+
return match;
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
// src/infrastructure/errors/ErrorManager.ts
|
|
403
|
+
var _ErrorManager = class _ErrorManager {
|
|
404
|
+
constructor(logger = null) {
|
|
405
|
+
this.logger = logger;
|
|
406
|
+
}
|
|
407
|
+
getDefaultMessage(lang) {
|
|
408
|
+
return _ErrorManager.DEFAULT_MESSAGES[lang.value] || _ErrorManager.DEFAULT_MESSAGES[lang.base()] || "error";
|
|
409
|
+
}
|
|
410
|
+
onFatal(err, lang) {
|
|
411
|
+
var _a;
|
|
412
|
+
(_a = this.logger) == null ? void 0 : _a.fatal(err.type, err.message);
|
|
413
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
414
|
+
}
|
|
415
|
+
onInternal(err, lang) {
|
|
416
|
+
var _a;
|
|
417
|
+
(_a = this.logger) == null ? void 0 : _a.error(err.type, err.message);
|
|
418
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
419
|
+
}
|
|
420
|
+
onUsage(err, lang) {
|
|
421
|
+
var _a, _b, _c;
|
|
422
|
+
const tmpl = _ErrorManager.TEMPLATES.get(err.type);
|
|
423
|
+
if (!tmpl) {
|
|
424
|
+
(_a = this.logger) == null ? void 0 : _a.error("TEMPLATE_NOT_FOUND", `${err.type}`);
|
|
425
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
426
|
+
}
|
|
427
|
+
const code = lang.value;
|
|
428
|
+
const base = lang.base();
|
|
429
|
+
const rawMsg = (_c = (_b = tmpl.languages[code]) != null ? _b : tmpl.languages[base]) != null ? _c : this.getDefaultMessage(lang);
|
|
430
|
+
return {
|
|
431
|
+
status: "ERROR",
|
|
432
|
+
message: StringVars.parse(rawMsg, err.vars)
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
onUnknown(err, lang) {
|
|
436
|
+
var _a;
|
|
437
|
+
(_a = this.logger) == null ? void 0 : _a.error("UNKNOWN_ERROR", err.message);
|
|
438
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
439
|
+
}
|
|
440
|
+
handle(err, lang) {
|
|
441
|
+
var _a;
|
|
442
|
+
if (["local", "dev"].includes((_a = process.env.ENVIRONMENT) != null ? _a : "")) {
|
|
443
|
+
console.log(err);
|
|
444
|
+
}
|
|
445
|
+
if (err instanceof FatalError) {
|
|
446
|
+
return this.onFatal(err, lang);
|
|
447
|
+
}
|
|
448
|
+
if (err instanceof InternalError) {
|
|
449
|
+
return this.onInternal(err, lang);
|
|
450
|
+
}
|
|
451
|
+
if (err instanceof UsageError) {
|
|
452
|
+
return this.onUsage(err, lang);
|
|
453
|
+
}
|
|
454
|
+
return this.onUnknown(err, lang);
|
|
455
|
+
}
|
|
456
|
+
static addTemplate(template) {
|
|
457
|
+
_ErrorManager.TEMPLATES.set(template.type, template);
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
_ErrorManager.DEFAULT_MESSAGES = {
|
|
461
|
+
"es": "Ups, hemos encontrado un error. Nuestro equipo ya est\xE1 trabajando para solucionarlo",
|
|
462
|
+
"en": "Ups, we found an error. Our team is working on it.",
|
|
463
|
+
"pt": "Ops, encontramos um bug. Nossa equipe j\xE1 est\xE1 trabalhando para resolver isso."
|
|
464
|
+
};
|
|
465
|
+
_ErrorManager.APP_ERRORS = {
|
|
466
|
+
UNDEFINED: "UNDEFINED_ERROR",
|
|
467
|
+
PROCESS: "PROCESS_ERROR",
|
|
468
|
+
DATABASE: "DATABASE_ERROR"
|
|
469
|
+
};
|
|
470
|
+
_ErrorManager.TEMPLATES = /* @__PURE__ */ new Map();
|
|
471
|
+
var ErrorManager = _ErrorManager;
|
|
472
|
+
|
|
364
473
|
// src/domain/value-objects/Price.ts
|
|
474
|
+
ErrorManager.addTemplate({
|
|
475
|
+
type: "INVALID_PRICE_AMOUNT",
|
|
476
|
+
languages: {
|
|
477
|
+
"es": "El precio <{{amount}}> no es v\xE1lido",
|
|
478
|
+
"en": "Price amount <{{amount}}> is not a valid number"
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
ErrorManager.addTemplate({
|
|
482
|
+
type: "INVALID_PRICE_RANGE",
|
|
483
|
+
languages: {
|
|
484
|
+
"es": "El precio <{{amount}}> debe ser \u2265 {{min}} y \u2264 {{max}}",
|
|
485
|
+
"en": "Price amount <{{amount}}> must be \u2265 {{min}} and \u2264 {{max}}"
|
|
486
|
+
}
|
|
487
|
+
});
|
|
365
488
|
var _Price = class _Price extends ValueObject {
|
|
366
489
|
constructor(amount, currency) {
|
|
367
490
|
super({ amount, currency });
|
|
368
|
-
this._amount = amount;
|
|
369
|
-
this._currency = currency;
|
|
370
491
|
}
|
|
371
492
|
validate(props) {
|
|
372
493
|
const { amount, currency } = props;
|
|
373
494
|
if (typeof amount !== "number" || Number.isNaN(amount) || !Number.isFinite(amount)) {
|
|
374
|
-
throw new
|
|
495
|
+
throw new UsageError("INVALID_PRICE_AMOUNT", { amount });
|
|
375
496
|
}
|
|
376
|
-
if (amount < _Price.MIN_AMOUNT) {
|
|
377
|
-
throw new
|
|
497
|
+
if (amount < _Price.MIN_AMOUNT || amount > _Price.MAX_AMOUNT) {
|
|
498
|
+
throw new UsageError("INVALID_PRICE_RANGE", { amount, min: _Price.MIN_AMOUNT, max: _Price.MAX_AMOUNT });
|
|
378
499
|
}
|
|
379
500
|
}
|
|
380
501
|
get amount() {
|
|
381
|
-
return this.
|
|
502
|
+
return this._value.amount;
|
|
382
503
|
}
|
|
383
504
|
get currency() {
|
|
384
|
-
return this.
|
|
505
|
+
return this._value.currency;
|
|
385
506
|
}
|
|
386
507
|
equals(other) {
|
|
387
508
|
if (!other)
|
|
388
509
|
return false;
|
|
389
|
-
return this.
|
|
510
|
+
return this._value.amount === other.amount && this.currency.equals(other.currency);
|
|
390
511
|
}
|
|
391
512
|
assertSameCurrency(other) {
|
|
392
|
-
if (!this.
|
|
513
|
+
if (!this.currency.equals(other.currency)) {
|
|
393
514
|
throw new Error("Cannot operate on Price objects with different currencies");
|
|
394
515
|
}
|
|
395
516
|
}
|
|
396
517
|
add(other) {
|
|
397
518
|
this.assertSameCurrency(other);
|
|
398
|
-
return _Price.create(this.
|
|
519
|
+
return _Price.create(this.amount + other.amount, this.currency);
|
|
399
520
|
}
|
|
400
521
|
subtract(other) {
|
|
401
522
|
this.assertSameCurrency(other);
|
|
402
|
-
return _Price.create(this.
|
|
523
|
+
return _Price.create(this.amount - other.amount, this.currency);
|
|
403
524
|
}
|
|
404
|
-
|
|
525
|
+
toPrimitives() {
|
|
405
526
|
return {
|
|
406
527
|
amount: this.amount,
|
|
407
528
|
currency: this.currency.value
|
|
@@ -413,6 +534,7 @@ var _Price = class _Price extends ValueObject {
|
|
|
413
534
|
}
|
|
414
535
|
};
|
|
415
536
|
_Price.MIN_AMOUNT = -1e6;
|
|
537
|
+
_Price.MAX_AMOUNT = 1e9;
|
|
416
538
|
var Price = _Price;
|
|
417
539
|
|
|
418
540
|
// src/domain/value-objects/UUID.ts
|
|
@@ -422,9 +544,14 @@ var UUID = class _UUID extends ValueObject {
|
|
|
422
544
|
}
|
|
423
545
|
validate(uuid) {
|
|
424
546
|
if (!_UUID.isValid(uuid)) {
|
|
425
|
-
throw new
|
|
547
|
+
throw new InternalError(`Invalid uuid <${uuid}>`);
|
|
426
548
|
}
|
|
427
549
|
}
|
|
550
|
+
toPrimitives() {
|
|
551
|
+
return {
|
|
552
|
+
value: this.value
|
|
553
|
+
};
|
|
554
|
+
}
|
|
428
555
|
static create(uuid) {
|
|
429
556
|
return new _UUID(uuid != null ? uuid : crypto.randomUUID());
|
|
430
557
|
}
|
|
@@ -464,91 +591,6 @@ var BasicUnitOfWorkFactory = class {
|
|
|
464
591
|
}
|
|
465
592
|
};
|
|
466
593
|
|
|
467
|
-
// src/utils/StringVars.ts
|
|
468
|
-
var StringVars = class {
|
|
469
|
-
static parse(str, ob) {
|
|
470
|
-
const regex = /{{(.*?)}}/g;
|
|
471
|
-
return str.replace(regex, (match, variable) => {
|
|
472
|
-
if (ob.hasOwnProperty(variable.trim())) {
|
|
473
|
-
return ob[variable.trim()];
|
|
474
|
-
} else {
|
|
475
|
-
return match;
|
|
476
|
-
}
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
};
|
|
480
|
-
|
|
481
|
-
// src/infrastructure/errors/ErrorManager.ts
|
|
482
|
-
var _ErrorManager = class _ErrorManager {
|
|
483
|
-
constructor(logger = null) {
|
|
484
|
-
this.logger = logger;
|
|
485
|
-
}
|
|
486
|
-
getDefaultMessage(lang) {
|
|
487
|
-
return _ErrorManager.DEFAULT_MESSAGES[lang.value] || _ErrorManager.DEFAULT_MESSAGES[lang.base()] || "error";
|
|
488
|
-
}
|
|
489
|
-
onFatal(err, lang) {
|
|
490
|
-
var _a;
|
|
491
|
-
(_a = this.logger) == null ? void 0 : _a.fatal(err.type, err.message);
|
|
492
|
-
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
493
|
-
}
|
|
494
|
-
onInternal(err, lang) {
|
|
495
|
-
var _a;
|
|
496
|
-
(_a = this.logger) == null ? void 0 : _a.error(err.type, err.message);
|
|
497
|
-
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
498
|
-
}
|
|
499
|
-
onUsage(err, lang) {
|
|
500
|
-
var _a, _b, _c;
|
|
501
|
-
const tmpl = _ErrorManager.TEMPLATES.get(err.type);
|
|
502
|
-
if (!tmpl) {
|
|
503
|
-
(_a = this.logger) == null ? void 0 : _a.error("TEMPLATE_NOT_FOUND", `${err.type}`);
|
|
504
|
-
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
505
|
-
}
|
|
506
|
-
const code = lang.value;
|
|
507
|
-
const base = lang.base();
|
|
508
|
-
const rawMsg = (_c = (_b = tmpl.languages[code]) != null ? _b : tmpl.languages[base]) != null ? _c : this.getDefaultMessage(lang);
|
|
509
|
-
return {
|
|
510
|
-
status: "ERROR",
|
|
511
|
-
message: StringVars.parse(rawMsg, err.vars)
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
onUnknown(err, lang) {
|
|
515
|
-
var _a;
|
|
516
|
-
(_a = this.logger) == null ? void 0 : _a.error("UNKNOWN_ERROR", err.message);
|
|
517
|
-
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
518
|
-
}
|
|
519
|
-
handle(err, lang) {
|
|
520
|
-
var _a;
|
|
521
|
-
if (["local", "dev"].includes((_a = process.env.ENVIRONMENT) != null ? _a : "")) {
|
|
522
|
-
console.log(err);
|
|
523
|
-
}
|
|
524
|
-
if (err instanceof FatalError) {
|
|
525
|
-
return this.onFatal(err, lang);
|
|
526
|
-
}
|
|
527
|
-
if (err instanceof InternalError) {
|
|
528
|
-
return this.onInternal(err, lang);
|
|
529
|
-
}
|
|
530
|
-
if (err instanceof UsageError) {
|
|
531
|
-
return this.onUsage(err, lang);
|
|
532
|
-
}
|
|
533
|
-
return this.onUnknown(err, lang);
|
|
534
|
-
}
|
|
535
|
-
static addTemplate(template) {
|
|
536
|
-
_ErrorManager.TEMPLATES.set(template.type, template);
|
|
537
|
-
}
|
|
538
|
-
};
|
|
539
|
-
_ErrorManager.DEFAULT_MESSAGES = {
|
|
540
|
-
"es": "Ups, hemos encontrado un error. Nuestro equipo ya est\xE1 trabajando para solucionarlo",
|
|
541
|
-
"en": "Ups, we found an error. Our team is working on it.",
|
|
542
|
-
"pt": "Ops, encontramos um bug. Nossa equipe j\xE1 est\xE1 trabalhando para resolver isso."
|
|
543
|
-
};
|
|
544
|
-
_ErrorManager.APP_ERRORS = {
|
|
545
|
-
UNDEFINED: "UNDEFINED_ERROR",
|
|
546
|
-
PROCESS: "PROCESS_ERROR",
|
|
547
|
-
DATABASE: "DATABASE_ERROR"
|
|
548
|
-
};
|
|
549
|
-
_ErrorManager.TEMPLATES = /* @__PURE__ */ new Map();
|
|
550
|
-
var ErrorManager = _ErrorManager;
|
|
551
|
-
|
|
552
594
|
// src/infrastructure/mysql/Mysql.ts
|
|
553
595
|
import { createPool } from "mysql2/promise";
|
|
554
596
|
var _MysqlConnector = class _MysqlConnector {
|
|
@@ -683,51 +725,55 @@ function adaptExpressErrorHandler(errorManager) {
|
|
|
683
725
|
};
|
|
684
726
|
}
|
|
685
727
|
|
|
728
|
+
// src/domain/contracts/BaseObject.ts
|
|
729
|
+
var BaseObject = class {
|
|
730
|
+
constructor(props) {
|
|
731
|
+
this.props = props;
|
|
732
|
+
}
|
|
733
|
+
};
|
|
734
|
+
|
|
686
735
|
// src/utils/ExchangeRates.ts
|
|
687
|
-
var ExchangeRates = class _ExchangeRates {
|
|
688
|
-
constructor(
|
|
689
|
-
|
|
690
|
-
this._base = Currency.create(exchangeRates.base);
|
|
691
|
-
this._rates = exchangeRates.rates;
|
|
692
|
-
this._date = DateTime.create(exchangeRates.date);
|
|
736
|
+
var ExchangeRates = class _ExchangeRates extends BaseObject {
|
|
737
|
+
constructor(props) {
|
|
738
|
+
super(props);
|
|
693
739
|
}
|
|
694
740
|
getRate(currency) {
|
|
695
|
-
if (Object.keys(this.
|
|
696
|
-
return this.
|
|
741
|
+
if (Object.keys(this.props.rates).includes(currency.value)) {
|
|
742
|
+
return this.props.rates[currency.value];
|
|
697
743
|
}
|
|
698
744
|
return null;
|
|
699
745
|
}
|
|
700
746
|
get base() {
|
|
701
|
-
return this.
|
|
747
|
+
return this.props.base;
|
|
702
748
|
}
|
|
703
749
|
get rates() {
|
|
704
|
-
return this.
|
|
750
|
+
return this.props.rates;
|
|
705
751
|
}
|
|
706
752
|
get date() {
|
|
707
|
-
return this.
|
|
708
|
-
}
|
|
709
|
-
get rawDTO() {
|
|
710
|
-
return this._rawDTO;
|
|
753
|
+
return this.props.date;
|
|
711
754
|
}
|
|
712
755
|
toProps() {
|
|
756
|
+
return this.props;
|
|
757
|
+
}
|
|
758
|
+
toPrimitives() {
|
|
713
759
|
return {
|
|
714
|
-
base: this.base.value,
|
|
715
|
-
rates: this.rates,
|
|
716
|
-
date: this.date.value
|
|
760
|
+
base: this.props.base.value,
|
|
761
|
+
rates: this.props.rates,
|
|
762
|
+
date: this.props.date.value
|
|
717
763
|
};
|
|
718
764
|
}
|
|
719
765
|
exchangeToBase(price) {
|
|
720
766
|
const rate = this.getRate(price.currency);
|
|
721
767
|
if (!rate) {
|
|
722
|
-
throw new InternalError("INVALID_EXCHANGE_RATE_CURRENCY", `Avaiable rates: ${this.
|
|
768
|
+
throw new InternalError("INVALID_EXCHANGE_RATE_CURRENCY", `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`);
|
|
723
769
|
}
|
|
724
|
-
if (price.currency.value === this.
|
|
770
|
+
if (price.currency.value === this.props.base.value) {
|
|
725
771
|
return price;
|
|
726
772
|
}
|
|
727
|
-
return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.
|
|
773
|
+
return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);
|
|
728
774
|
}
|
|
729
|
-
static create(
|
|
730
|
-
return new _ExchangeRates(
|
|
775
|
+
static create(props) {
|
|
776
|
+
return new _ExchangeRates(props);
|
|
731
777
|
}
|
|
732
778
|
};
|
|
733
779
|
export {
|
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/contracts/DomainEvent.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/InternalError.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/domain/value-objects/Price.ts","../src/domain/value-objects/UUID.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.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 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\n public get value(): TPrimitive {\n return this._value;\n }\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\";\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\n protected constructor(props: T) {\n this.props = props;\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 abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): 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 {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport abstract class DomainEvent<T = unknown> {\n\n readonly type: string;\n private readonly _occurredAt: DateTime;\n private readonly _payload: T;\n\n protected constructor(payload: T) {\n this._payload = payload;\n this._occurredAt = DateTime.create();\n }\n\n get payload(): T {\n return this._payload;\n }\n\n get occurredAt(): DateTime {\n return this._occurredAt;\n }\n\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 InternalError 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 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 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';\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 Error(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\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; // default language\n }\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\n\nexport class Price extends ValueObject<{ amount: number; currency: Currency }> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n\n private readonly _amount: number;\n private readonly _currency: Currency;\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n this._amount = amount;\n this._currency = 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 Error(`Price amount <${amount}> is not a valid number`);\n }\n if (amount < Price.MIN_AMOUNT) {\n throw new Error(`Price amount <${amount}> must be ≥ ${Price.MIN_AMOUNT}`);\n }\n }\n\n public get amount(): number {\n return this._amount;\n }\n\n public get currency(): Currency {\n return this._currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._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 toProps(): 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\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class UUID extends ValueObject<string> {\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new Error(`Invalid uuid ${uuid}`);\n }\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static isValid(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\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}","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: 'ERROR',\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 {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n public static readonly DEFAULT_POOL_SIZE: number = 10;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool =\n pool ??\n 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 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 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 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 status: 'OK'\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 status: 'NOT_FOUND',\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\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 const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: Object.fromEntries(Object.entries(req.query).map(([k, v]) => [k, String(v)])),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const {statusCode, body} = await controller.handle(httpRequest);\n res.status(statusCode).json(body);\n } catch (err) {\n next(err);\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 {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {RatesDTO} from \"wsp-contracts/rates\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class ExchangeRates {\n\n private readonly _rawDTO: RatesDTO;\n private readonly _base: Currency;\n private readonly _rates: Record<string, number>;\n private readonly _date: DateTime;\n\n public constructor(exchangeRates: RatesDTO) {\n this._rawDTO = exchangeRates;\n this._base = Currency.create(exchangeRates.base);\n this._rates = exchangeRates.rates;\n this._date = DateTime.create(exchangeRates.date);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this._rates).includes(currency.value)) {\n return this._rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this._base;\n }\n\n public get rates(): {[key: string]: number} {\n return this._rates;\n }\n\n public get date(): DateTime {\n return this._date;\n }\n\n public get rawDTO(): RatesDTO{\n return this._rawDTO;\n }\n\n public toProps(): Record<string, unknown> {\n return {\n base: this.base.value,\n rates: this.rates,\n date: this.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._rates} - Base Currency:${this._base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this._base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this._base.value);\n }\n\n public static create(data: RatesDTO): ExchangeRates {\n return new ExchangeRates(data);\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/contracts/DomainEvent.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/InternalError.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/UUID.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/domain/contracts/BaseObject.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 protected 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\";\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\n protected constructor(props: T) {\n this.props = props;\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 abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): 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 {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport abstract class DomainEvent<T = unknown> {\n\n readonly type: string;\n private readonly _occurredAt: DateTime;\n private readonly _payload: T;\n\n protected constructor(payload: T) {\n this._payload = payload;\n this._occurredAt = DateTime.create();\n }\n\n get payload(): T {\n return this._payload;\n }\n\n get occurredAt(): DateTime {\n return this._occurredAt;\n }\n\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 InternalError 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: 'ERROR',\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\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class UUID extends ValueObject<string> {\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 {\n value: this.value\n };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static isValid(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\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 public static readonly DEFAULT_POOL_SIZE: number = 10;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool =\n pool ??\n 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 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 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 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 status: 'OK'\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 status: 'NOT_FOUND',\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\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 const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: Object.fromEntries(Object.entries(req.query).map(([k, v]) => [k, String(v)])),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const {statusCode, body} = await controller.handle(httpRequest);\n res.status(statusCode).json(body);\n } catch (err) {\n next(err);\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}","\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 {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\n}"],"mappings":"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","names":[]}
|