@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 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#COMMON)
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#COMMON
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)
@@ -1,5 +1,5 @@
1
1
  export declare enum SettingTypeEnum {
2
- TENANT_COMMON = "COMMON",
2
+ TENANT_COMMON = "common",
3
3
  TENANT = "TENANT",
4
4
  TENANT_GROUP = "GROUP",
5
5
  TENANT_USER = "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"] = "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)('COMMON');
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#COMMON', expect.any(Object));
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#COMMON#CommonListSetting',
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#COMMON#CommonListSetting',
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#COMMON',
143
+ pk: 'SETTING#common',
144
144
  sk: 'UserListSetting',
145
- id: 'SETTING#COMMON#UserListSetting',
145
+ id: 'SETTING#common#UserListSetting',
146
146
  attributes: {},
147
147
  code: 'UserListSetting',
148
148
  version: 1,
149
- tenantCode: 'COMMON',
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#COMMON',
165
+ pk: 'SETTING#common',
166
166
  sk: 'UserListSetting',
167
- id: 'SETTING#COMMON#UserListSetting',
167
+ id: 'SETTING#common#UserListSetting',
168
168
  attributes: {},
169
169
  code: 'UserListSetting',
170
170
  version: 1,
171
- tenantCode: 'COMMON',
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#COMMON',
180
+ pk: 'SETTING#common',
181
181
  sk: 'UserListSetting',
182
- id: 'SETTING#COMMON#UserListSetting',
182
+ id: 'SETTING#common#UserListSetting',
183
183
  attributes: {},
184
184
  code: 'UserListSetting',
185
185
  version: 1,
186
- tenantCode: 'COMMON',
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#COMMON',
196
+ pk: 'SETTING#common',
197
197
  sk: 'UserListSetting',
198
- id: 'SETTING#COMMON#UserListSetting',
198
+ id: 'SETTING#common#UserListSetting',
199
199
  attributes: {},
200
200
  code: 'UserListSetting',
201
201
  version: 1,
202
- tenantCode: 'COMMON',
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#COMMON',
211
+ pk: 'SETTING#common',
212
212
  sk: 'UserListSetting',
213
- id: 'SETTING#COMMON#UserListSetting',
213
+ id: 'SETTING#common#UserListSetting',
214
214
  attributes: {},
215
215
  code: 'UserListSetting',
216
216
  version: 3,
217
- tenantCode: 'COMMON',
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#COMMON',
227
+ pk: 'SETTING#common',
228
228
  sk: 'UserListSetting',
229
- id: 'SETTING#COMMON#UserListSetting',
229
+ id: 'SETTING#common#UserListSetting',
230
230
  attributes: {},
231
231
  code: 'UserListSetting',
232
232
  version: 2,
233
- tenantCode: 'COMMON',
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#COMMON',
239
+ pk: 'SETTING#common',
240
240
  sk: 'UserListSetting',
241
- id: 'SETTING#COMMON#UserListSetting',
241
+ id: 'SETTING#common#UserListSetting',
242
242
  attributes: {},
243
243
  code: 'UserListSetting',
244
244
  version: 3,
245
- tenantCode: 'COMMON',
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#COMMON',
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: 'COMMON',
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#COMMON',
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: 'COMMON',
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#COMMON',
963
+ pk: 'SETTING#common',
964
964
  sk: 'SETTING#RECREATED_SETTING',
965
965
  version: 3,
966
966
  type: 'MASTER',
967
- tenantCode: 'COMMON',
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#COMMON',
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: 'COMMON',
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#COMMON',
1010
+ pk: 'SETTING#common',
1011
1011
  sk: 'SETTING#CYCLED_SETTING',
1012
1012
  version: 7,
1013
1013
  type: 'MASTER',
1014
- tenantCode: 'COMMON',
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#COMMON',
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: 'COMMON',
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.26",
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.26",
47
- "@mbc-cqrs-serverless/sequence": "1.0.26",
48
- "@mbc-cqrs-serverless/task": "1.0.26",
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": "0956dc696475fb769dd134aa619679ba5155e646"
51
+ "gitHead": "f5ce26f50fa1d446a29a5a1771ca107ce426e7bc"
52
52
  }