@woltz/rich-domain 0.2.1
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/.github/workflows/ci.yml +40 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.versionrc.json +21 -0
- package/.vscode/settings.json +3 -0
- package/CHANGELOG.md +81 -0
- package/LICENSE +21 -0
- package/README.md +712 -0
- package/commitlint.config.js +23 -0
- package/dist/base-entity.d.ts +67 -0
- package/dist/base-entity.d.ts.map +1 -0
- package/dist/base-entity.js +309 -0
- package/dist/base-entity.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/criteria.d.ts +60 -0
- package/dist/criteria.d.ts.map +1 -0
- package/dist/criteria.js +214 -0
- package/dist/criteria.js.map +1 -0
- package/dist/deep-proxy.d.ts +34 -0
- package/dist/deep-proxy.d.ts.map +1 -0
- package/dist/deep-proxy.js +297 -0
- package/dist/deep-proxy.js.map +1 -0
- package/dist/domain-event-bus.d.ts +57 -0
- package/dist/domain-event-bus.d.ts.map +1 -0
- package/dist/domain-event-bus.js +112 -0
- package/dist/domain-event-bus.js.map +1 -0
- package/dist/domain-event.d.ts +55 -0
- package/dist/domain-event.d.ts.map +1 -0
- package/dist/domain-event.js +42 -0
- package/dist/domain-event.js.map +1 -0
- package/dist/entity.d.ts +13 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/entity.js +15 -0
- package/dist/entity.js.map +1 -0
- package/dist/filtering.d.ts +107 -0
- package/dist/filtering.d.ts.map +1 -0
- package/dist/filtering.js +202 -0
- package/dist/filtering.js.map +1 -0
- package/dist/id.d.ts +51 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +84 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/ordering.d.ts +93 -0
- package/dist/ordering.d.ts.map +1 -0
- package/dist/ordering.js +154 -0
- package/dist/ordering.js.map +1 -0
- package/dist/paginated-result.d.ts +62 -0
- package/dist/paginated-result.d.ts.map +1 -0
- package/dist/paginated-result.js +201 -0
- package/dist/paginated-result.js.map +1 -0
- package/dist/pagination.d.ts +218 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +281 -0
- package/dist/pagination.js.map +1 -0
- package/dist/repository/base-repository.d.ts +77 -0
- package/dist/repository/base-repository.d.ts.map +1 -0
- package/dist/repository/base-repository.js +80 -0
- package/dist/repository/base-repository.js.map +1 -0
- package/dist/repository/in-memory-repository.d.ts +46 -0
- package/dist/repository/in-memory-repository.d.ts.map +1 -0
- package/dist/repository/in-memory-repository.js +85 -0
- package/dist/repository/in-memory-repository.js.map +1 -0
- package/dist/repository/index.d.ts +42 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/repository/index.js +47 -0
- package/dist/repository/index.js.map +1 -0
- package/dist/repository/mapper.d.ts +56 -0
- package/dist/repository/mapper.d.ts.map +1 -0
- package/dist/repository/mapper.js +15 -0
- package/dist/repository/mapper.js.map +1 -0
- package/dist/repository/types.d.ts +87 -0
- package/dist/repository/types.d.ts.map +1 -0
- package/dist/repository/types.js +6 -0
- package/dist/repository/types.js.map +1 -0
- package/dist/repository/unit-of-work.d.ts +70 -0
- package/dist/repository/unit-of-work.d.ts.map +1 -0
- package/dist/repository/unit-of-work.js +122 -0
- package/dist/repository/unit-of-work.js.map +1 -0
- package/dist/repository.d.ts +2 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +21 -0
- package/dist/repository.js.map +1 -0
- package/dist/specification.d.ts +102 -0
- package/dist/specification.d.ts.map +1 -0
- package/dist/specification.js +187 -0
- package/dist/specification.js.map +1 -0
- package/dist/types/criteria.d.ts +35 -0
- package/dist/types/criteria.d.ts.map +1 -0
- package/dist/types/criteria.js +17 -0
- package/dist/types/criteria.js.map +1 -0
- package/dist/types/domain.d.ts +30 -0
- package/dist/types/domain.d.ts.map +1 -0
- package/dist/types/domain.js +2 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/history-tracker.d.ts +36 -0
- package/dist/types/history-tracker.d.ts.map +1 -0
- package/dist/types/history-tracker.js +2 -0
- package/dist/types/history-tracker.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/repository.d.ts +43 -0
- package/dist/types/repository.d.ts.map +1 -0
- package/dist/types/repository.js +2 -0
- package/dist/types/repository.js.map +1 -0
- package/dist/types/standard-schema.d.ts +15 -0
- package/dist/types/standard-schema.d.ts.map +1 -0
- package/dist/types/standard-schema.js +2 -0
- package/dist/types/standard-schema.js.map +1 -0
- package/dist/types/unit-of-work.d.ts +39 -0
- package/dist/types/unit-of-work.d.ts.map +1 -0
- package/dist/types/unit-of-work.js +2 -0
- package/dist/types/unit-of-work.js.map +1 -0
- package/dist/types/utils.d.ts +14 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +2 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/validation-error.d.ts +42 -0
- package/dist/validation-error.d.ts.map +1 -0
- package/dist/validation-error.js +73 -0
- package/dist/validation-error.js.map +1 -0
- package/dist/value-object.d.ts +47 -0
- package/dist/value-object.d.ts.map +1 -0
- package/dist/value-object.js +136 -0
- package/dist/value-object.js.map +1 -0
- package/eslint.config.js +51 -0
- package/jest.config.js +21 -0
- package/package.json +58 -0
- package/src/base-entity.ts +401 -0
- package/src/constants.ts +7 -0
- package/src/criteria.ts +291 -0
- package/src/deep-proxy.ts +339 -0
- package/src/domain-event-bus.ts +166 -0
- package/src/domain-event.ts +90 -0
- package/src/entity.ts +16 -0
- package/src/id.ts +94 -0
- package/src/index.ts +33 -0
- package/src/paginated-result.ts +274 -0
- package/src/repository/base-repository.ts +152 -0
- package/src/repository/in-memory-repository.ts +104 -0
- package/src/repository/index.ts +55 -0
- package/src/repository/mapper.ts +74 -0
- package/src/repository/unit-of-work.ts +148 -0
- package/src/types/criteria.ts +79 -0
- package/src/types/domain.ts +37 -0
- package/src/types/history-tracker.ts +45 -0
- package/src/types/index.ts +7 -0
- package/src/types/repository.ts +51 -0
- package/src/types/standard-schema.ts +19 -0
- package/src/types/unit-of-work.ts +46 -0
- package/src/types/utils.ts +29 -0
- package/src/validation-error.ts +97 -0
- package/src/value-object.ts +187 -0
- package/tests/criteria.test.ts +432 -0
- package/tests/domain-events.test.ts +445 -0
- package/tests/entity-equality.test.ts +487 -0
- package/tests/entity-validation.test.ts +339 -0
- package/tests/entity.test.ts +33 -0
- package/tests/history-tracker.spec.ts +667 -0
- package/tests/id.test.ts +341 -0
- package/tests/repository.test.ts +641 -0
- package/tests/to-json.test.ts +91 -0
- package/tests/utils.ts +151 -0
- package/tests/value-object-validation.test.ts +228 -0
- package/tests/value-objects.test.ts +52 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginated-result.js","sourceRoot":"","sources":["../src/paginated-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type of pagination strategy
|
|
3
|
+
*/
|
|
4
|
+
export type PaginationType = "offset" | "cursor";
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for offset-based pagination
|
|
7
|
+
*/
|
|
8
|
+
export interface OffsetPaginationConfig {
|
|
9
|
+
type: "offset";
|
|
10
|
+
page: number;
|
|
11
|
+
pageSize: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Configuration for cursor-based pagination
|
|
15
|
+
*/
|
|
16
|
+
export interface CursorPaginationConfig {
|
|
17
|
+
type: "cursor";
|
|
18
|
+
cursor?: string;
|
|
19
|
+
pageSize: number;
|
|
20
|
+
direction?: "forward" | "backward";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Union type for all pagination configurations
|
|
24
|
+
*/
|
|
25
|
+
export type PaginationConfig = OffsetPaginationConfig | CursorPaginationConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Represents offset-based pagination (traditional page-based pagination)
|
|
28
|
+
* Uses page number and page size to calculate offset
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const pagination = new OffsetPagination(1, 20); // page 1, 20 items per page
|
|
33
|
+
* const { skip, take } = pagination.getSkipTake();
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare class OffsetPagination {
|
|
37
|
+
private readonly _page;
|
|
38
|
+
private readonly _pageSize;
|
|
39
|
+
constructor(page: number, pageSize: number);
|
|
40
|
+
/**
|
|
41
|
+
* Gets the current page number (1-indexed)
|
|
42
|
+
*/
|
|
43
|
+
get page(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Gets the page size
|
|
46
|
+
*/
|
|
47
|
+
get pageSize(): number;
|
|
48
|
+
/**
|
|
49
|
+
* Gets the type of pagination
|
|
50
|
+
*/
|
|
51
|
+
get type(): PaginationType;
|
|
52
|
+
/**
|
|
53
|
+
* Calculates skip and take values for database queries
|
|
54
|
+
*/
|
|
55
|
+
getSkipTake(): {
|
|
56
|
+
skip: number;
|
|
57
|
+
take: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Returns configuration object for serialization
|
|
61
|
+
*/
|
|
62
|
+
toConfig(): OffsetPaginationConfig;
|
|
63
|
+
/**
|
|
64
|
+
* Applies pagination to an in-memory array
|
|
65
|
+
*/
|
|
66
|
+
apply<T>(items: T[]): T[];
|
|
67
|
+
/**
|
|
68
|
+
* Creates a new OffsetPagination for the next page
|
|
69
|
+
*/
|
|
70
|
+
nextPage(): OffsetPagination;
|
|
71
|
+
/**
|
|
72
|
+
* Creates a new OffsetPagination for the previous page
|
|
73
|
+
*/
|
|
74
|
+
previousPage(): OffsetPagination;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Represents cursor-based pagination
|
|
78
|
+
* Uses a cursor (typically an encoded string) to determine the starting point
|
|
79
|
+
* More efficient for large datasets and real-time data
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const pagination = new CursorPagination('cursor_abc123', 20);
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export declare class CursorPagination {
|
|
87
|
+
private readonly _cursor?;
|
|
88
|
+
private readonly _pageSize;
|
|
89
|
+
private readonly _direction;
|
|
90
|
+
constructor(cursor: string | undefined, pageSize: number, direction?: "forward" | "backward");
|
|
91
|
+
/**
|
|
92
|
+
* Gets the cursor (undefined for first page)
|
|
93
|
+
*/
|
|
94
|
+
get cursor(): string | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Gets the page size
|
|
97
|
+
*/
|
|
98
|
+
get pageSize(): number;
|
|
99
|
+
/**
|
|
100
|
+
* Gets the pagination direction
|
|
101
|
+
*/
|
|
102
|
+
get direction(): "forward" | "backward";
|
|
103
|
+
/**
|
|
104
|
+
* Gets the type of pagination
|
|
105
|
+
*/
|
|
106
|
+
get type(): PaginationType;
|
|
107
|
+
/**
|
|
108
|
+
* Checks if this is the first page (no cursor)
|
|
109
|
+
*/
|
|
110
|
+
isFirstPage(): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Returns configuration object for serialization
|
|
113
|
+
*/
|
|
114
|
+
toConfig(): CursorPaginationConfig;
|
|
115
|
+
/**
|
|
116
|
+
* Creates a new CursorPagination with a different cursor
|
|
117
|
+
*/
|
|
118
|
+
withCursor(cursor: string | undefined): CursorPagination;
|
|
119
|
+
/**
|
|
120
|
+
* Creates a new CursorPagination for backward navigation
|
|
121
|
+
*/
|
|
122
|
+
backward(): CursorPagination;
|
|
123
|
+
/**
|
|
124
|
+
* Creates a new CursorPagination for forward navigation
|
|
125
|
+
*/
|
|
126
|
+
forward(): CursorPagination;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Metadata for offset-based pagination results
|
|
130
|
+
*/
|
|
131
|
+
export interface OffsetPaginationMeta {
|
|
132
|
+
type: "offset";
|
|
133
|
+
page: number;
|
|
134
|
+
pageSize: number;
|
|
135
|
+
total: number;
|
|
136
|
+
totalPages: number;
|
|
137
|
+
hasNextPage: boolean;
|
|
138
|
+
hasPreviousPage: boolean;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Metadata for cursor-based pagination results
|
|
142
|
+
*/
|
|
143
|
+
export interface CursorPaginationMeta {
|
|
144
|
+
type: "cursor";
|
|
145
|
+
pageSize: number;
|
|
146
|
+
hasNextPage: boolean;
|
|
147
|
+
hasPreviousPage: boolean;
|
|
148
|
+
nextCursor?: string;
|
|
149
|
+
previousCursor?: string;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Union type for pagination metadata
|
|
153
|
+
*/
|
|
154
|
+
export type PaginationMeta = OffsetPaginationMeta | CursorPaginationMeta;
|
|
155
|
+
/**
|
|
156
|
+
* Represents a paginated result set
|
|
157
|
+
* Contains the data items and metadata about the pagination
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* const result = new PaginatedResult(users, {
|
|
162
|
+
* type: 'offset',
|
|
163
|
+
* page: 1,
|
|
164
|
+
* pageSize: 20,
|
|
165
|
+
* total: 100,
|
|
166
|
+
* totalPages: 5,
|
|
167
|
+
* hasNextPage: true,
|
|
168
|
+
* hasPreviousPage: false
|
|
169
|
+
* });
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export declare class PaginatedResult<T> {
|
|
173
|
+
private readonly _data;
|
|
174
|
+
private readonly _meta;
|
|
175
|
+
constructor(data: T[], meta: PaginationMeta);
|
|
176
|
+
/**
|
|
177
|
+
* Gets the data items
|
|
178
|
+
*/
|
|
179
|
+
get data(): readonly T[];
|
|
180
|
+
/**
|
|
181
|
+
* Gets the pagination metadata
|
|
182
|
+
*/
|
|
183
|
+
get meta(): PaginationMeta;
|
|
184
|
+
/**
|
|
185
|
+
* Gets the count of items in current page
|
|
186
|
+
*/
|
|
187
|
+
get count(): number;
|
|
188
|
+
/**
|
|
189
|
+
* Checks if there is a next page
|
|
190
|
+
*/
|
|
191
|
+
hasNextPage(): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Checks if there is a previous page
|
|
194
|
+
*/
|
|
195
|
+
hasPreviousPage(): boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Maps the data items to a new type
|
|
198
|
+
*/
|
|
199
|
+
map<U>(fn: (item: T) => U): PaginatedResult<U>;
|
|
200
|
+
/**
|
|
201
|
+
* Converts to plain object for serialization
|
|
202
|
+
*/
|
|
203
|
+
toJson(): {
|
|
204
|
+
data: T[];
|
|
205
|
+
meta: PaginationMeta;
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Creates an offset-based paginated result from an array and pagination config
|
|
209
|
+
* Automatically calculates metadata
|
|
210
|
+
*/
|
|
211
|
+
static fromArray<T>(allItems: T[], pagination: OffsetPagination): PaginatedResult<T>;
|
|
212
|
+
/**
|
|
213
|
+
* Creates a cursor-based paginated result
|
|
214
|
+
* Requires cursors to be calculated externally
|
|
215
|
+
*/
|
|
216
|
+
static fromCursor<T>(data: T[], pagination: CursorPagination, nextCursor?: string, previousCursor?: string): PaginatedResult<T>;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Pagination System
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Provides offset-based and cursor-based pagination capabilities
|
|
6
|
+
// Can be used for in-memory pagination or converted to database-specific queries
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PaginatedResult = exports.CursorPagination = exports.OffsetPagination = void 0;
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// OffsetPagination Class
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Represents offset-based pagination (traditional page-based pagination)
|
|
14
|
+
* Uses page number and page size to calculate offset
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const pagination = new OffsetPagination(1, 20); // page 1, 20 items per page
|
|
19
|
+
* const { skip, take } = pagination.getSkipTake();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
class OffsetPagination {
|
|
23
|
+
constructor(page, pageSize) {
|
|
24
|
+
if (page < 1) {
|
|
25
|
+
throw new Error("Page must be greater than or equal to 1");
|
|
26
|
+
}
|
|
27
|
+
if (pageSize < 1) {
|
|
28
|
+
throw new Error("Page size must be greater than or equal to 1");
|
|
29
|
+
}
|
|
30
|
+
this._page = page;
|
|
31
|
+
this._pageSize = pageSize;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Gets the current page number (1-indexed)
|
|
35
|
+
*/
|
|
36
|
+
get page() {
|
|
37
|
+
return this._page;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Gets the page size
|
|
41
|
+
*/
|
|
42
|
+
get pageSize() {
|
|
43
|
+
return this._pageSize;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gets the type of pagination
|
|
47
|
+
*/
|
|
48
|
+
get type() {
|
|
49
|
+
return "offset";
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Calculates skip and take values for database queries
|
|
53
|
+
*/
|
|
54
|
+
getSkipTake() {
|
|
55
|
+
return {
|
|
56
|
+
skip: (this._page - 1) * this._pageSize,
|
|
57
|
+
take: this._pageSize,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns configuration object for serialization
|
|
62
|
+
*/
|
|
63
|
+
toConfig() {
|
|
64
|
+
return {
|
|
65
|
+
type: "offset",
|
|
66
|
+
page: this._page,
|
|
67
|
+
pageSize: this._pageSize,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Applies pagination to an in-memory array
|
|
72
|
+
*/
|
|
73
|
+
apply(items) {
|
|
74
|
+
const { skip, take } = this.getSkipTake();
|
|
75
|
+
return items.slice(skip, skip + take);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Creates a new OffsetPagination for the next page
|
|
79
|
+
*/
|
|
80
|
+
nextPage() {
|
|
81
|
+
return new OffsetPagination(this._page + 1, this._pageSize);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates a new OffsetPagination for the previous page
|
|
85
|
+
*/
|
|
86
|
+
previousPage() {
|
|
87
|
+
if (this._page <= 1) {
|
|
88
|
+
throw new Error("Already on first page");
|
|
89
|
+
}
|
|
90
|
+
return new OffsetPagination(this._page - 1, this._pageSize);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.OffsetPagination = OffsetPagination;
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// CursorPagination Class
|
|
96
|
+
// ============================================================================
|
|
97
|
+
/**
|
|
98
|
+
* Represents cursor-based pagination
|
|
99
|
+
* Uses a cursor (typically an encoded string) to determine the starting point
|
|
100
|
+
* More efficient for large datasets and real-time data
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const pagination = new CursorPagination('cursor_abc123', 20);
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
class CursorPagination {
|
|
108
|
+
constructor(cursor, pageSize, direction = "forward") {
|
|
109
|
+
if (pageSize < 1) {
|
|
110
|
+
throw new Error("Page size must be greater than or equal to 1");
|
|
111
|
+
}
|
|
112
|
+
this._cursor = cursor;
|
|
113
|
+
this._pageSize = pageSize;
|
|
114
|
+
this._direction = direction;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Gets the cursor (undefined for first page)
|
|
118
|
+
*/
|
|
119
|
+
get cursor() {
|
|
120
|
+
return this._cursor;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Gets the page size
|
|
124
|
+
*/
|
|
125
|
+
get pageSize() {
|
|
126
|
+
return this._pageSize;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Gets the pagination direction
|
|
130
|
+
*/
|
|
131
|
+
get direction() {
|
|
132
|
+
return this._direction;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gets the type of pagination
|
|
136
|
+
*/
|
|
137
|
+
get type() {
|
|
138
|
+
return "cursor";
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Checks if this is the first page (no cursor)
|
|
142
|
+
*/
|
|
143
|
+
isFirstPage() {
|
|
144
|
+
return this._cursor === undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Returns configuration object for serialization
|
|
148
|
+
*/
|
|
149
|
+
toConfig() {
|
|
150
|
+
return {
|
|
151
|
+
type: "cursor",
|
|
152
|
+
cursor: this._cursor,
|
|
153
|
+
pageSize: this._pageSize,
|
|
154
|
+
direction: this._direction,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Creates a new CursorPagination with a different cursor
|
|
159
|
+
*/
|
|
160
|
+
withCursor(cursor) {
|
|
161
|
+
return new CursorPagination(cursor, this._pageSize, this._direction);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Creates a new CursorPagination for backward navigation
|
|
165
|
+
*/
|
|
166
|
+
backward() {
|
|
167
|
+
return new CursorPagination(this._cursor, this._pageSize, "backward");
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Creates a new CursorPagination for forward navigation
|
|
171
|
+
*/
|
|
172
|
+
forward() {
|
|
173
|
+
return new CursorPagination(this._cursor, this._pageSize, "forward");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.CursorPagination = CursorPagination;
|
|
177
|
+
/**
|
|
178
|
+
* Represents a paginated result set
|
|
179
|
+
* Contains the data items and metadata about the pagination
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const result = new PaginatedResult(users, {
|
|
184
|
+
* type: 'offset',
|
|
185
|
+
* page: 1,
|
|
186
|
+
* pageSize: 20,
|
|
187
|
+
* total: 100,
|
|
188
|
+
* totalPages: 5,
|
|
189
|
+
* hasNextPage: true,
|
|
190
|
+
* hasPreviousPage: false
|
|
191
|
+
* });
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
class PaginatedResult {
|
|
195
|
+
constructor(data, meta) {
|
|
196
|
+
this._data = data;
|
|
197
|
+
this._meta = meta;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Gets the data items
|
|
201
|
+
*/
|
|
202
|
+
get data() {
|
|
203
|
+
return this._data;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Gets the pagination metadata
|
|
207
|
+
*/
|
|
208
|
+
get meta() {
|
|
209
|
+
return this._meta;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Gets the count of items in current page
|
|
213
|
+
*/
|
|
214
|
+
get count() {
|
|
215
|
+
return this._data.length;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Checks if there is a next page
|
|
219
|
+
*/
|
|
220
|
+
hasNextPage() {
|
|
221
|
+
return this._meta.hasNextPage;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Checks if there is a previous page
|
|
225
|
+
*/
|
|
226
|
+
hasPreviousPage() {
|
|
227
|
+
return this._meta.hasPreviousPage;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Maps the data items to a new type
|
|
231
|
+
*/
|
|
232
|
+
map(fn) {
|
|
233
|
+
return new PaginatedResult(this._data.map(fn), this._meta);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Converts to plain object for serialization
|
|
237
|
+
*/
|
|
238
|
+
toJson() {
|
|
239
|
+
return {
|
|
240
|
+
data: this._data,
|
|
241
|
+
meta: this._meta,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Creates an offset-based paginated result from an array and pagination config
|
|
246
|
+
* Automatically calculates metadata
|
|
247
|
+
*/
|
|
248
|
+
static fromArray(allItems, pagination) {
|
|
249
|
+
const { skip, take } = pagination.getSkipTake();
|
|
250
|
+
const data = allItems.slice(skip, skip + take);
|
|
251
|
+
const total = allItems.length;
|
|
252
|
+
const totalPages = Math.ceil(total / pagination.pageSize);
|
|
253
|
+
const meta = {
|
|
254
|
+
type: "offset",
|
|
255
|
+
page: pagination.page,
|
|
256
|
+
pageSize: pagination.pageSize,
|
|
257
|
+
total,
|
|
258
|
+
totalPages,
|
|
259
|
+
hasNextPage: pagination.page < totalPages,
|
|
260
|
+
hasPreviousPage: pagination.page > 1,
|
|
261
|
+
};
|
|
262
|
+
return new PaginatedResult(data, meta);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Creates a cursor-based paginated result
|
|
266
|
+
* Requires cursors to be calculated externally
|
|
267
|
+
*/
|
|
268
|
+
static fromCursor(data, pagination, nextCursor, previousCursor) {
|
|
269
|
+
const meta = {
|
|
270
|
+
type: "cursor",
|
|
271
|
+
pageSize: pagination.pageSize,
|
|
272
|
+
hasNextPage: nextCursor !== undefined,
|
|
273
|
+
hasPreviousPage: previousCursor !== undefined,
|
|
274
|
+
nextCursor,
|
|
275
|
+
previousCursor,
|
|
276
|
+
};
|
|
277
|
+
return new PaginatedResult(data, meta);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.PaginatedResult = PaginatedResult;
|
|
281
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Id } from "../id";
|
|
2
|
+
import type { Aggregate } from "../entity";
|
|
3
|
+
import type { Criteria } from "../criteria";
|
|
4
|
+
import { PaginatedResult } from "../paginated-result";
|
|
5
|
+
import type { IRepository } from "../types";
|
|
6
|
+
import type { IMapper } from "./mapper";
|
|
7
|
+
/**
|
|
8
|
+
* Abstract base repository
|
|
9
|
+
* Implements common logic, delegates persistence to subclasses
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* class UserRepository extends BaseRepository<User, PrismaUser> {
|
|
14
|
+
* constructor(prisma: PrismaClient) {
|
|
15
|
+
* super(new UserMapper());
|
|
16
|
+
* this.prisma = prisma;
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* protected async insertOne(data: PrismaUser): Promise<PrismaUser> {
|
|
20
|
+
* return this.prisma.user.create({ data });
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* protected async updateOne(id: string, data: PrismaUser): Promise<PrismaUser> {
|
|
24
|
+
* return this.prisma.user.update({ where: { id }, data });
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* // ... implement other abstract methods
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare abstract class BaseRepository<TDomain extends Aggregate<any>, TPersistence = any> implements IRepository<TDomain> {
|
|
32
|
+
protected readonly mapper: IMapper<TDomain, TPersistence>;
|
|
33
|
+
constructor(mapper: IMapper<TDomain, TPersistence>);
|
|
34
|
+
/**
|
|
35
|
+
* Insert new record in database
|
|
36
|
+
*/
|
|
37
|
+
protected abstract insertOne(data: TPersistence): Promise<TPersistence>;
|
|
38
|
+
/**
|
|
39
|
+
* Update existing record in database
|
|
40
|
+
*/
|
|
41
|
+
protected abstract updateOne(id: string, data: TPersistence): Promise<TPersistence>;
|
|
42
|
+
/**
|
|
43
|
+
* Delete record from database
|
|
44
|
+
*/
|
|
45
|
+
protected abstract deleteOne(id: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Find record by ID in database
|
|
48
|
+
*/
|
|
49
|
+
protected abstract findOneById(id: string): Promise<TDomain | null>;
|
|
50
|
+
/**
|
|
51
|
+
* Find all records in database (no filtering)
|
|
52
|
+
*/
|
|
53
|
+
protected abstract findMany(): Promise<TDomain[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Apply criteria to query (filtering, ordering, pagination)
|
|
56
|
+
* Returns [data, total]
|
|
57
|
+
*/
|
|
58
|
+
protected abstract applyCriteria(criteria: Criteria<TDomain>): Promise<PaginatedResult<TDomain>>;
|
|
59
|
+
/**
|
|
60
|
+
* Count records matching criteria
|
|
61
|
+
*/
|
|
62
|
+
protected abstract countByCriteria(criteria?: Criteria<TDomain>): Promise<number>;
|
|
63
|
+
/**
|
|
64
|
+
* Check if record exists by ID
|
|
65
|
+
*/
|
|
66
|
+
protected abstract existsById(id: string): Promise<boolean>;
|
|
67
|
+
findById(id: Id): Promise<TDomain | null>;
|
|
68
|
+
find(criteria: Criteria<TDomain>): Promise<PaginatedResult<TDomain>>;
|
|
69
|
+
findAll(criteria?: Criteria<TDomain>): Promise<TDomain[]>;
|
|
70
|
+
findOne(criteria: Criteria<TDomain>): Promise<TDomain | null>;
|
|
71
|
+
save(aggregate: TDomain): Promise<void>;
|
|
72
|
+
delete(aggregate: TDomain): Promise<void>;
|
|
73
|
+
deleteById(id: Id): Promise<void>;
|
|
74
|
+
exists(id: Id): Promise<boolean>;
|
|
75
|
+
count(criteria?: Criteria<TDomain>): Promise<number>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=base-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-repository.d.ts","sourceRoot":"","sources":["../../src/repository/base-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8BAAsB,cAAc,CAClC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9B,YAAY,GAAG,GAAG,CAClB,YAAW,WAAW,CAAC,OAAO,CAAC;IAEnB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;gBAAtC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;IAMrE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAEvE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,YAAY,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAEnE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAEjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAC9B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAC1B,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,CAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAMzC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAIpE,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAUzD,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAQ7D,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAG3D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Base Repository - Abstract implementation with common logic
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base repository
|
|
6
|
+
* Implements common logic, delegates persistence to subclasses
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* class UserRepository extends BaseRepository<User, PrismaUser> {
|
|
11
|
+
* constructor(prisma: PrismaClient) {
|
|
12
|
+
* super(new UserMapper());
|
|
13
|
+
* this.prisma = prisma;
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* protected async insertOne(data: PrismaUser): Promise<PrismaUser> {
|
|
17
|
+
* return this.prisma.user.create({ data });
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* protected async updateOne(id: string, data: PrismaUser): Promise<PrismaUser> {
|
|
21
|
+
* return this.prisma.user.update({ where: { id }, data });
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* // ... implement other abstract methods
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export class BaseRepository {
|
|
29
|
+
constructor(mapper) {
|
|
30
|
+
this.mapper = mapper;
|
|
31
|
+
}
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Public API - Implemented using abstract methods
|
|
34
|
+
// ============================================================================
|
|
35
|
+
async findById(id) {
|
|
36
|
+
const domain = await this.findOneById(id.value);
|
|
37
|
+
if (!domain)
|
|
38
|
+
return null;
|
|
39
|
+
return domain;
|
|
40
|
+
}
|
|
41
|
+
async find(criteria) {
|
|
42
|
+
return await this.applyCriteria(criteria);
|
|
43
|
+
}
|
|
44
|
+
async findAll(criteria) {
|
|
45
|
+
if (criteria) {
|
|
46
|
+
const result = await this.find(criteria);
|
|
47
|
+
return result.data;
|
|
48
|
+
}
|
|
49
|
+
const domains = await this.findMany();
|
|
50
|
+
return domains;
|
|
51
|
+
}
|
|
52
|
+
async findOne(criteria) {
|
|
53
|
+
// Limit to 1 result
|
|
54
|
+
const limitedCriteria = criteria.clone().limit(1);
|
|
55
|
+
const result = await this.find(limitedCriteria);
|
|
56
|
+
return result.data.length > 0 ? result.data[0] : null;
|
|
57
|
+
}
|
|
58
|
+
async save(aggregate) {
|
|
59
|
+
const persistence = this.mapper.toPersistence(aggregate);
|
|
60
|
+
if (aggregate.isNew) {
|
|
61
|
+
await this.insertOne(persistence);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
await this.updateOne(aggregate.id.value, persistence);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async delete(aggregate) {
|
|
68
|
+
await this.deleteOne(aggregate.id.value);
|
|
69
|
+
}
|
|
70
|
+
async deleteById(id) {
|
|
71
|
+
await this.deleteOne(id.value);
|
|
72
|
+
}
|
|
73
|
+
async exists(id) {
|
|
74
|
+
return this.existsById(id.value);
|
|
75
|
+
}
|
|
76
|
+
async count(criteria) {
|
|
77
|
+
return this.countByCriteria(criteria);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=base-repository.js.map
|