@mbc-cqrs-serverless/master 1.0.26 → 1.1.0
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/README.md +2 -2
- package/dist/enums/setting.enum.d.ts +1 -1
- package/dist/enums/setting.enum.js +1 -1
- package/dist/integration/ulid.spec.d.ts +19 -0
- package/dist/integration/ulid.spec.js +349 -0
- package/dist/integration/ulid.spec.js.map +1 -0
- package/dist/services/master-data.service.js +1 -1
- package/dist/services/master-data.service.spec.js +1 -1
- package/dist/services/master-setting.service.spec.js +35 -35
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -118,7 +118,7 @@ Settings are resolved in order of specificity (most specific wins):
|
|
|
118
118
|
↓ if not found
|
|
119
119
|
3. Tenant Setting (SETTING#code)
|
|
120
120
|
↓ if not found
|
|
121
|
-
4. Common Setting (pk: SETTING#
|
|
121
|
+
4. Common Setting (pk: SETTING#common)
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
### Example: Theme Setting
|
|
@@ -256,7 +256,7 @@ sk: DATA#[settingCode]#[code]
|
|
|
256
256
|
### Master Setting Key Pattern
|
|
257
257
|
|
|
258
258
|
```
|
|
259
|
-
pk: SETTING#[tenantCode] or SETTING#
|
|
259
|
+
pk: SETTING#[tenantCode] or SETTING#common
|
|
260
260
|
sk: SETTING#[code] (tenant/common)
|
|
261
261
|
SETTING#TENANT_GROUP#[groupId]#[code] (group)
|
|
262
262
|
SETTING#TENANT_USER#[userId]#[code] (user)
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SettingTypeEnum = void 0;
|
|
4
4
|
var SettingTypeEnum;
|
|
5
5
|
(function (SettingTypeEnum) {
|
|
6
|
-
SettingTypeEnum["TENANT_COMMON"] = "
|
|
6
|
+
SettingTypeEnum["TENANT_COMMON"] = "common";
|
|
7
7
|
SettingTypeEnum["TENANT"] = "TENANT";
|
|
8
8
|
SettingTypeEnum["TENANT_GROUP"] = "GROUP";
|
|
9
9
|
SettingTypeEnum["TENANT_USER"] = "USER";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Third-party Integration Tests: ulid
|
|
3
|
+
*
|
|
4
|
+
* This test suite validates the ulid package's input/output behavior
|
|
5
|
+
* to ensure compatibility with the MBC CQRS Serverless framework.
|
|
6
|
+
*
|
|
7
|
+
* Package: ulid (^2.3.0)
|
|
8
|
+
* Purpose: Generate Universally Unique Lexicographically Sortable Identifiers
|
|
9
|
+
*
|
|
10
|
+
* Test coverage:
|
|
11
|
+
* - Basic ULID generation
|
|
12
|
+
* - Sequential ordering guarantee (lexicographic sort)
|
|
13
|
+
* - Monotonic ULID generation
|
|
14
|
+
* - Timestamp decoding
|
|
15
|
+
* - ULID format validation (26 characters, Crockford Base32)
|
|
16
|
+
* - Seed time option
|
|
17
|
+
* - Factory pattern for monotonic IDs
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Third-party Integration Tests: ulid
|
|
4
|
+
*
|
|
5
|
+
* This test suite validates the ulid package's input/output behavior
|
|
6
|
+
* to ensure compatibility with the MBC CQRS Serverless framework.
|
|
7
|
+
*
|
|
8
|
+
* Package: ulid (^2.3.0)
|
|
9
|
+
* Purpose: Generate Universally Unique Lexicographically Sortable Identifiers
|
|
10
|
+
*
|
|
11
|
+
* Test coverage:
|
|
12
|
+
* - Basic ULID generation
|
|
13
|
+
* - Sequential ordering guarantee (lexicographic sort)
|
|
14
|
+
* - Monotonic ULID generation
|
|
15
|
+
* - Timestamp decoding
|
|
16
|
+
* - ULID format validation (26 characters, Crockford Base32)
|
|
17
|
+
* - Seed time option
|
|
18
|
+
* - Factory pattern for monotonic IDs
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
const ulid_1 = require("ulid");
|
|
22
|
+
describe('ulid Integration Tests', () => {
|
|
23
|
+
describe('Basic ULID Generation', () => {
|
|
24
|
+
it('should generate a valid ULID string', () => {
|
|
25
|
+
// Input: No parameters
|
|
26
|
+
// Output: 26-character ULID string
|
|
27
|
+
const id = (0, ulid_1.ulid)();
|
|
28
|
+
expect(typeof id).toBe('string');
|
|
29
|
+
expect(id).toHaveLength(26);
|
|
30
|
+
});
|
|
31
|
+
it('should generate unique IDs on each call', () => {
|
|
32
|
+
// Generate multiple IDs
|
|
33
|
+
const ids = new Set();
|
|
34
|
+
const count = 1000;
|
|
35
|
+
for (let i = 0; i < count; i++) {
|
|
36
|
+
ids.add((0, ulid_1.ulid)());
|
|
37
|
+
}
|
|
38
|
+
// All IDs should be unique
|
|
39
|
+
expect(ids.size).toBe(count);
|
|
40
|
+
});
|
|
41
|
+
it('should generate IDs with Crockford Base32 characters only', () => {
|
|
42
|
+
// Crockford Base32 alphabet (excludes I, L, O, U)
|
|
43
|
+
const crockfordRegex = /^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$/;
|
|
44
|
+
const id = (0, ulid_1.ulid)();
|
|
45
|
+
expect(id).toMatch(crockfordRegex);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('ULID Format Validation', () => {
|
|
49
|
+
it('should have correct structure: 10 chars timestamp + 16 chars randomness', () => {
|
|
50
|
+
const id = (0, ulid_1.ulid)();
|
|
51
|
+
// First 10 characters: timestamp component
|
|
52
|
+
const timestamp = id.substring(0, 10);
|
|
53
|
+
expect(timestamp).toHaveLength(10);
|
|
54
|
+
// Remaining 16 characters: randomness component
|
|
55
|
+
const randomness = id.substring(10);
|
|
56
|
+
expect(randomness).toHaveLength(16);
|
|
57
|
+
});
|
|
58
|
+
it('should generate uppercase characters', () => {
|
|
59
|
+
const id = (0, ulid_1.ulid)();
|
|
60
|
+
// ULID should be uppercase
|
|
61
|
+
expect(id).toBe(id.toUpperCase());
|
|
62
|
+
});
|
|
63
|
+
it('should not contain ambiguous characters (I, L, O, U)', () => {
|
|
64
|
+
// Generate multiple IDs to increase chance of catching issues
|
|
65
|
+
for (let i = 0; i < 100; i++) {
|
|
66
|
+
const id = (0, ulid_1.ulid)();
|
|
67
|
+
expect(id).not.toMatch(/[ILOU]/);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('Lexicographic Sort Order', () => {
|
|
72
|
+
it('should maintain chronological order when sorted lexicographically', async () => {
|
|
73
|
+
const ids = [];
|
|
74
|
+
// Generate IDs with small delays to ensure different timestamps
|
|
75
|
+
for (let i = 0; i < 5; i++) {
|
|
76
|
+
ids.push((0, ulid_1.ulid)());
|
|
77
|
+
// Small delay to ensure different timestamp
|
|
78
|
+
await new Promise((resolve) => setTimeout(resolve, 2));
|
|
79
|
+
}
|
|
80
|
+
const sortedIds = [...ids].sort();
|
|
81
|
+
// Lexicographically sorted IDs should match generation order
|
|
82
|
+
expect(sortedIds).toEqual(ids);
|
|
83
|
+
});
|
|
84
|
+
it('should generate IDs that sort correctly for database queries', () => {
|
|
85
|
+
const oldId = (0, ulid_1.ulid)(Date.now() - 10000); // 10 seconds ago
|
|
86
|
+
const newId = (0, ulid_1.ulid)(); // Now
|
|
87
|
+
// String comparison should maintain chronological order
|
|
88
|
+
expect(oldId < newId).toBe(true);
|
|
89
|
+
// Array sort should put older ID first
|
|
90
|
+
const sorted = [newId, oldId].sort();
|
|
91
|
+
expect(sorted).toEqual([oldId, newId]);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('Monotonic ULID Factory', () => {
|
|
95
|
+
it('should create monotonic IDs within same millisecond', () => {
|
|
96
|
+
const monotonic = (0, ulid_1.monotonicFactory)();
|
|
97
|
+
// Generate IDs rapidly (likely same millisecond)
|
|
98
|
+
const ids = [];
|
|
99
|
+
for (let i = 0; i < 100; i++) {
|
|
100
|
+
ids.push(monotonic());
|
|
101
|
+
}
|
|
102
|
+
// All IDs should be unique
|
|
103
|
+
const uniqueIds = new Set(ids);
|
|
104
|
+
expect(uniqueIds.size).toBe(100);
|
|
105
|
+
// IDs should already be in sorted order (monotonically increasing)
|
|
106
|
+
const sortedIds = [...ids].sort();
|
|
107
|
+
expect(ids).toEqual(sortedIds);
|
|
108
|
+
});
|
|
109
|
+
it('should increment randomness within same millisecond', () => {
|
|
110
|
+
const monotonic = (0, ulid_1.monotonicFactory)();
|
|
111
|
+
// Generate IDs in rapid succession
|
|
112
|
+
const id1 = monotonic();
|
|
113
|
+
const id2 = monotonic();
|
|
114
|
+
const id3 = monotonic();
|
|
115
|
+
// Timestamps may be the same
|
|
116
|
+
const ts1 = id1.substring(0, 10);
|
|
117
|
+
const ts2 = id2.substring(0, 10);
|
|
118
|
+
const ts3 = id3.substring(0, 10);
|
|
119
|
+
if (ts1 === ts2 && ts2 === ts3) {
|
|
120
|
+
// If timestamps are same, randomness should increment
|
|
121
|
+
const rand1 = id1.substring(10);
|
|
122
|
+
const rand2 = id2.substring(10);
|
|
123
|
+
const rand3 = id3.substring(10);
|
|
124
|
+
expect(rand1 < rand2).toBe(true);
|
|
125
|
+
expect(rand2 < rand3).toBe(true);
|
|
126
|
+
}
|
|
127
|
+
// Regardless, IDs should be strictly increasing
|
|
128
|
+
expect(id1 < id2).toBe(true);
|
|
129
|
+
expect(id2 < id3).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it('should maintain ordering across millisecond boundaries', async () => {
|
|
132
|
+
const monotonic = (0, ulid_1.monotonicFactory)();
|
|
133
|
+
const id1 = monotonic();
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
135
|
+
const id2 = monotonic();
|
|
136
|
+
expect(id1 < id2).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
it('should generate monotonic IDs with factory defaults', () => {
|
|
139
|
+
// monotonicFactory without arguments uses Date.now() internally
|
|
140
|
+
const monotonic = (0, ulid_1.monotonicFactory)();
|
|
141
|
+
const ids = [];
|
|
142
|
+
for (let i = 0; i < 10; i++) {
|
|
143
|
+
ids.push(monotonic());
|
|
144
|
+
}
|
|
145
|
+
// All IDs should be unique
|
|
146
|
+
const uniqueIds = new Set(ids);
|
|
147
|
+
expect(uniqueIds.size).toBe(10);
|
|
148
|
+
// IDs should be in sorted order (monotonically increasing)
|
|
149
|
+
expect(ids).toEqual([...ids].sort());
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('Timestamp Decoding', () => {
|
|
153
|
+
it('should decode timestamp from ULID', () => {
|
|
154
|
+
const now = Date.now();
|
|
155
|
+
const id = (0, ulid_1.ulid)(now);
|
|
156
|
+
// Input: ULID string
|
|
157
|
+
// Output: Unix timestamp in milliseconds
|
|
158
|
+
const decodedTime = (0, ulid_1.decodeTime)(id);
|
|
159
|
+
expect(typeof decodedTime).toBe('number');
|
|
160
|
+
expect(decodedTime).toBe(now);
|
|
161
|
+
});
|
|
162
|
+
it('should decode timestamp with millisecond precision', () => {
|
|
163
|
+
const timestamp = 1700000000123; // Specific timestamp with ms
|
|
164
|
+
const id = (0, ulid_1.ulid)(timestamp);
|
|
165
|
+
const decodedTime = (0, ulid_1.decodeTime)(id);
|
|
166
|
+
expect(decodedTime).toBe(timestamp);
|
|
167
|
+
});
|
|
168
|
+
it('should decode timestamps correctly for date range queries', () => {
|
|
169
|
+
const startDate = new Date('2024-01-01T00:00:00.000Z');
|
|
170
|
+
const endDate = new Date('2024-01-02T00:00:00.000Z');
|
|
171
|
+
const startId = (0, ulid_1.ulid)(startDate.getTime());
|
|
172
|
+
const endId = (0, ulid_1.ulid)(endDate.getTime());
|
|
173
|
+
const decodedStart = (0, ulid_1.decodeTime)(startId);
|
|
174
|
+
const decodedEnd = (0, ulid_1.decodeTime)(endId);
|
|
175
|
+
expect(decodedStart).toBe(startDate.getTime());
|
|
176
|
+
expect(decodedEnd).toBe(endDate.getTime());
|
|
177
|
+
expect(decodedEnd - decodedStart).toBe(24 * 60 * 60 * 1000); // 24 hours
|
|
178
|
+
});
|
|
179
|
+
it('should return Date object from decoded timestamp', () => {
|
|
180
|
+
const originalDate = new Date('2024-06-15T12:30:45.678Z');
|
|
181
|
+
const id = (0, ulid_1.ulid)(originalDate.getTime());
|
|
182
|
+
const decodedTime = (0, ulid_1.decodeTime)(id);
|
|
183
|
+
const decodedDate = new Date(decodedTime);
|
|
184
|
+
expect(decodedDate.getTime()).toBe(originalDate.getTime());
|
|
185
|
+
expect(decodedDate.toISOString()).toBe(originalDate.toISOString());
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('Seed Time Option', () => {
|
|
189
|
+
it('should generate ULID with specific timestamp', () => {
|
|
190
|
+
// Input: seedTime parameter (Unix timestamp in milliseconds)
|
|
191
|
+
const seedTime = 1700000000000;
|
|
192
|
+
const id = (0, ulid_1.ulid)(seedTime);
|
|
193
|
+
// Output: ULID with encoded timestamp
|
|
194
|
+
const decodedTime = (0, ulid_1.decodeTime)(id);
|
|
195
|
+
expect(decodedTime).toBe(seedTime);
|
|
196
|
+
});
|
|
197
|
+
it('should generate different IDs with same seed time', () => {
|
|
198
|
+
const seedTime = 1700000000000;
|
|
199
|
+
const id1 = (0, ulid_1.ulid)(seedTime);
|
|
200
|
+
const id2 = (0, ulid_1.ulid)(seedTime);
|
|
201
|
+
// IDs should be different (random component differs)
|
|
202
|
+
expect(id1).not.toBe(id2);
|
|
203
|
+
// But timestamps should be the same
|
|
204
|
+
expect(id1.substring(0, 10)).toBe(id2.substring(0, 10));
|
|
205
|
+
});
|
|
206
|
+
it('should generate IDs in past and future', () => {
|
|
207
|
+
const past = Date.now() - 86400000; // 24 hours ago
|
|
208
|
+
const future = Date.now() + 86400000; // 24 hours from now
|
|
209
|
+
const pastId = (0, ulid_1.ulid)(past);
|
|
210
|
+
const futureId = (0, ulid_1.ulid)(future);
|
|
211
|
+
expect((0, ulid_1.decodeTime)(pastId)).toBe(past);
|
|
212
|
+
expect((0, ulid_1.decodeTime)(futureId)).toBe(future);
|
|
213
|
+
expect(pastId < futureId).toBe(true);
|
|
214
|
+
});
|
|
215
|
+
it('should handle epoch timestamp', () => {
|
|
216
|
+
const epoch = 0; // Unix epoch
|
|
217
|
+
const id = (0, ulid_1.ulid)(epoch);
|
|
218
|
+
expect((0, ulid_1.decodeTime)(id)).toBe(epoch);
|
|
219
|
+
});
|
|
220
|
+
it('should handle max safe timestamp', () => {
|
|
221
|
+
// ULID supports timestamps up to 10889-08-02
|
|
222
|
+
const maxTimestamp = 281474976710655; // 48-bit max value
|
|
223
|
+
const id = (0, ulid_1.ulid)(maxTimestamp);
|
|
224
|
+
expect((0, ulid_1.decodeTime)(id)).toBe(maxTimestamp);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('Performance Characteristics', () => {
|
|
228
|
+
it('should generate ULIDs quickly', () => {
|
|
229
|
+
const count = 10000;
|
|
230
|
+
const start = performance.now();
|
|
231
|
+
for (let i = 0; i < count; i++) {
|
|
232
|
+
(0, ulid_1.ulid)();
|
|
233
|
+
}
|
|
234
|
+
const elapsed = performance.now() - start;
|
|
235
|
+
// Should generate 10000 IDs in less than 2 seconds (relaxed for CI)
|
|
236
|
+
expect(elapsed).toBeLessThan(2000);
|
|
237
|
+
});
|
|
238
|
+
it('should generate monotonic ULIDs quickly', () => {
|
|
239
|
+
const monotonic = (0, ulid_1.monotonicFactory)();
|
|
240
|
+
const count = 10000;
|
|
241
|
+
const start = performance.now();
|
|
242
|
+
for (let i = 0; i < count; i++) {
|
|
243
|
+
monotonic();
|
|
244
|
+
}
|
|
245
|
+
const elapsed = performance.now() - start;
|
|
246
|
+
// Should generate 10000 monotonic IDs in less than 2 seconds (relaxed for CI)
|
|
247
|
+
expect(elapsed).toBeLessThan(2000);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('Collision Resistance', () => {
|
|
251
|
+
it('should have extremely low collision probability', () => {
|
|
252
|
+
const ids = new Set();
|
|
253
|
+
const count = 100000;
|
|
254
|
+
for (let i = 0; i < count; i++) {
|
|
255
|
+
const id = (0, ulid_1.ulid)();
|
|
256
|
+
if (ids.has(id)) {
|
|
257
|
+
fail(`Collision detected at iteration ${i}`);
|
|
258
|
+
}
|
|
259
|
+
ids.add(id);
|
|
260
|
+
}
|
|
261
|
+
expect(ids.size).toBe(count);
|
|
262
|
+
});
|
|
263
|
+
it('should not collide even with same timestamp', () => {
|
|
264
|
+
const seedTime = Date.now();
|
|
265
|
+
const ids = new Set();
|
|
266
|
+
const count = 10000;
|
|
267
|
+
for (let i = 0; i < count; i++) {
|
|
268
|
+
const id = (0, ulid_1.ulid)(seedTime);
|
|
269
|
+
if (ids.has(id)) {
|
|
270
|
+
fail(`Collision detected at iteration ${i} with same timestamp`);
|
|
271
|
+
}
|
|
272
|
+
ids.add(id);
|
|
273
|
+
}
|
|
274
|
+
expect(ids.size).toBe(count);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('Usage Patterns in MBC Framework', () => {
|
|
278
|
+
/**
|
|
279
|
+
* This test demonstrates the pattern used in various services
|
|
280
|
+
* for generating unique identifiers
|
|
281
|
+
*/
|
|
282
|
+
it('should work as task code generator', () => {
|
|
283
|
+
// Pattern used in ImportService, TaskService, etc.
|
|
284
|
+
const taskCode = (0, ulid_1.ulid)();
|
|
285
|
+
expect(taskCode).toHaveLength(26);
|
|
286
|
+
expect(typeof taskCode).toBe('string');
|
|
287
|
+
// Can be used directly in pk/sk
|
|
288
|
+
const pk = `CSV_IMPORT#tenant001`;
|
|
289
|
+
const sk = `building#${taskCode}`;
|
|
290
|
+
const id = `${pk}#${sk}`;
|
|
291
|
+
expect(id).toContain(taskCode);
|
|
292
|
+
});
|
|
293
|
+
it('should work for entity code generation with timestamp tracking', () => {
|
|
294
|
+
const beforeCreation = Date.now();
|
|
295
|
+
const entityCode = (0, ulid_1.ulid)();
|
|
296
|
+
const afterCreation = Date.now();
|
|
297
|
+
// Can extract creation time from code
|
|
298
|
+
const createdAt = (0, ulid_1.decodeTime)(entityCode);
|
|
299
|
+
expect(createdAt).toBeGreaterThanOrEqual(beforeCreation);
|
|
300
|
+
expect(createdAt).toBeLessThanOrEqual(afterCreation);
|
|
301
|
+
});
|
|
302
|
+
it('should enable time-range queries on entity codes', () => {
|
|
303
|
+
// Generate IDs at different times
|
|
304
|
+
const yesterday = Date.now() - 86400000;
|
|
305
|
+
const now = Date.now();
|
|
306
|
+
const oldEntityCode = (0, ulid_1.ulid)(yesterday);
|
|
307
|
+
const newEntityCode = (0, ulid_1.ulid)(now);
|
|
308
|
+
// Can query entities created after certain time
|
|
309
|
+
const queryStartTime = yesterday + 1000;
|
|
310
|
+
const queryStartCode = (0, ulid_1.ulid)(queryStartTime);
|
|
311
|
+
// Only new entity should be after query start
|
|
312
|
+
expect(oldEntityCode < queryStartCode).toBe(true);
|
|
313
|
+
expect(newEntityCode > queryStartCode).toBe(true);
|
|
314
|
+
});
|
|
315
|
+
it('should maintain order for DynamoDB sort keys', () => {
|
|
316
|
+
const monotonic = (0, ulid_1.monotonicFactory)();
|
|
317
|
+
// Generate ordered IDs for sort key
|
|
318
|
+
const skValues = Array.from({ length: 100 }, () => monotonic());
|
|
319
|
+
// Verify DynamoDB BEGINS_WITH would work correctly
|
|
320
|
+
const prefix = 'ITEM#';
|
|
321
|
+
const fullSks = skValues.map((sk) => `${prefix}${sk}`);
|
|
322
|
+
// Lexicographic sort should maintain insertion order
|
|
323
|
+
const sorted = [...fullSks].sort();
|
|
324
|
+
expect(sorted).toEqual(fullSks);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
describe('Edge Cases', () => {
|
|
328
|
+
it('should handle concurrent generation', async () => {
|
|
329
|
+
// Simulate concurrent ULID generation
|
|
330
|
+
const promises = Array.from({ length: 100 }, () => Promise.resolve((0, ulid_1.ulid)()));
|
|
331
|
+
const ids = await Promise.all(promises);
|
|
332
|
+
const uniqueIds = new Set(ids);
|
|
333
|
+
expect(uniqueIds.size).toBe(100);
|
|
334
|
+
});
|
|
335
|
+
it('should handle very old timestamps', () => {
|
|
336
|
+
// Year 2000
|
|
337
|
+
const y2k = new Date('2000-01-01T00:00:00.000Z').getTime();
|
|
338
|
+
const id = (0, ulid_1.ulid)(y2k);
|
|
339
|
+
expect((0, ulid_1.decodeTime)(id)).toBe(y2k);
|
|
340
|
+
});
|
|
341
|
+
it('should handle recent timestamps accurately', () => {
|
|
342
|
+
const recent = Date.now();
|
|
343
|
+
const id = (0, ulid_1.ulid)(recent);
|
|
344
|
+
// Should decode to exact same timestamp
|
|
345
|
+
expect((0, ulid_1.decodeTime)(id)).toBe(recent);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
//# sourceMappingURL=ulid.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ulid.spec.js","sourceRoot":"","sources":["../../src/integration/ulid.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,7 +103,7 @@ let MasterDataService = MasterDataService_1 = class MasterDataService {
|
|
|
103
103
|
pk = (0, helpers_1.generateMasterPk)(tenantCode);
|
|
104
104
|
}
|
|
105
105
|
else {
|
|
106
|
-
pk = (0, helpers_1.generateMasterPk)('
|
|
106
|
+
pk = (0, helpers_1.generateMasterPk)('common');
|
|
107
107
|
}
|
|
108
108
|
const query = { sk: undefined };
|
|
109
109
|
query.sk = {
|
|
@@ -178,7 +178,7 @@ describe('MasterDataService', () => {
|
|
|
178
178
|
};
|
|
179
179
|
dataService.listItemsByPk.mockResolvedValue(mockResponse);
|
|
180
180
|
await service.list(searchDto);
|
|
181
|
-
expect(dataService.listItemsByPk).toHaveBeenCalledWith('MASTER#
|
|
181
|
+
expect(dataService.listItemsByPk).toHaveBeenCalledWith('MASTER#common', expect.any(Object));
|
|
182
182
|
});
|
|
183
183
|
});
|
|
184
184
|
describe('get', () => {
|
|
@@ -120,12 +120,12 @@ describe('SettingService', () => {
|
|
|
120
120
|
});
|
|
121
121
|
it('should return common-level setting if found', async () => {
|
|
122
122
|
jest.spyOn(service, 'getSetting').mockResolvedValueOnce({
|
|
123
|
-
id: 'SETTING#
|
|
123
|
+
id: 'SETTING#common#CommonListSetting',
|
|
124
124
|
settingValue: {},
|
|
125
125
|
});
|
|
126
126
|
const response = await service.getSetting({ code: 'CommonListSetting' }, optionsMock);
|
|
127
127
|
expect(response).toEqual(new entities_1.MasterSettingEntity({
|
|
128
|
-
id: 'SETTING#
|
|
128
|
+
id: 'SETTING#common#CommonListSetting',
|
|
129
129
|
settingValue: {},
|
|
130
130
|
}));
|
|
131
131
|
});
|
|
@@ -140,13 +140,13 @@ describe('SettingService', () => {
|
|
|
140
140
|
const pk = `${constants_1.SETTING_TENANT_PREFIX}${core_1.KEY_SEPARATOR}${enums_1.SettingTypeEnum.TENANT_COMMON}`;
|
|
141
141
|
const sk = settingCode;
|
|
142
142
|
const mockResponse = {
|
|
143
|
-
pk: 'SETTING#
|
|
143
|
+
pk: 'SETTING#common',
|
|
144
144
|
sk: 'UserListSetting',
|
|
145
|
-
id: 'SETTING#
|
|
145
|
+
id: 'SETTING#common#UserListSetting',
|
|
146
146
|
attributes: {},
|
|
147
147
|
code: 'UserListSetting',
|
|
148
148
|
version: 1,
|
|
149
|
-
tenantCode: '
|
|
149
|
+
tenantCode: 'common',
|
|
150
150
|
name: 'UserListSetting',
|
|
151
151
|
type: 'MASTER',
|
|
152
152
|
};
|
|
@@ -162,13 +162,13 @@ describe('SettingService', () => {
|
|
|
162
162
|
attributes: settingValue,
|
|
163
163
|
};
|
|
164
164
|
jest.spyOn(commandService, 'publishAsync').mockResolvedValue({
|
|
165
|
-
pk: 'SETTING#
|
|
165
|
+
pk: 'SETTING#common',
|
|
166
166
|
sk: 'UserListSetting',
|
|
167
|
-
id: 'SETTING#
|
|
167
|
+
id: 'SETTING#common#UserListSetting',
|
|
168
168
|
attributes: {},
|
|
169
169
|
code: 'UserListSetting',
|
|
170
170
|
version: 1,
|
|
171
|
-
tenantCode: '
|
|
171
|
+
tenantCode: 'common',
|
|
172
172
|
name: 'UserListSetting',
|
|
173
173
|
type: 'MASTER',
|
|
174
174
|
});
|
|
@@ -177,13 +177,13 @@ describe('SettingService', () => {
|
|
|
177
177
|
});
|
|
178
178
|
it('should create a new common setting', async () => {
|
|
179
179
|
const mockResponse = {
|
|
180
|
-
pk: 'SETTING#
|
|
180
|
+
pk: 'SETTING#common',
|
|
181
181
|
sk: 'UserListSetting',
|
|
182
|
-
id: 'SETTING#
|
|
182
|
+
id: 'SETTING#common#UserListSetting',
|
|
183
183
|
attributes: {},
|
|
184
184
|
code: 'UserListSetting',
|
|
185
185
|
version: 1,
|
|
186
|
-
tenantCode: '
|
|
186
|
+
tenantCode: 'common',
|
|
187
187
|
name: 'UserListSetting',
|
|
188
188
|
type: 'MASTER',
|
|
189
189
|
};
|
|
@@ -193,13 +193,13 @@ describe('SettingService', () => {
|
|
|
193
193
|
settingValue: {},
|
|
194
194
|
};
|
|
195
195
|
jest.spyOn(commandService, 'publishAsync').mockResolvedValue({
|
|
196
|
-
pk: 'SETTING#
|
|
196
|
+
pk: 'SETTING#common',
|
|
197
197
|
sk: 'UserListSetting',
|
|
198
|
-
id: 'SETTING#
|
|
198
|
+
id: 'SETTING#common#UserListSetting',
|
|
199
199
|
attributes: {},
|
|
200
200
|
code: 'UserListSetting',
|
|
201
201
|
version: 1,
|
|
202
|
-
tenantCode: '
|
|
202
|
+
tenantCode: 'common',
|
|
203
203
|
name: 'UserListSetting',
|
|
204
204
|
type: 'MASTER',
|
|
205
205
|
});
|
|
@@ -208,13 +208,13 @@ describe('SettingService', () => {
|
|
|
208
208
|
});
|
|
209
209
|
it('should create a new common setting with the same code after delete', async () => {
|
|
210
210
|
const mockResponse = {
|
|
211
|
-
pk: 'SETTING#
|
|
211
|
+
pk: 'SETTING#common',
|
|
212
212
|
sk: 'UserListSetting',
|
|
213
|
-
id: 'SETTING#
|
|
213
|
+
id: 'SETTING#common#UserListSetting',
|
|
214
214
|
attributes: {},
|
|
215
215
|
code: 'UserListSetting',
|
|
216
216
|
version: 3,
|
|
217
|
-
tenantCode: '
|
|
217
|
+
tenantCode: 'common',
|
|
218
218
|
name: 'UserListSetting',
|
|
219
219
|
type: 'MASTER',
|
|
220
220
|
};
|
|
@@ -224,25 +224,25 @@ describe('SettingService', () => {
|
|
|
224
224
|
settingValue: {},
|
|
225
225
|
};
|
|
226
226
|
jest.spyOn(dataService, 'getItem').mockResolvedValue({
|
|
227
|
-
pk: 'SETTING#
|
|
227
|
+
pk: 'SETTING#common',
|
|
228
228
|
sk: 'UserListSetting',
|
|
229
|
-
id: 'SETTING#
|
|
229
|
+
id: 'SETTING#common#UserListSetting',
|
|
230
230
|
attributes: {},
|
|
231
231
|
code: 'UserListSetting',
|
|
232
232
|
version: 2,
|
|
233
|
-
tenantCode: '
|
|
233
|
+
tenantCode: 'common',
|
|
234
234
|
name: 'UserListSetting',
|
|
235
235
|
type: 'MASTER',
|
|
236
236
|
isDeleted: true,
|
|
237
237
|
});
|
|
238
238
|
jest.spyOn(commandService, 'publishAsync').mockResolvedValue({
|
|
239
|
-
pk: 'SETTING#
|
|
239
|
+
pk: 'SETTING#common',
|
|
240
240
|
sk: 'UserListSetting',
|
|
241
|
-
id: 'SETTING#
|
|
241
|
+
id: 'SETTING#common#UserListSetting',
|
|
242
242
|
attributes: {},
|
|
243
243
|
code: 'UserListSetting',
|
|
244
244
|
version: 3,
|
|
245
|
-
tenantCode: '
|
|
245
|
+
tenantCode: 'common',
|
|
246
246
|
name: 'UserListSetting',
|
|
247
247
|
type: 'MASTER',
|
|
248
248
|
});
|
|
@@ -844,13 +844,13 @@ describe('SettingService', () => {
|
|
|
844
844
|
const specialCode = 'SETTING_特殊文字@#$%';
|
|
845
845
|
const mockCommonSetting = {
|
|
846
846
|
id: 'test-id',
|
|
847
|
-
pk: 'SETTING#
|
|
847
|
+
pk: 'SETTING#common',
|
|
848
848
|
sk: `SETTING#${specialCode}`,
|
|
849
849
|
code: specialCode,
|
|
850
850
|
name: 'Special Setting',
|
|
851
851
|
version: 1,
|
|
852
852
|
type: 'MASTER',
|
|
853
|
-
tenantCode: '
|
|
853
|
+
tenantCode: 'common',
|
|
854
854
|
isDeleted: false,
|
|
855
855
|
attributes: { special: true },
|
|
856
856
|
createdAt: new Date(),
|
|
@@ -945,13 +945,13 @@ describe('SettingService', () => {
|
|
|
945
945
|
};
|
|
946
946
|
const existingDeletedSetting = {
|
|
947
947
|
id: 'existing-id',
|
|
948
|
-
pk: 'SETTING#
|
|
948
|
+
pk: 'SETTING#common',
|
|
949
949
|
sk: 'SETTING#RECREATED_SETTING',
|
|
950
950
|
code: 'RECREATED_SETTING',
|
|
951
951
|
name: 'RECREATED_SETTING',
|
|
952
952
|
version: 3,
|
|
953
953
|
type: 'MASTER',
|
|
954
|
-
tenantCode: '
|
|
954
|
+
tenantCode: 'common',
|
|
955
955
|
isDeleted: true,
|
|
956
956
|
attributes: { original: true, version: 1 },
|
|
957
957
|
createdAt: new Date('2023-01-01'),
|
|
@@ -960,11 +960,11 @@ describe('SettingService', () => {
|
|
|
960
960
|
dataService.getItem.mockResolvedValue(existingDeletedSetting);
|
|
961
961
|
const mockResponse = {
|
|
962
962
|
id: 'existing-id',
|
|
963
|
-
pk: 'SETTING#
|
|
963
|
+
pk: 'SETTING#common',
|
|
964
964
|
sk: 'SETTING#RECREATED_SETTING',
|
|
965
965
|
version: 3,
|
|
966
966
|
type: 'MASTER',
|
|
967
|
-
tenantCode: '
|
|
967
|
+
tenantCode: 'common',
|
|
968
968
|
name: 'RECREATED_SETTING',
|
|
969
969
|
code: 'RECREATED_SETTING',
|
|
970
970
|
isDeleted: false,
|
|
@@ -992,13 +992,13 @@ describe('SettingService', () => {
|
|
|
992
992
|
};
|
|
993
993
|
const existingDeletedSetting = {
|
|
994
994
|
id: 'existing-id',
|
|
995
|
-
pk: 'SETTING#
|
|
995
|
+
pk: 'SETTING#common',
|
|
996
996
|
sk: 'SETTING#CYCLED_SETTING',
|
|
997
997
|
code: 'CYCLED_SETTING',
|
|
998
998
|
name: 'CYCLED_SETTING',
|
|
999
999
|
version: 7,
|
|
1000
1000
|
type: 'MASTER',
|
|
1001
|
-
tenantCode: '
|
|
1001
|
+
tenantCode: 'common',
|
|
1002
1002
|
isDeleted: true,
|
|
1003
1003
|
attributes: { cycle: 3, previous: true },
|
|
1004
1004
|
createdAt: new Date('2023-01-01'),
|
|
@@ -1007,11 +1007,11 @@ describe('SettingService', () => {
|
|
|
1007
1007
|
dataService.getItem.mockResolvedValue(existingDeletedSetting);
|
|
1008
1008
|
const mockResponse = {
|
|
1009
1009
|
id: 'existing-id',
|
|
1010
|
-
pk: 'SETTING#
|
|
1010
|
+
pk: 'SETTING#common',
|
|
1011
1011
|
sk: 'SETTING#CYCLED_SETTING',
|
|
1012
1012
|
version: 7,
|
|
1013
1013
|
type: 'MASTER',
|
|
1014
|
-
tenantCode: '
|
|
1014
|
+
tenantCode: 'common',
|
|
1015
1015
|
name: 'CYCLED_SETTING',
|
|
1016
1016
|
code: 'CYCLED_SETTING',
|
|
1017
1017
|
isDeleted: false,
|
|
@@ -1284,13 +1284,13 @@ describe('SettingService', () => {
|
|
|
1284
1284
|
const code = 'CONCURRENT_SETTING';
|
|
1285
1285
|
const mockCommonSetting = {
|
|
1286
1286
|
id: 'test-id',
|
|
1287
|
-
pk: 'SETTING#
|
|
1287
|
+
pk: 'SETTING#common',
|
|
1288
1288
|
sk: 'SETTING#CONCURRENT_SETTING',
|
|
1289
1289
|
code: 'CONCURRENT_SETTING',
|
|
1290
1290
|
name: 'Concurrent Setting',
|
|
1291
1291
|
version: 1,
|
|
1292
1292
|
type: 'MASTER',
|
|
1293
|
-
tenantCode: '
|
|
1293
|
+
tenantCode: 'common',
|
|
1294
1294
|
isDeleted: false,
|
|
1295
1295
|
attributes: { concurrent: true },
|
|
1296
1296
|
createdAt: new Date(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mbc-cqrs-serverless/master",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": " Master data management such as setting, sequence, etc.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mbc",
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@mbc-cqrs-serverless/core": "1.0
|
|
47
|
-
"@mbc-cqrs-serverless/sequence": "1.0
|
|
48
|
-
"@mbc-cqrs-serverless/task": "1.0
|
|
46
|
+
"@mbc-cqrs-serverless/core": "1.1.0",
|
|
47
|
+
"@mbc-cqrs-serverless/sequence": "1.1.0",
|
|
48
|
+
"@mbc-cqrs-serverless/task": "1.1.0",
|
|
49
49
|
"ulid": "^2.3.0"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "f5ce26f50fa1d446a29a5a1771ca107ce426e7bc"
|
|
52
52
|
}
|