@travetto/model 5.0.13 → 5.0.15
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/LICENSE +1 -1
- package/package.json +7 -7
- package/src/error/not-found.ts +1 -1
- package/src/internal/service/expiry.ts +0 -19
- package/support/test/expiry.ts +21 -20
- package/support/test/polymorphism.ts +5 -5
package/LICENSE
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@travetto/model",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.15",
|
|
4
4
|
"description": "Datastore abstraction for core operations.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"datastore",
|
|
@@ -26,14 +26,14 @@
|
|
|
26
26
|
"directory": "module/model"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@travetto/config": "^5.0.
|
|
30
|
-
"@travetto/di": "^5.0.
|
|
31
|
-
"@travetto/registry": "^5.0.
|
|
32
|
-
"@travetto/schema": "^5.0.
|
|
29
|
+
"@travetto/config": "^5.0.14",
|
|
30
|
+
"@travetto/di": "^5.0.14",
|
|
31
|
+
"@travetto/registry": "^5.0.14",
|
|
32
|
+
"@travetto/schema": "^5.0.14"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@travetto/cli": "^5.0.
|
|
36
|
-
"@travetto/test": "^5.0.
|
|
35
|
+
"@travetto/cli": "^5.0.17",
|
|
36
|
+
"@travetto/test": "^5.0.16"
|
|
37
37
|
},
|
|
38
38
|
"peerDependenciesMeta": {
|
|
39
39
|
"@travetto/cli": {
|
package/src/error/not-found.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Class, AppError } from '@travetto/runtime';
|
|
|
4
4
|
* Represents when a model of cls and id cannot be found
|
|
5
5
|
*/
|
|
6
6
|
export class NotFoundError extends AppError {
|
|
7
|
-
constructor(cls: Class | string, id: string, details
|
|
7
|
+
constructor(cls: Class | string, id: string, details: Record<string, unknown> = {}) {
|
|
8
8
|
super(`${typeof cls === 'string' ? cls : cls.name} with id ${id} not found`, { category: 'notfound', details });
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -3,7 +3,6 @@ import { ShutdownManager, Class, TimeSpan, TimeUtil, Util, castTo } from '@trave
|
|
|
3
3
|
import { ModelRegistry } from '../../registry/model';
|
|
4
4
|
import { ModelExpirySupport } from '../../service/expiry';
|
|
5
5
|
import { ModelType } from '../../types/model';
|
|
6
|
-
import { NotFoundError } from '../../error/not-found';
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Utils for model expiry
|
|
@@ -44,22 +43,4 @@ export class ModelExpiryUtil {
|
|
|
44
43
|
})();
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Simple cull operation for a given model type
|
|
50
|
-
* @param svc
|
|
51
|
-
*/
|
|
52
|
-
static async naiveDeleteExpired<T extends ModelType>(svc: ModelExpirySupport, cls: Class<T>, suppressErrors = false): Promise<number> {
|
|
53
|
-
const deleting = [];
|
|
54
|
-
for await (const el of svc.list(cls)) {
|
|
55
|
-
if (this.getExpiryState(cls, el).expired) {
|
|
56
|
-
deleting.push(svc.delete(cls, el.id).catch(err => {
|
|
57
|
-
if (!suppressErrors && !(err instanceof NotFoundError)) {
|
|
58
|
-
throw err;
|
|
59
|
-
}
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return (await Promise.all(deleting)).length;
|
|
64
|
-
}
|
|
65
46
|
}
|
package/support/test/expiry.ts
CHANGED
|
@@ -11,10 +11,11 @@ import { NotFoundError } from '../../src/error/not-found';
|
|
|
11
11
|
import { BaseModelSuite } from './base';
|
|
12
12
|
|
|
13
13
|
@Model('expiry-user')
|
|
14
|
-
class
|
|
14
|
+
export class ExpiryUser {
|
|
15
15
|
id: string;
|
|
16
16
|
@ExpiresAt()
|
|
17
17
|
expiresAt?: Date;
|
|
18
|
+
payload?: string;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
@Suite()
|
|
@@ -33,63 +34,63 @@ export abstract class ModelExpirySuite extends BaseModelSuite<ModelExpirySupport
|
|
|
33
34
|
@Test()
|
|
34
35
|
async basic() {
|
|
35
36
|
const service = await this.service;
|
|
36
|
-
const res = await service.upsert(
|
|
37
|
+
const res = await service.upsert(ExpiryUser, ExpiryUser.from({
|
|
37
38
|
expiresAt: this.timeFromNow('2s')
|
|
38
39
|
}));
|
|
39
|
-
assert(res instanceof
|
|
40
|
+
assert(res instanceof ExpiryUser);
|
|
40
41
|
|
|
41
|
-
const expiry = ModelExpiryUtil.getExpiryState(
|
|
42
|
+
const expiry = ModelExpiryUtil.getExpiryState(ExpiryUser, await service.get(ExpiryUser, res.id));
|
|
42
43
|
assert(!expiry.expired);
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
@Test()
|
|
46
47
|
async aging() {
|
|
47
48
|
const service = await this.service;
|
|
48
|
-
const res = await service.upsert(
|
|
49
|
+
const res = await service.upsert(ExpiryUser, ExpiryUser.from({
|
|
49
50
|
expiresAt: this.timeFromNow(100)
|
|
50
51
|
}));
|
|
51
52
|
|
|
52
|
-
assert(res instanceof
|
|
53
|
+
assert(res instanceof ExpiryUser);
|
|
53
54
|
|
|
54
55
|
await this.wait(200);
|
|
55
56
|
|
|
56
|
-
await assert.rejects(() => service.get(
|
|
57
|
+
await assert.rejects(() => service.get(ExpiryUser, res.id), NotFoundError);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
@Test()
|
|
60
61
|
async updateExpired() {
|
|
61
62
|
const service = await this.service;
|
|
62
|
-
const res = await service.upsert(
|
|
63
|
+
const res = await service.upsert(ExpiryUser, ExpiryUser.from({
|
|
63
64
|
expiresAt: this.timeFromNow(100)
|
|
64
65
|
}));
|
|
65
66
|
|
|
66
|
-
assert(res instanceof
|
|
67
|
+
assert(res instanceof ExpiryUser);
|
|
67
68
|
|
|
68
69
|
await this.wait(200);
|
|
69
70
|
|
|
70
|
-
await assert.rejects(() => service.update(
|
|
71
|
+
await assert.rejects(() => service.update(ExpiryUser, ExpiryUser.from({ id: res.id })), NotFoundError);
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
@Test()
|
|
74
75
|
async ageWithExtension() {
|
|
75
76
|
const service = await this.service;
|
|
76
|
-
const res = await service.upsert(
|
|
77
|
+
const res = await service.upsert(ExpiryUser, ExpiryUser.from({
|
|
77
78
|
expiresAt: this.timeFromNow('2s')
|
|
78
79
|
}));
|
|
79
|
-
assert(res instanceof
|
|
80
|
+
assert(res instanceof ExpiryUser);
|
|
80
81
|
|
|
81
82
|
await this.wait(50);
|
|
82
83
|
|
|
83
|
-
assert(!ModelExpiryUtil.getExpiryState(
|
|
84
|
+
assert(!ModelExpiryUtil.getExpiryState(ExpiryUser, (await service.get(ExpiryUser, res.id))).expired);
|
|
84
85
|
|
|
85
|
-
await service.updatePartial(
|
|
86
|
+
await service.updatePartial(ExpiryUser, {
|
|
86
87
|
id: res.id,
|
|
87
88
|
expiresAt: this.timeFromNow(100)
|
|
88
89
|
});
|
|
89
90
|
|
|
90
91
|
await this.wait(200);
|
|
91
92
|
|
|
92
|
-
await assert.rejects(() => service.get(
|
|
93
|
+
await assert.rejects(() => service.get(ExpiryUser, res.id), NotFoundError);
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
@Test()
|
|
@@ -98,12 +99,12 @@ export abstract class ModelExpirySuite extends BaseModelSuite<ModelExpirySupport
|
|
|
98
99
|
|
|
99
100
|
let total;
|
|
100
101
|
|
|
101
|
-
total = await this.getSize(
|
|
102
|
+
total = await this.getSize(ExpiryUser);
|
|
102
103
|
assert(total === 0);
|
|
103
104
|
|
|
104
105
|
// Create
|
|
105
106
|
await Promise.all(
|
|
106
|
-
Array(10).fill(0).map((x, i) => service.upsert(
|
|
107
|
+
Array(10).fill(0).map((x, i) => service.upsert(ExpiryUser, ExpiryUser.from({
|
|
107
108
|
expiresAt: this.timeFromNow(1000 + i * this.delayFactor)
|
|
108
109
|
})))
|
|
109
110
|
);
|
|
@@ -111,16 +112,16 @@ export abstract class ModelExpirySuite extends BaseModelSuite<ModelExpirySupport
|
|
|
111
112
|
// Let expire
|
|
112
113
|
await this.wait(1);
|
|
113
114
|
|
|
114
|
-
total = await this.getSize(
|
|
115
|
+
total = await this.getSize(ExpiryUser);
|
|
115
116
|
assert(total === 10);
|
|
116
117
|
|
|
117
118
|
// Let expire
|
|
118
119
|
await this.wait(1100);
|
|
119
120
|
|
|
120
|
-
total = await this.getSize(
|
|
121
|
+
total = await this.getSize(ExpiryUser);
|
|
121
122
|
assert(total === 0);
|
|
122
123
|
|
|
123
|
-
total = await this.getSize(
|
|
124
|
+
total = await this.getSize(ExpiryUser);
|
|
124
125
|
assert(total === 0);
|
|
125
126
|
}
|
|
126
127
|
}
|
|
@@ -161,13 +161,13 @@ export abstract class ModelPolymorphismSuite extends BaseModelSuite<ModelCrudSup
|
|
|
161
161
|
service.upsert(Doctor, Doctor.from({
|
|
162
162
|
id: fire.id, name: 'gob', specialty: 'eyes'
|
|
163
163
|
})),
|
|
164
|
-
e =>
|
|
164
|
+
e => e instanceof SubTypeNotSupportedError || e instanceof ExistsError
|
|
165
165
|
);
|
|
166
166
|
|
|
167
167
|
await assert.rejects(
|
|
168
168
|
() => service.update(Engineer, castTo(Doctor.from({ ...doc }))),
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
e => e instanceof NotFoundError || e instanceof SubTypeNotSupportedError || e instanceof TypeMismatchError
|
|
170
|
+
);
|
|
171
171
|
await timers.setTimeout(15);
|
|
172
172
|
|
|
173
173
|
try {
|
|
@@ -189,7 +189,7 @@ export abstract class ModelPolymorphismSuite extends BaseModelSuite<ModelCrudSup
|
|
|
189
189
|
// Delete by wrong class
|
|
190
190
|
await assert.rejects(
|
|
191
191
|
() => service.delete(Doctor, fire.id),
|
|
192
|
-
e =>
|
|
192
|
+
e => e instanceof SubTypeNotSupportedError || e instanceof NotFoundError
|
|
193
193
|
);
|
|
194
194
|
|
|
195
195
|
// Delete by base class
|
|
@@ -203,7 +203,7 @@ export abstract class ModelPolymorphismSuite extends BaseModelSuite<ModelCrudSup
|
|
|
203
203
|
// Delete by any subtype when id is missing
|
|
204
204
|
await assert.rejects(
|
|
205
205
|
() => service.delete(Firefighter, doc.id),
|
|
206
|
-
e =>
|
|
206
|
+
e => e instanceof SubTypeNotSupportedError || e instanceof NotFoundError
|
|
207
207
|
);
|
|
208
208
|
}
|
|
209
209
|
|