@woltz/rich-domain-drizzle 0.1.2 → 0.1.3
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/cjs/errors.d.ts +3 -0
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +8 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mappers/to-persistence.d.ts +2 -2
- package/dist/cjs/mappers/to-persistence.d.ts.map +1 -1
- package/dist/cjs/mappers/to-persistence.js +2 -2
- package/dist/cjs/mappers/to-persistence.js.map +1 -1
- package/dist/cjs/outbox-store.d.ts +34 -0
- package/dist/cjs/outbox-store.d.ts.map +1 -0
- package/dist/cjs/outbox-store.js +96 -0
- package/dist/cjs/outbox-store.js.map +1 -0
- package/dist/cjs/outbox-table.d.ts +157 -0
- package/dist/cjs/outbox-table.d.ts.map +1 -0
- package/dist/cjs/outbox-table.js +32 -0
- package/dist/cjs/outbox-table.js.map +1 -0
- package/dist/cjs/repository.d.ts +24 -1
- package/dist/cjs/repository.d.ts.map +1 -1
- package/dist/cjs/repository.js +35 -0
- package/dist/cjs/repository.js.map +1 -1
- package/dist/esm/errors.d.ts +3 -0
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +6 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mappers/to-persistence.d.ts +2 -2
- package/dist/esm/mappers/to-persistence.d.ts.map +1 -1
- package/dist/esm/mappers/to-persistence.js +2 -2
- package/dist/esm/mappers/to-persistence.js.map +1 -1
- package/dist/esm/outbox-store.d.ts +34 -0
- package/dist/esm/outbox-store.d.ts.map +1 -0
- package/dist/esm/outbox-store.js +92 -0
- package/dist/esm/outbox-store.js.map +1 -0
- package/dist/esm/outbox-table.d.ts +157 -0
- package/dist/esm/outbox-table.d.ts.map +1 -0
- package/dist/esm/outbox-table.js +29 -0
- package/dist/esm/outbox-table.js.map +1 -0
- package/dist/esm/repository.d.ts +24 -1
- package/dist/esm/repository.d.ts.map +1 -1
- package/dist/esm/repository.js +35 -0
- package/dist/esm/repository.js.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/errors.d.ts +3 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/mappers/to-persistence.d.ts +2 -2
- package/dist/types/mappers/to-persistence.d.ts.map +1 -1
- package/dist/types/outbox-store.d.ts +34 -0
- package/dist/types/outbox-store.d.ts.map +1 -0
- package/dist/types/outbox-table.d.ts +157 -0
- package/dist/types/outbox-table.d.ts.map +1 -0
- package/dist/types/repository.d.ts +24 -1
- package/dist/types/repository.d.ts.map +1 -1
- package/package.json +3 -7
- package/src/errors.ts +85 -78
- package/src/index.ts +42 -37
- package/src/mappers/to-persistence.ts +98 -99
- package/src/outbox-store.ts +101 -0
- package/src/outbox-table.ts +40 -0
- package/src/repository.ts +302 -257
package/dist/cjs/errors.d.ts
CHANGED
|
@@ -23,6 +23,9 @@ export declare class DrizzleRepositoryError extends DrizzleAdapterError {
|
|
|
23
23
|
readonly cause?: Error | undefined;
|
|
24
24
|
constructor(message: string, cause?: Error | undefined);
|
|
25
25
|
}
|
|
26
|
+
export declare class OutboxStoreError extends DrizzleAdapterError {
|
|
27
|
+
constructor(message: string);
|
|
28
|
+
}
|
|
26
29
|
export declare class MissingJunctionConfigError extends DrizzleAdapterError {
|
|
27
30
|
readonly parentEntity: string;
|
|
28
31
|
readonly collectionField: string;
|
package/dist/cjs/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;aAEvC,UAAU,EAAE,MAAM;aAClB,eAAe,EAAE,MAAM,EAAE;gBADzB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EAAE;CAQ5C;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAE3C,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aACd,EAAE,EAAE,MAAM;aACV,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,mBAAmB;aAExC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aAEd,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAG3C,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,0BAA2B,SAAQ,mBAAmB;aAE/C,YAAY,EAAE,MAAM;aACpB,eAAe,EAAE,MAAM;gBADvB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM;CAoB1C"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;aAEvC,UAAU,EAAE,MAAM;aAClB,eAAe,EAAE,MAAM,EAAE;gBADzB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EAAE;CAQ5C;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAE3C,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aACd,EAAE,EAAE,MAAM;aACV,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,mBAAmB;aAExC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aAEd,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAG3C,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,gBAAiB,SAAQ,mBAAmB;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,0BAA2B,SAAQ,mBAAmB;aAE/C,YAAY,EAAE,MAAM;aACpB,eAAe,EAAE,MAAM;gBADvB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM;CAoB1C"}
|
package/dist/cjs/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MissingJunctionConfigError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = void 0;
|
|
3
|
+
exports.MissingJunctionConfigError = exports.OutboxStoreError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = void 0;
|
|
4
4
|
class DrizzleAdapterError extends Error {
|
|
5
5
|
constructor(message) {
|
|
6
6
|
super(`[DrizzleAdapter] ${message}`);
|
|
@@ -57,6 +57,13 @@ class DrizzleRepositoryError extends DrizzleAdapterError {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
exports.DrizzleRepositoryError = DrizzleRepositoryError;
|
|
60
|
+
class OutboxStoreError extends DrizzleAdapterError {
|
|
61
|
+
constructor(message) {
|
|
62
|
+
super(`[OutboxStore] ${message}`);
|
|
63
|
+
this.name = "OutboxStoreError";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.OutboxStoreError = OutboxStoreError;
|
|
60
67
|
class MissingJunctionConfigError extends DrizzleAdapterError {
|
|
61
68
|
parentEntity;
|
|
62
69
|
collectionField;
|
package/dist/cjs/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,kBAAmB,SAAQ,mBAAmB;IAEvC;IACA;IAFlB,YACkB,UAAkB,EAClB,eAAyB;QAEzC,KAAK,CACH,qBAAqB,UAAU,2BAA2B;YACxD,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;QANc,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAU;QAMzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAXD,gDAWC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAE3C;IACA;IACA;IACA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EACd,EAAU,EACV,KAAa;QAE7B,KAAK,CAAC,GAAG,SAAS,OAAO,MAAM,SAAS,EAAE,sBAAsB,CAAC,CAAC;QALlD,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,OAAE,GAAF,EAAE,CAAQ;QACV,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAVD,wDAUC;AAED,MAAa,mBAAoB,SAAQ,mBAAmB;IAExC;IACA;IAEA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EAC9B,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,SAAS,SAAS,OAAO,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;QAL5C,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QAEd,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAVD,kDAUC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAG3C;IAFlB,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AARD,wDAQC;AAED,MAAa,0BAA2B,SAAQ,mBAAmB;IAE/C;IACA;IAFlB,YACkB,YAAoB,EACpB,eAAuB;QAEvC,KAAK,CACH,eAAe,eAAe,gBAAgB,YAAY,2DAA2D;YACnH,gGAAgG;YAChG,YAAY;YACZ,oBAAoB;YACpB,OAAO,eAAe,OAAO;YAC7B,4BAA4B;YAC5B,iCAAiC;YACjC,qBAAqB;YACrB,mBAAmB,YAAY,CAAC,WAAW,EAAE,IAAI,eAAe,MAAM;YACtE,uBAAuB,YAAY,CAAC,WAAW,EAAE,QAAQ;YACzD,wCAAwC;YACxC,YAAY;YACZ,UAAU;YACV,KAAK,CACR,CAAC;QAlBc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,oBAAe,GAAf,eAAe,CAAQ;QAkBvC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAvBD,gEAuBC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,kBAAmB,SAAQ,mBAAmB;IAEvC;IACA;IAFlB,YACkB,UAAkB,EAClB,eAAyB;QAEzC,KAAK,CACH,qBAAqB,UAAU,2BAA2B;YACxD,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;QANc,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAU;QAMzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAXD,gDAWC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAE3C;IACA;IACA;IACA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EACd,EAAU,EACV,KAAa;QAE7B,KAAK,CAAC,GAAG,SAAS,OAAO,MAAM,SAAS,EAAE,sBAAsB,CAAC,CAAC;QALlD,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,OAAE,GAAF,EAAE,CAAQ;QACV,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAVD,wDAUC;AAED,MAAa,mBAAoB,SAAQ,mBAAmB;IAExC;IACA;IAEA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EAC9B,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,SAAS,SAAS,OAAO,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;QAL5C,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QAEd,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAVD,kDAUC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAG3C;IAFlB,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AARD,wDAQC;AAED,MAAa,gBAAiB,SAAQ,mBAAmB;IACvD,YAAY,OAAe;QACzB,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AALD,4CAKC;AAED,MAAa,0BAA2B,SAAQ,mBAAmB;IAE/C;IACA;IAFlB,YACkB,YAAoB,EACpB,eAAuB;QAEvC,KAAK,CACH,eAAe,eAAe,gBAAgB,YAAY,2DAA2D;YACnH,gGAAgG;YAChG,YAAY;YACZ,oBAAoB;YACpB,OAAO,eAAe,OAAO;YAC7B,4BAA4B;YAC5B,iCAAiC;YACjC,qBAAqB;YACrB,mBAAmB,YAAY,CAAC,WAAW,EAAE,IAAI,eAAe,MAAM;YACtE,uBAAuB,YAAY,CAAC,WAAW,EAAE,QAAQ;YACzD,wCAAwC;YACxC,YAAY;YACZ,UAAU;YACV,KAAK,CACR,CAAC;QAlBc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,oBAAe,GAAf,eAAe,CAAQ;QAkBvC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAvBD,gEAuBC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -4,5 +4,7 @@ export { DrizzleToPersistence } from "./mappers/to-persistence";
|
|
|
4
4
|
export { DrizzleToDomain } from "./mappers/to-domain";
|
|
5
5
|
export { DrizzleBatchExecutor, executeBatch, type DrizzleBatchExecutorConfig, } from "./batch-executor";
|
|
6
6
|
export { DrizzleQueryBuilder, type SearchableField } from "./query-builder";
|
|
7
|
-
export {
|
|
7
|
+
export { outboxTable } from "./outbox-table";
|
|
8
|
+
export { DrizzleOutboxStore } from "./outbox-store";
|
|
9
|
+
export { DrizzleAdapterError, TableNotFoundError, NoRecordsAffectedError, BatchOperationError, DrizzleRepositoryError, OutboxStoreError, MissingJunctionConfigError, } from "./errors";
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,UAAU,EACV,aAAa,EACb,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,UAAU,EACV,aAAa,EACb,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MissingJunctionConfigError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = exports.DrizzleQueryBuilder = exports.executeBatch = exports.DrizzleBatchExecutor = exports.DrizzleToDomain = exports.DrizzleToPersistence = exports.DrizzleRepository = exports.getCurrentDrizzleContext = exports.Transactional = exports.UOWStorage = exports.DrizzleTransactionContext = exports.DrizzleUnitOfWork = void 0;
|
|
3
|
+
exports.MissingJunctionConfigError = exports.OutboxStoreError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = exports.DrizzleOutboxStore = exports.outboxTable = exports.DrizzleQueryBuilder = exports.executeBatch = exports.DrizzleBatchExecutor = exports.DrizzleToDomain = exports.DrizzleToPersistence = exports.DrizzleRepository = exports.getCurrentDrizzleContext = exports.Transactional = exports.UOWStorage = exports.DrizzleTransactionContext = exports.DrizzleUnitOfWork = void 0;
|
|
4
4
|
// Unit of Work
|
|
5
5
|
var unit_of_work_1 = require("./unit-of-work");
|
|
6
6
|
Object.defineProperty(exports, "DrizzleUnitOfWork", { enumerable: true, get: function () { return unit_of_work_1.DrizzleUnitOfWork; } });
|
|
@@ -23,6 +23,11 @@ Object.defineProperty(exports, "executeBatch", { enumerable: true, get: function
|
|
|
23
23
|
// Query Builder
|
|
24
24
|
var query_builder_1 = require("./query-builder");
|
|
25
25
|
Object.defineProperty(exports, "DrizzleQueryBuilder", { enumerable: true, get: function () { return query_builder_1.DrizzleQueryBuilder; } });
|
|
26
|
+
// Outbox
|
|
27
|
+
var outbox_table_1 = require("./outbox-table");
|
|
28
|
+
Object.defineProperty(exports, "outboxTable", { enumerable: true, get: function () { return outbox_table_1.outboxTable; } });
|
|
29
|
+
var outbox_store_1 = require("./outbox-store");
|
|
30
|
+
Object.defineProperty(exports, "DrizzleOutboxStore", { enumerable: true, get: function () { return outbox_store_1.DrizzleOutboxStore; } });
|
|
26
31
|
// Errors
|
|
27
32
|
var errors_1 = require("./errors");
|
|
28
33
|
Object.defineProperty(exports, "DrizzleAdapterError", { enumerable: true, get: function () { return errors_1.DrizzleAdapterError; } });
|
|
@@ -30,5 +35,6 @@ Object.defineProperty(exports, "TableNotFoundError", { enumerable: true, get: fu
|
|
|
30
35
|
Object.defineProperty(exports, "NoRecordsAffectedError", { enumerable: true, get: function () { return errors_1.NoRecordsAffectedError; } });
|
|
31
36
|
Object.defineProperty(exports, "BatchOperationError", { enumerable: true, get: function () { return errors_1.BatchOperationError; } });
|
|
32
37
|
Object.defineProperty(exports, "DrizzleRepositoryError", { enumerable: true, get: function () { return errors_1.DrizzleRepositoryError; } });
|
|
38
|
+
Object.defineProperty(exports, "OutboxStoreError", { enumerable: true, get: function () { return errors_1.OutboxStoreError; } });
|
|
33
39
|
Object.defineProperty(exports, "MissingJunctionConfigError", { enumerable: true, get: function () { return errors_1.MissingJunctionConfigError; } });
|
|
34
40
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,+CAQwB;AAPtB,iHAAA,iBAAiB,OAAA;AACjB,yHAAA,yBAAyB,OAAA;AACzB,0GAAA,UAAU,OAAA;AACV,6GAAA,aAAa,OAAA;AACb,wHAAA,wBAAwB,OAAA;AAK1B,aAAa;AACb,2CAA+E;AAAtE,+GAAA,iBAAiB,OAAA;AAE1B,UAAU;AACV,2DAAgE;AAAvD,sHAAA,oBAAoB,OAAA;AAC7B,iDAAsD;AAA7C,4GAAA,eAAe,OAAA;AAExB,iBAAiB;AACjB,mDAI0B;AAHxB,sHAAA,oBAAoB,OAAA;AACpB,8GAAA,YAAY,OAAA;AAId,gBAAgB;AAChB,iDAA4E;AAAnE,oHAAA,mBAAmB,OAAA;AAE5B,SAAS;AACT,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,+CAQwB;AAPtB,iHAAA,iBAAiB,OAAA;AACjB,yHAAA,yBAAyB,OAAA;AACzB,0GAAA,UAAU,OAAA;AACV,6GAAA,aAAa,OAAA;AACb,wHAAA,wBAAwB,OAAA;AAK1B,aAAa;AACb,2CAA+E;AAAtE,+GAAA,iBAAiB,OAAA;AAE1B,UAAU;AACV,2DAAgE;AAAvD,sHAAA,oBAAoB,OAAA;AAC7B,iDAAsD;AAA7C,4GAAA,eAAe,OAAA;AAExB,iBAAiB;AACjB,mDAI0B;AAHxB,sHAAA,oBAAoB,OAAA;AACpB,8GAAA,YAAY,OAAA;AAId,gBAAgB;AAChB,iDAA4E;AAAnE,oHAAA,mBAAmB,OAAA;AAE5B,SAAS;AACT,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAE3B,SAAS;AACT,mCAQkB;AAPhB,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,6GAAA,mBAAmB,OAAA;AACnB,gHAAA,sBAAsB,OAAA;AACtB,0GAAA,gBAAgB,OAAA;AAChB,oHAAA,0BAA0B,OAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Mapper, AggregateChanges, EntitySchemaRegistry } from "@woltz/rich-domain";
|
|
1
|
+
import { Mapper, AggregateChanges, EntitySchemaRegistry, Aggregate } from "@woltz/rich-domain";
|
|
2
2
|
import { DrizzleClient, DrizzleUnitOfWork } from "../unit-of-work";
|
|
3
|
-
export declare abstract class DrizzleToPersistence<TDomain
|
|
3
|
+
export declare abstract class DrizzleToPersistence<TDomain extends Aggregate<any>, TDb extends DrizzleClient = DrizzleClient> extends Mapper<TDomain, void> {
|
|
4
4
|
protected readonly db: TDb;
|
|
5
5
|
protected readonly uow: DrizzleUnitOfWork;
|
|
6
6
|
constructor(db: TDb, uow: DrizzleUnitOfWork);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-persistence.d.ts","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"to-persistence.d.ts","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,iBAAiB,EAGlB,MAAM,iBAAiB,CAAC;AAGzB,8BAAsB,oBAAoB,CACxC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9B,GAAG,SAAS,aAAa,GAAG,aAAa,CACzC,SAAQ,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;IAE3B,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG;IAC1B,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,iBAAiB;gBADtB,EAAE,EAAE,GAAG,EACP,GAAG,EAAE,iBAAiB;IAK3C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvD;;OAEG;IACH,SAAS,KAAK,OAAO,IAAI,GAAG,CAG3B;IAED;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9D;;;;OAIG;cACa,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC;YAUF,YAAY;CAS3B"}
|
|
@@ -32,7 +32,7 @@ class DrizzleToPersistence extends rich_domain_1.Mapper {
|
|
|
32
32
|
* Build persistence operations.
|
|
33
33
|
*/
|
|
34
34
|
async build(entity) {
|
|
35
|
-
const isNew = entity.isNew
|
|
35
|
+
const isNew = entity.isNew();
|
|
36
36
|
if (isNew) {
|
|
37
37
|
await this.onCreate(entity);
|
|
38
38
|
}
|
|
@@ -54,7 +54,7 @@ class DrizzleToPersistence extends rich_domain_1.Mapper {
|
|
|
54
54
|
await executor.execute(changes);
|
|
55
55
|
}
|
|
56
56
|
async handleUpdate(entity) {
|
|
57
|
-
const changes = entity.getChanges
|
|
57
|
+
const changes = entity.getChanges();
|
|
58
58
|
if (!changes || changes.isEmpty()) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-persistence.js","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"to-persistence.js","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAK4B;AAC5B,kDAKyB;AACzB,sDAAyD;AAEzD,MAAsB,oBAGpB,SAAQ,oBAAqB;IAER;IACA;IAFrB,YACqB,EAAO,EACP,GAAsB;QAEzC,KAAK,EAAE,CAAC;QAHW,OAAE,GAAF,EAAE,CAAK;QACP,QAAG,GAAH,GAAG,CAAmB;IAG3C,CAAC;IAoBD;;OAEG;IACH,IAAc,OAAO;QACnB,MAAM,GAAG,GAAG,yBAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE,CAAQ,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAe;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAE7B,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAQD;;;;OAIG;IACO,KAAK,CAAC,QAAQ,CACtB,OAAyB,EACzB,UAAmB;QAEnB,MAAM,QAAQ,GAAG,IAAI,qCAAoB,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAGa,AAAN,KAAK,CAAC,YAAY,CAAC,MAAe;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;CACF;AAnFD,oDAmFC;AATe;IADb,IAAA,4BAAa,GAAE;;;;wDASf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { IDomainEvent, IOutboxStore, OutboxFetchResult } from "@woltz/rich-domain";
|
|
2
|
+
import { type DrizzleClient } from "./unit-of-work";
|
|
3
|
+
/**
|
|
4
|
+
* Drizzle implementation of {@link IOutboxStore}.
|
|
5
|
+
*
|
|
6
|
+
* When called inside a {@link DrizzleUnitOfWork} transaction, operations use
|
|
7
|
+
* the same transactional client, guaranteeing that outbox rows are written
|
|
8
|
+
* atomically with the aggregate.
|
|
9
|
+
*
|
|
10
|
+
* When called outside a transaction, falls back to the raw Drizzle client.
|
|
11
|
+
*
|
|
12
|
+
* **Important:** the outbox store relies on `UOWStorage` (the `AsyncLocalStorage`
|
|
13
|
+
* singleton from `rich-domain-drizzle`) to resolve the transactional client.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const outboxStore = new DrizzleOutboxStore(db);
|
|
18
|
+
* const bus = new OutboxEventBusDecorator(rabbitBus, outboxStore);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare class DrizzleOutboxStore implements IOutboxStore {
|
|
22
|
+
private readonly db;
|
|
23
|
+
constructor(db: DrizzleClient);
|
|
24
|
+
/**
|
|
25
|
+
* Get the current Drizzle client — transactional if inside a UoW transaction,
|
|
26
|
+
* otherwise the raw client.
|
|
27
|
+
*/
|
|
28
|
+
private get context();
|
|
29
|
+
save(events: IDomainEvent[]): Promise<void>;
|
|
30
|
+
fetchPending(batchSize?: number): Promise<OutboxFetchResult>;
|
|
31
|
+
markPublished(id: string): Promise<void>;
|
|
32
|
+
markFailed(id: string, error: string): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=outbox-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox-store.d.ts","sourceRoot":"","sources":["../../src/outbox-store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAIhE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAE9C;;;OAGG;IACH,OAAO,KAAK,OAAO,GAGlB;IAEK,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3C,YAAY,CAAC,SAAS,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsBxD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU3D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DrizzleOutboxStore = void 0;
|
|
4
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
5
|
+
const unit_of_work_1 = require("./unit-of-work");
|
|
6
|
+
const errors_1 = require("./errors");
|
|
7
|
+
const outbox_table_1 = require("./outbox-table");
|
|
8
|
+
/**
|
|
9
|
+
* Drizzle implementation of {@link IOutboxStore}.
|
|
10
|
+
*
|
|
11
|
+
* When called inside a {@link DrizzleUnitOfWork} transaction, operations use
|
|
12
|
+
* the same transactional client, guaranteeing that outbox rows are written
|
|
13
|
+
* atomically with the aggregate.
|
|
14
|
+
*
|
|
15
|
+
* When called outside a transaction, falls back to the raw Drizzle client.
|
|
16
|
+
*
|
|
17
|
+
* **Important:** the outbox store relies on `UOWStorage` (the `AsyncLocalStorage`
|
|
18
|
+
* singleton from `rich-domain-drizzle`) to resolve the transactional client.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const outboxStore = new DrizzleOutboxStore(db);
|
|
23
|
+
* const bus = new OutboxEventBusDecorator(rabbitBus, outboxStore);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
class DrizzleOutboxStore {
|
|
27
|
+
db;
|
|
28
|
+
constructor(db) {
|
|
29
|
+
this.db = db;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the current Drizzle client — transactional if inside a UoW transaction,
|
|
33
|
+
* otherwise the raw client.
|
|
34
|
+
*/
|
|
35
|
+
get context() {
|
|
36
|
+
const ctx = unit_of_work_1.UOWStorage.getStore()?.ctx;
|
|
37
|
+
return ctx?.client ?? this.db;
|
|
38
|
+
}
|
|
39
|
+
async save(events) {
|
|
40
|
+
if (events.length === 0)
|
|
41
|
+
return;
|
|
42
|
+
try {
|
|
43
|
+
await this.context.insert(outbox_table_1.outboxTable).values(events.map((e) => ({
|
|
44
|
+
id: e.eventId,
|
|
45
|
+
eventName: e.eventName,
|
|
46
|
+
payload: e.payload,
|
|
47
|
+
occurredOn: e.occurredOn,
|
|
48
|
+
status: "pending",
|
|
49
|
+
retries: 0,
|
|
50
|
+
lastError: null,
|
|
51
|
+
})));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
+
throw new errors_1.OutboxStoreError(`Failed to save outbox entries: ${message}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async fetchPending(batchSize = 50) {
|
|
59
|
+
const rows = await this.context
|
|
60
|
+
.select()
|
|
61
|
+
.from(outbox_table_1.outboxTable)
|
|
62
|
+
.where((0, drizzle_orm_1.inArray)(outbox_table_1.outboxTable.status, ["pending", "failed"]))
|
|
63
|
+
.orderBy((0, drizzle_orm_1.asc)(outbox_table_1.outboxTable.createdAt))
|
|
64
|
+
.limit(batchSize);
|
|
65
|
+
return {
|
|
66
|
+
entries: rows.map((r) => ({
|
|
67
|
+
id: r.id,
|
|
68
|
+
eventName: r.eventName,
|
|
69
|
+
payload: r.payload,
|
|
70
|
+
occurredOn: r.occurredOn,
|
|
71
|
+
status: r.status,
|
|
72
|
+
retries: r.retries,
|
|
73
|
+
lastError: r.lastError,
|
|
74
|
+
createdAt: r.createdAt,
|
|
75
|
+
})),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async markPublished(id) {
|
|
79
|
+
await this.context
|
|
80
|
+
.update(outbox_table_1.outboxTable)
|
|
81
|
+
.set({ status: "published" })
|
|
82
|
+
.where((0, drizzle_orm_1.eq)(outbox_table_1.outboxTable.id, id));
|
|
83
|
+
}
|
|
84
|
+
async markFailed(id, error) {
|
|
85
|
+
await this.context
|
|
86
|
+
.update(outbox_table_1.outboxTable)
|
|
87
|
+
.set({
|
|
88
|
+
status: "failed",
|
|
89
|
+
retries: (0, drizzle_orm_1.sql) `${outbox_table_1.outboxTable.retries} + 1`,
|
|
90
|
+
lastError: error,
|
|
91
|
+
})
|
|
92
|
+
.where((0, drizzle_orm_1.eq)(outbox_table_1.outboxTable.id, id));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.DrizzleOutboxStore = DrizzleOutboxStore;
|
|
96
|
+
//# sourceMappingURL=outbox-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox-store.js","sourceRoot":"","sources":["../../src/outbox-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drizzle table definition for the outbox table.
|
|
3
|
+
*
|
|
4
|
+
* Import this in your schema file and add it to your schema object.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { outboxTable } from "@woltz/rich-domain-drizzle";
|
|
9
|
+
* export const schema = { users, orders, outbox: outboxTable };
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* Then run `drizzle-kit generate` and `drizzle-kit migrate` as usual.
|
|
13
|
+
*/
|
|
14
|
+
export declare const outboxTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
15
|
+
name: "outbox";
|
|
16
|
+
schema: undefined;
|
|
17
|
+
columns: {
|
|
18
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
19
|
+
name: "id";
|
|
20
|
+
tableName: "outbox";
|
|
21
|
+
dataType: "string";
|
|
22
|
+
columnType: "PgText";
|
|
23
|
+
data: string;
|
|
24
|
+
driverParam: string;
|
|
25
|
+
notNull: true;
|
|
26
|
+
hasDefault: false;
|
|
27
|
+
isPrimaryKey: true;
|
|
28
|
+
isAutoincrement: false;
|
|
29
|
+
hasRuntimeDefault: false;
|
|
30
|
+
enumValues: [string, ...string[]];
|
|
31
|
+
baseColumn: never;
|
|
32
|
+
identity: undefined;
|
|
33
|
+
generated: undefined;
|
|
34
|
+
}, {}, {}>;
|
|
35
|
+
eventName: import("drizzle-orm/pg-core").PgColumn<{
|
|
36
|
+
name: "event_name";
|
|
37
|
+
tableName: "outbox";
|
|
38
|
+
dataType: "string";
|
|
39
|
+
columnType: "PgText";
|
|
40
|
+
data: string;
|
|
41
|
+
driverParam: string;
|
|
42
|
+
notNull: true;
|
|
43
|
+
hasDefault: false;
|
|
44
|
+
isPrimaryKey: false;
|
|
45
|
+
isAutoincrement: false;
|
|
46
|
+
hasRuntimeDefault: false;
|
|
47
|
+
enumValues: [string, ...string[]];
|
|
48
|
+
baseColumn: never;
|
|
49
|
+
identity: undefined;
|
|
50
|
+
generated: undefined;
|
|
51
|
+
}, {}, {}>;
|
|
52
|
+
payload: import("drizzle-orm/pg-core").PgColumn<{
|
|
53
|
+
name: "payload";
|
|
54
|
+
tableName: "outbox";
|
|
55
|
+
dataType: "json";
|
|
56
|
+
columnType: "PgJsonb";
|
|
57
|
+
data: unknown;
|
|
58
|
+
driverParam: unknown;
|
|
59
|
+
notNull: true;
|
|
60
|
+
hasDefault: false;
|
|
61
|
+
isPrimaryKey: false;
|
|
62
|
+
isAutoincrement: false;
|
|
63
|
+
hasRuntimeDefault: false;
|
|
64
|
+
enumValues: undefined;
|
|
65
|
+
baseColumn: never;
|
|
66
|
+
identity: undefined;
|
|
67
|
+
generated: undefined;
|
|
68
|
+
}, {}, {}>;
|
|
69
|
+
occurredOn: import("drizzle-orm/pg-core").PgColumn<{
|
|
70
|
+
name: "occurred_on";
|
|
71
|
+
tableName: "outbox";
|
|
72
|
+
dataType: "date";
|
|
73
|
+
columnType: "PgTimestamp";
|
|
74
|
+
data: Date;
|
|
75
|
+
driverParam: string;
|
|
76
|
+
notNull: true;
|
|
77
|
+
hasDefault: false;
|
|
78
|
+
isPrimaryKey: false;
|
|
79
|
+
isAutoincrement: false;
|
|
80
|
+
hasRuntimeDefault: false;
|
|
81
|
+
enumValues: undefined;
|
|
82
|
+
baseColumn: never;
|
|
83
|
+
identity: undefined;
|
|
84
|
+
generated: undefined;
|
|
85
|
+
}, {}, {}>;
|
|
86
|
+
status: import("drizzle-orm/pg-core").PgColumn<{
|
|
87
|
+
name: "status";
|
|
88
|
+
tableName: "outbox";
|
|
89
|
+
dataType: "string";
|
|
90
|
+
columnType: "PgText";
|
|
91
|
+
data: string;
|
|
92
|
+
driverParam: string;
|
|
93
|
+
notNull: true;
|
|
94
|
+
hasDefault: true;
|
|
95
|
+
isPrimaryKey: false;
|
|
96
|
+
isAutoincrement: false;
|
|
97
|
+
hasRuntimeDefault: false;
|
|
98
|
+
enumValues: [string, ...string[]];
|
|
99
|
+
baseColumn: never;
|
|
100
|
+
identity: undefined;
|
|
101
|
+
generated: undefined;
|
|
102
|
+
}, {}, {}>;
|
|
103
|
+
retries: import("drizzle-orm/pg-core").PgColumn<{
|
|
104
|
+
name: "retries";
|
|
105
|
+
tableName: "outbox";
|
|
106
|
+
dataType: "number";
|
|
107
|
+
columnType: "PgInteger";
|
|
108
|
+
data: number;
|
|
109
|
+
driverParam: string | number;
|
|
110
|
+
notNull: true;
|
|
111
|
+
hasDefault: true;
|
|
112
|
+
isPrimaryKey: false;
|
|
113
|
+
isAutoincrement: false;
|
|
114
|
+
hasRuntimeDefault: false;
|
|
115
|
+
enumValues: undefined;
|
|
116
|
+
baseColumn: never;
|
|
117
|
+
identity: undefined;
|
|
118
|
+
generated: undefined;
|
|
119
|
+
}, {}, {}>;
|
|
120
|
+
lastError: import("drizzle-orm/pg-core").PgColumn<{
|
|
121
|
+
name: "last_error";
|
|
122
|
+
tableName: "outbox";
|
|
123
|
+
dataType: "string";
|
|
124
|
+
columnType: "PgText";
|
|
125
|
+
data: string;
|
|
126
|
+
driverParam: string;
|
|
127
|
+
notNull: false;
|
|
128
|
+
hasDefault: false;
|
|
129
|
+
isPrimaryKey: false;
|
|
130
|
+
isAutoincrement: false;
|
|
131
|
+
hasRuntimeDefault: false;
|
|
132
|
+
enumValues: [string, ...string[]];
|
|
133
|
+
baseColumn: never;
|
|
134
|
+
identity: undefined;
|
|
135
|
+
generated: undefined;
|
|
136
|
+
}, {}, {}>;
|
|
137
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
138
|
+
name: "created_at";
|
|
139
|
+
tableName: "outbox";
|
|
140
|
+
dataType: "date";
|
|
141
|
+
columnType: "PgTimestamp";
|
|
142
|
+
data: Date;
|
|
143
|
+
driverParam: string;
|
|
144
|
+
notNull: true;
|
|
145
|
+
hasDefault: true;
|
|
146
|
+
isPrimaryKey: false;
|
|
147
|
+
isAutoincrement: false;
|
|
148
|
+
hasRuntimeDefault: false;
|
|
149
|
+
enumValues: undefined;
|
|
150
|
+
baseColumn: never;
|
|
151
|
+
identity: undefined;
|
|
152
|
+
generated: undefined;
|
|
153
|
+
}, {}, {}>;
|
|
154
|
+
};
|
|
155
|
+
dialect: "pg";
|
|
156
|
+
}>;
|
|
157
|
+
//# sourceMappingURL=outbox-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox-table.d.ts","sourceRoot":"","sources":["../../src/outbox-table.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBvB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.outboxTable = void 0;
|
|
4
|
+
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
5
|
+
/**
|
|
6
|
+
* Drizzle table definition for the outbox table.
|
|
7
|
+
*
|
|
8
|
+
* Import this in your schema file and add it to your schema object.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { outboxTable } from "@woltz/rich-domain-drizzle";
|
|
13
|
+
* export const schema = { users, orders, outbox: outboxTable };
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Then run `drizzle-kit generate` and `drizzle-kit migrate` as usual.
|
|
17
|
+
*/
|
|
18
|
+
exports.outboxTable = (0, pg_core_1.pgTable)("outbox", {
|
|
19
|
+
id: (0, pg_core_1.text)("id").primaryKey(),
|
|
20
|
+
eventName: (0, pg_core_1.text)("event_name").notNull(),
|
|
21
|
+
payload: (0, pg_core_1.jsonb)("payload").notNull(),
|
|
22
|
+
occurredOn: (0, pg_core_1.timestamp)("occurred_on", { withTimezone: true }).notNull(),
|
|
23
|
+
status: (0, pg_core_1.text)("status").notNull().default("pending"),
|
|
24
|
+
retries: (0, pg_core_1.integer)("retries").notNull().default(0),
|
|
25
|
+
lastError: (0, pg_core_1.text)("last_error"),
|
|
26
|
+
createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
|
|
27
|
+
.notNull()
|
|
28
|
+
.defaultNow(),
|
|
29
|
+
}, (table) => ({
|
|
30
|
+
statusIdx: (0, pg_core_1.index)("idx_outbox_status").on(table.status),
|
|
31
|
+
}));
|
|
32
|
+
//# sourceMappingURL=outbox-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox-table.js","sourceRoot":"","sources":["../../src/outbox-table.ts"],"names":[],"mappings":";;;AAAA,iDAO6B;AAE7B;;;;;;;;;;;;GAYG;AACU,QAAA,WAAW,GAAG,IAAA,iBAAO,EAChC,QAAQ,EACR;IACE,EAAE,EAAE,IAAA,cAAI,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,SAAS,EAAE,IAAA,cAAI,EAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,OAAO,EAAE,IAAA,eAAK,EAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACnC,UAAU,EAAE,IAAA,mBAAS,EAAC,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACtE,MAAM,EAAE,IAAA,cAAI,EAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnD,OAAO,EAAE,IAAA,iBAAO,EAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,SAAS,EAAE,IAAA,cAAI,EAAC,YAAY,CAAC;IAC7B,SAAS,EAAE,IAAA,mBAAS,EAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACvD,OAAO,EAAE;SACT,UAAU,EAAE;CAChB,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,IAAA,eAAK,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;CACvD,CAAC,CACH,CAAC"}
|
package/dist/cjs/repository.d.ts
CHANGED
|
@@ -2,12 +2,15 @@ import { Aggregate, Repository, Mapper, Criteria, PaginatedResult } from "@woltz
|
|
|
2
2
|
import { DrizzleClient, DrizzleUnitOfWork } from "./unit-of-work";
|
|
3
3
|
import { DrizzleToPersistence } from "./mappers/to-persistence";
|
|
4
4
|
import { SearchableField } from "./query-builder";
|
|
5
|
-
|
|
5
|
+
import { DrizzleOutboxStore } from "./outbox-store";
|
|
6
|
+
export interface DrizzleRepositoryConfig<TDomain extends Aggregate<any>, TPersistence, TDb extends DrizzleClient = DrizzleClient> {
|
|
6
7
|
db: TDb;
|
|
7
8
|
table: any;
|
|
8
9
|
toDomainMapper: Mapper<TPersistence, TDomain>;
|
|
9
10
|
toPersistenceMapper: DrizzleToPersistence<TDomain, TDb>;
|
|
10
11
|
uow: DrizzleUnitOfWork;
|
|
12
|
+
/** Optional outbox store for auto-saving domain events in the same transaction. */
|
|
13
|
+
outboxStore?: DrizzleOutboxStore;
|
|
11
14
|
}
|
|
12
15
|
export declare abstract class DrizzleRepository<TDomain extends Aggregate<any>, TPersistence, TDb extends DrizzleClient = DrizzleClient> extends Repository<TDomain> {
|
|
13
16
|
protected readonly db: TDb;
|
|
@@ -15,6 +18,7 @@ export declare abstract class DrizzleRepository<TDomain extends Aggregate<any>,
|
|
|
15
18
|
protected readonly toDomainMapper: Mapper<TPersistence, TDomain>;
|
|
16
19
|
protected readonly toPersistenceMapper: DrizzleToPersistence<TDomain, TDb>;
|
|
17
20
|
protected readonly uow: DrizzleUnitOfWork;
|
|
21
|
+
private readonly outboxStore?;
|
|
18
22
|
constructor(config: DrizzleRepositoryConfig<TDomain, TPersistence, TDb>);
|
|
19
23
|
/**
|
|
20
24
|
* Returns tx from UOWStorage if inside a transaction, otherwise the raw db.
|
|
@@ -37,7 +41,26 @@ export declare abstract class DrizzleRepository<TDomain extends Aggregate<any>,
|
|
|
37
41
|
findManyByIds(ids: string[]): Promise<TDomain[]>;
|
|
38
42
|
count(criteria?: Criteria<TDomain>): Promise<number>;
|
|
39
43
|
exists(id: string): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Save entity (create or update).
|
|
46
|
+
* Uses change tracking to determine what changed.
|
|
47
|
+
*
|
|
48
|
+
* If an {@link DrizzleOutboxStore} is configured, uncommitted domain events
|
|
49
|
+
* are extracted from the aggregate and saved to the outbox table in the
|
|
50
|
+
* same transaction context (guaranteeing atomicity).
|
|
51
|
+
*/
|
|
40
52
|
save(entity: TDomain): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Extract uncommitted domain events from an aggregate.
|
|
55
|
+
* Uses duck-typing to avoid importing BaseAggregate from core,
|
|
56
|
+
* keeping the adapter loosely coupled.
|
|
57
|
+
*
|
|
58
|
+
* **Important:** events are NOT cleared from the aggregate here.
|
|
59
|
+
* The outbox is a *copy* — `dispatchAll()` still publishes immediately
|
|
60
|
+
* via the event bus, and the publisher only picks up events that were
|
|
61
|
+
* never dispatched (or whose immediate publish failed).
|
|
62
|
+
*/
|
|
63
|
+
private extractEvents;
|
|
41
64
|
delete(entity: TDomain): Promise<void>;
|
|
42
65
|
deleteById(id: string): Promise<void>;
|
|
43
66
|
transaction<T>(work: () => Promise<T>): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,UAAU,EACV,MAAM,EACN,QAAQ,EACR,eAAe,
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/repository.js
CHANGED
|
@@ -12,6 +12,7 @@ class DrizzleRepository extends rich_domain_1.Repository {
|
|
|
12
12
|
toDomainMapper;
|
|
13
13
|
toPersistenceMapper;
|
|
14
14
|
uow;
|
|
15
|
+
outboxStore;
|
|
15
16
|
constructor(config) {
|
|
16
17
|
super();
|
|
17
18
|
this.db = config.db;
|
|
@@ -19,6 +20,7 @@ class DrizzleRepository extends rich_domain_1.Repository {
|
|
|
19
20
|
this.toDomainMapper = config.toDomainMapper;
|
|
20
21
|
this.toPersistenceMapper = config.toPersistenceMapper;
|
|
21
22
|
this.uow = config.uow;
|
|
23
|
+
this.outboxStore = config.outboxStore;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
26
|
* Returns tx from UOWStorage if inside a transaction, otherwise the raw db.
|
|
@@ -140,9 +142,42 @@ class DrizzleRepository extends rich_domain_1.Repository {
|
|
|
140
142
|
.where((0, drizzle_orm_1.eq)(this.table.id, id));
|
|
141
143
|
return Number(result[0]?.value ?? 0) > 0;
|
|
142
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Save entity (create or update).
|
|
147
|
+
* Uses change tracking to determine what changed.
|
|
148
|
+
*
|
|
149
|
+
* If an {@link DrizzleOutboxStore} is configured, uncommitted domain events
|
|
150
|
+
* are extracted from the aggregate and saved to the outbox table in the
|
|
151
|
+
* same transaction context (guaranteeing atomicity).
|
|
152
|
+
*/
|
|
143
153
|
async save(entity) {
|
|
154
|
+
// Extract uncommitted events BEFORE the mapper mutates the aggregate state.
|
|
155
|
+
const events = this.extractEvents(entity);
|
|
144
156
|
await this.toPersistenceMapper.build(entity);
|
|
145
157
|
entity.markAsPersisted();
|
|
158
|
+
// Auto-save events to outbox — uses the same transactional client
|
|
159
|
+
// if inside a DrizzleUnitOfWork transaction.
|
|
160
|
+
if (events.length > 0 && this.outboxStore) {
|
|
161
|
+
await this.outboxStore.save(events);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Extract uncommitted domain events from an aggregate.
|
|
166
|
+
* Uses duck-typing to avoid importing BaseAggregate from core,
|
|
167
|
+
* keeping the adapter loosely coupled.
|
|
168
|
+
*
|
|
169
|
+
* **Important:** events are NOT cleared from the aggregate here.
|
|
170
|
+
* The outbox is a *copy* — `dispatchAll()` still publishes immediately
|
|
171
|
+
* via the event bus, and the publisher only picks up events that were
|
|
172
|
+
* never dispatched (or whose immediate publish failed).
|
|
173
|
+
*/
|
|
174
|
+
extractEvents(entity) {
|
|
175
|
+
if (typeof entity.hasUncommittedEvents === "function" &&
|
|
176
|
+
typeof entity.getUncommittedEvents === "function" &&
|
|
177
|
+
entity.hasUncommittedEvents()) {
|
|
178
|
+
return entity.getUncommittedEvents();
|
|
179
|
+
}
|
|
180
|
+
return [];
|
|
146
181
|
}
|
|
147
182
|
async delete(entity) {
|
|
148
183
|
const id = entity.id.value;
|