ts-cache-mongoose 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/cjs/cache/Cache.js.map +1 -1
- package/dist/cjs/cache/engine/MemoryCacheEngine.js.map +1 -1
- package/dist/cjs/cache/engine/RedisCacheEngine.js +13 -1
- package/dist/cjs/cache/engine/RedisCacheEngine.js.map +1 -1
- package/dist/cjs/extend/aggregate.js +3 -3
- package/dist/cjs/extend/aggregate.js.map +1 -1
- package/dist/cjs/extend/query.js +6 -4
- package/dist/cjs/extend/query.js.map +1 -1
- package/dist/cjs/interfaces/IData.js +3 -0
- package/dist/cjs/interfaces/IData.js.map +1 -0
- package/dist/cjs/types/cache/Cache.d.ts +2 -1
- package/dist/cjs/types/cache/Cache.d.ts.map +1 -1
- package/dist/cjs/types/cache/engine/MemoryCacheEngine.d.ts +3 -2
- package/dist/cjs/types/cache/engine/MemoryCacheEngine.d.ts.map +1 -1
- package/dist/cjs/types/cache/engine/RedisCacheEngine.d.ts +2 -1
- package/dist/cjs/types/cache/engine/RedisCacheEngine.d.ts.map +1 -1
- package/dist/cjs/types/extend/query.d.ts.map +1 -1
- package/dist/cjs/types/interfaces/ICacheEngine.d.ts +3 -2
- package/dist/cjs/types/interfaces/ICacheEngine.d.ts.map +1 -1
- package/dist/cjs/types/interfaces/IData.d.ts +3 -0
- package/dist/cjs/types/interfaces/IData.d.ts.map +1 -0
- package/dist/esm/cache/Cache.js.map +1 -1
- package/dist/esm/cache/engine/MemoryCacheEngine.js.map +1 -1
- package/dist/esm/cache/engine/RedisCacheEngine.js +13 -1
- package/dist/esm/cache/engine/RedisCacheEngine.js.map +1 -1
- package/dist/esm/extend/aggregate.js +3 -3
- package/dist/esm/extend/aggregate.js.map +1 -1
- package/dist/esm/extend/query.js +6 -4
- package/dist/esm/extend/query.js.map +1 -1
- package/dist/esm/interfaces/IData.js +2 -0
- package/dist/esm/interfaces/IData.js.map +1 -0
- package/dist/esm/types/cache/Cache.d.ts +2 -1
- package/dist/esm/types/cache/Cache.d.ts.map +1 -1
- package/dist/esm/types/cache/engine/MemoryCacheEngine.d.ts +3 -2
- package/dist/esm/types/cache/engine/MemoryCacheEngine.d.ts.map +1 -1
- package/dist/esm/types/cache/engine/RedisCacheEngine.d.ts +2 -1
- package/dist/esm/types/cache/engine/RedisCacheEngine.d.ts.map +1 -1
- package/dist/esm/types/extend/query.d.ts.map +1 -1
- package/dist/esm/types/interfaces/ICacheEngine.d.ts +3 -2
- package/dist/esm/types/interfaces/ICacheEngine.d.ts.map +1 -1
- package/dist/esm/types/interfaces/IData.d.ts +3 -0
- package/dist/esm/types/interfaces/IData.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/cache/Cache.ts +2 -1
- package/src/cache/engine/MemoryCacheEngine.ts +4 -3
- package/src/cache/engine/RedisCacheEngine.ts +14 -2
- package/src/extend/aggregate.ts +3 -3
- package/src/extend/query.ts +10 -7
- package/src/interfaces/ICacheEngine.ts +4 -2
- package/src/interfaces/IData.ts +3 -0
- package/tests/cache-memory.test.ts +9 -3
- package/tests/cache-redis.test.ts +102 -20
- package/tests/interfaces/IStory.ts +8 -0
- package/tests/interfaces/IUser.ts +4 -0
- package/tests/{crypto.test.ts → key.test.ts} +16 -0
- package/tests/models/Story.ts +4 -0
- package/tests/models/User.ts +4 -0
- package/tests/schemas/StorySchema.ts +18 -0
- package/tests/schemas/UserSchema.ts +6 -0
package/README.md
CHANGED
|
@@ -70,11 +70,13 @@ import cache from 'ts-cache-mongoose'
|
|
|
70
70
|
|
|
71
71
|
// In-memory example
|
|
72
72
|
const cache = cache.init(mongoose, {
|
|
73
|
+
defaultTTL: '60 seconds',
|
|
73
74
|
engine: 'memory',
|
|
74
75
|
})
|
|
75
76
|
|
|
76
77
|
// Redis example
|
|
77
78
|
const cache = cache.init(mongoose, {
|
|
79
|
+
defaultTTL: '60 seconds',
|
|
78
80
|
engine: 'redis',
|
|
79
81
|
engineOptions: {
|
|
80
82
|
host: 'localhost',
|
|
@@ -114,3 +116,8 @@ const books = await Book.aggregate([
|
|
|
114
116
|
}
|
|
115
117
|
]).cache('1 minute').exec()
|
|
116
118
|
```
|
|
119
|
+
|
|
120
|
+
## Check my other projects
|
|
121
|
+
|
|
122
|
+
- [ts-migrate-mongoose](https://github.com/ilovepixelart/ts-migrate-mongoose) - Migration framework for mongoose
|
|
123
|
+
- [ts-patch-mongoose](https://github.com/ilovepixelart/ts-patch-mongoose) - Patch history & events plugin for mongoose
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":";;;AAAA,oDAAmB;
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":";;;AAAA,oDAAmB;AAMnB,2FAA0D;AAC1D,yFAAwD;AAExD,MAAM,WAAW;IAKf,YAAa,YAA2B;QAFvB,YAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;QAGrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,SAAS,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,UAAU,GAAG,IAAA,YAAE,EAAC,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,CAAA;QAE3D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,0BAAgB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,2BAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAY;QAC9F,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,YAAE,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;CACF;AAED,kBAAe,WAAW,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":";;AAGA,MAAM,iBAAiB;IAGrB;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,GAAG,CAAE,GAAW;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,GAAG,CAAE,GAAW,EAAE,KAAY,EAAE,GAAG,GAAG,QAAQ;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IAC1D,CAAC;IAED,GAAG,CAAE,GAAW;QAEd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,KAAK;IAEL,CAAC;CACF;AAED,kBAAe,iBAAiB,CAAA"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
|
|
5
|
+
const mongoose_1 = require("mongoose");
|
|
5
6
|
class RedisCacheEngine {
|
|
6
7
|
constructor(options) {
|
|
7
8
|
if (!options.keyPrefix) {
|
|
@@ -14,7 +15,18 @@ class RedisCacheEngine {
|
|
|
14
15
|
if (value === null) {
|
|
15
16
|
return undefined;
|
|
16
17
|
}
|
|
17
|
-
return JSON.parse(value)
|
|
18
|
+
return JSON.parse(value, (_key, value) => {
|
|
19
|
+
if (typeof value === 'string') {
|
|
20
|
+
const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
21
|
+
if (dateRegex.test(value)) {
|
|
22
|
+
return new Date(value);
|
|
23
|
+
}
|
|
24
|
+
else if (mongoose_1.Types.ObjectId.isValid(value)) {
|
|
25
|
+
return new mongoose_1.Types.ObjectId(value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
});
|
|
18
30
|
}
|
|
19
31
|
async set(key, value, ttl = Infinity) {
|
|
20
32
|
const serializedValue = JSON.stringify(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":";;;AAAA,8DAA6B;AAC7B,uCAAgC;AAMhC,MAAM,gBAAgB;IAGpB,YAAa,OAAqB;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YACtB,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAA;SACtC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,MAAM,SAAS,GAAG,+CAA+C,CAAA;gBACjE,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACzB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;iBACvB;qBAAM,IAAI,gBAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACxC,OAAO,IAAI,gBAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;iBACjC;aACF;YACD,OAAO,KAAgB,CAAA;QACzB,CAAC,CAAiE,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAAc,EAAE,GAAG,GAAG,QAAQ;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,kBAAe,gBAAgB,CAAA"}
|
|
@@ -16,9 +16,9 @@ function extendQuery(mongoose, cache) {
|
|
|
16
16
|
this._key = customKey;
|
|
17
17
|
return this;
|
|
18
18
|
};
|
|
19
|
-
mongoose.Aggregate.prototype.exec = async function () {
|
|
19
|
+
mongoose.Aggregate.prototype.exec = async function (...args) {
|
|
20
20
|
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
21
|
-
return mongooseExec.apply(this);
|
|
21
|
+
return mongooseExec.apply(this, args);
|
|
22
22
|
}
|
|
23
23
|
const key = this.getCacheKey();
|
|
24
24
|
const ttl = this.getCacheTTL();
|
|
@@ -29,7 +29,7 @@ function extendQuery(mongoose, cache) {
|
|
|
29
29
|
return resultCache;
|
|
30
30
|
}
|
|
31
31
|
const result = await mongooseExec.call(this);
|
|
32
|
-
cache.set(key, result, ttl).catch((err) => {
|
|
32
|
+
await cache.set(key, result, ttl).catch((err) => {
|
|
33
33
|
console.error(err);
|
|
34
34
|
});
|
|
35
35
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":";;AAGA,gCAA+B;AAE/B,SAAwB,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAA;IAGtD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAA,YAAM,EAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACJ,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":";;AAGA,gCAA+B;AAE/B,SAAwB,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAA;IAGtD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAA,YAAM,EAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACJ,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,WAAW,GAAG,IAAQ;QAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACvD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACtC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAE9B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,WAAW,EAAE;YACf,OAAO,WAAW,CAAA;SACnB;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAwD,CAAA;QACnG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AA/CD,8BA+CC"}
|
package/dist/cjs/extend/query.js
CHANGED
|
@@ -32,9 +32,9 @@ function extendQuery(mongoose, cache) {
|
|
|
32
32
|
this._key = customKey;
|
|
33
33
|
return this;
|
|
34
34
|
};
|
|
35
|
-
mongoose.Query.prototype.exec = async function () {
|
|
35
|
+
mongoose.Query.prototype.exec = async function (...args) {
|
|
36
36
|
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
37
|
-
return mongooseExec.apply(this);
|
|
37
|
+
return mongooseExec.apply(this, args);
|
|
38
38
|
}
|
|
39
39
|
const key = this.getCacheKey();
|
|
40
40
|
const ttl = this.getCacheTTL();
|
|
@@ -51,14 +51,16 @@ function extendQuery(mongoose, cache) {
|
|
|
51
51
|
}
|
|
52
52
|
const constructor = mongoose.model(model);
|
|
53
53
|
if (Array.isArray(resultCache)) {
|
|
54
|
-
return resultCache.map((item) =>
|
|
54
|
+
return resultCache.map((item) => {
|
|
55
|
+
return constructor.hydrate(item);
|
|
56
|
+
});
|
|
55
57
|
}
|
|
56
58
|
else {
|
|
57
59
|
return constructor.hydrate(resultCache);
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
62
|
const result = await mongooseExec.call(this);
|
|
61
|
-
cache.set(key, result, ttl).catch((err) => {
|
|
63
|
+
await cache.set(key, result, ttl).catch((err) => {
|
|
62
64
|
console.error(err);
|
|
63
65
|
});
|
|
64
66
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":";;AAGA,gCAA+B;AAE/B,SAAwB,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAA;IAGlD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG;QACrC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAA;QAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAE9C,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM;YACN,MAAM;YACN,OAAO;YACP,eAAe;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAA;QAED,OAAO,IAAA,YAAM,EAAC,IAAI,CAAC,CAAA;IACrB,CAAC,CAAA;IAGD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG;QACrC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QACzE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IData.js","sourceRoot":"","sources":["../../../src/interfaces/IData.ts"],"names":[],"mappings":""}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type IData from '../interfaces/IData';
|
|
1
2
|
import type ICacheOptions from '../interfaces/ICacheOptions';
|
|
2
3
|
declare class CacheEngine {
|
|
3
4
|
private engine;
|
|
4
5
|
private defaultTTL;
|
|
5
6
|
private readonly engines;
|
|
6
7
|
constructor(cacheOptions: ICacheOptions);
|
|
7
|
-
get(key: string): Promise<
|
|
8
|
+
get(key: string): Promise<IData>;
|
|
8
9
|
set(key: string, value: Record<string, unknown> | Record<string, unknown>[], ttl?: string): Promise<void>;
|
|
9
10
|
del(key: string): Promise<void>;
|
|
10
11
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/cache/Cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/cache/Cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAE5C,OAAO,KAAK,aAAa,MAAM,6BAA6B,CAAA;AAK5D,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;gBAE1C,YAAY,EAAE,aAAa;IAoBlC,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAIjC,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1G,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type IData from '../../interfaces/IData';
|
|
1
2
|
import type ICacheEngine from '../../interfaces/ICacheEngine';
|
|
2
3
|
declare class MemoryCacheEngine implements ICacheEngine {
|
|
3
4
|
private cache;
|
|
4
5
|
constructor();
|
|
5
|
-
get(key: string):
|
|
6
|
-
set(key: string, value:
|
|
6
|
+
get(key: string): IData;
|
|
7
|
+
set(key: string, value: IData, ttl?: number): void;
|
|
7
8
|
del(key: string): void;
|
|
8
9
|
clear(): void;
|
|
9
10
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,iBAAkB,YAAW,YAAY;IAC7C,OAAO,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAA;AAC/C,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,iBAAkB,YAAW,YAAY;IAC7C,OAAO,CAAC,KAAK,CAAiE;;IAM9E,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,KAAK;IASxB,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAW,GAAG,IAAI;IAIrD,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,IAAK,IAAI;IAId,KAAK,IAAK,IAAI;CAGf;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { RedisOptions } from 'ioredis';
|
|
2
|
+
import type IData from '../../interfaces/IData';
|
|
2
3
|
import type ICacheEngine from '../../interfaces/ICacheEngine';
|
|
3
4
|
declare class RedisCacheEngine implements ICacheEngine {
|
|
4
5
|
private client;
|
|
5
6
|
constructor(options: RedisOptions);
|
|
6
|
-
get(key: string): Promise<
|
|
7
|
+
get(key: string): Promise<IData>;
|
|
7
8
|
set(key: string, value: unknown, ttl?: number): Promise<void>;
|
|
8
9
|
del(key: string): Promise<void>;
|
|
9
10
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAS,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAA;AAC/C,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,gBAAiB,YAAW,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAO;gBAER,OAAO,EAAE,YAAY;IAO5B,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAkBjC,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAkF3E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type IData from './IData';
|
|
1
2
|
interface ICacheEngine {
|
|
2
|
-
get: (key: string) => Promise<
|
|
3
|
-
set: (key: string, value:
|
|
3
|
+
get: (key: string) => Promise<IData> | IData;
|
|
4
|
+
set: (key: string, value: IData, ttl?: number) => Promise<void> | void;
|
|
4
5
|
del: (key: string) => Promise<void> | void;
|
|
5
6
|
clear: () => Promise<void> | void;
|
|
6
7
|
close: () => Promise<void> | void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ICacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/ICacheEngine.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ICacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/ICacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAEhC,UAAU,YAAY;IACpB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;IAC5C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAClC;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IData.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/IData.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAAA;AAEjG,eAAe,KAAK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAMnB,OAAO,iBAAiB,MAAM,4BAA4B,CAAA;AAC1D,OAAO,gBAAgB,MAAM,2BAA2B,CAAA;AAExD,MAAM,WAAW;IAKf,YAAa,YAA2B;QAFvB,YAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;QAGrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,SAAS,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,CAAA;QAE3D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAY;QAC9F,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;CACF;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAGA,MAAM,iBAAiB;IAGrB;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,GAAG,CAAE,GAAW;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,GAAG,CAAE,GAAW,EAAE,KAAY,EAAE,GAAG,GAAG,QAAQ;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IAC1D,CAAC;IAED,GAAG,CAAE,GAAW;QAEd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,KAAK;IAEL,CAAC;CACF;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import IORedis from 'ioredis';
|
|
2
|
+
import { Types } from 'mongoose';
|
|
2
3
|
class RedisCacheEngine {
|
|
3
4
|
constructor(options) {
|
|
4
5
|
if (!options.keyPrefix) {
|
|
@@ -11,7 +12,18 @@ class RedisCacheEngine {
|
|
|
11
12
|
if (value === null) {
|
|
12
13
|
return undefined;
|
|
13
14
|
}
|
|
14
|
-
return JSON.parse(value)
|
|
15
|
+
return JSON.parse(value, (_key, value) => {
|
|
16
|
+
if (typeof value === 'string') {
|
|
17
|
+
const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
18
|
+
if (dateRegex.test(value)) {
|
|
19
|
+
return new Date(value);
|
|
20
|
+
}
|
|
21
|
+
else if (Types.ObjectId.isValid(value)) {
|
|
22
|
+
return new Types.ObjectId(value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
});
|
|
15
27
|
}
|
|
16
28
|
async set(key, value, ttl = Infinity) {
|
|
17
29
|
const serializedValue = JSON.stringify(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.js","sourceRoot":"","sources":["../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAMhC,MAAM,gBAAgB;IAGpB,YAAa,OAAqB;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YACtB,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAA;SACtC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,OAAO,SAAS,CAAA;SACjB;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,MAAM,SAAS,GAAG,+CAA+C,CAAA;gBACjE,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACzB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;iBACvB;qBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACxC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;iBACjC;aACF;YACD,OAAO,KAAgB,CAAA;QACzB,CAAC,CAAiE,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAAc,EAAE,GAAG,GAAG,QAAQ;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -14,9 +14,9 @@ export default function extendQuery(mongoose, cache) {
|
|
|
14
14
|
this._key = customKey;
|
|
15
15
|
return this;
|
|
16
16
|
};
|
|
17
|
-
mongoose.Aggregate.prototype.exec = async function () {
|
|
17
|
+
mongoose.Aggregate.prototype.exec = async function (...args) {
|
|
18
18
|
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
19
|
-
return mongooseExec.apply(this);
|
|
19
|
+
return mongooseExec.apply(this, args);
|
|
20
20
|
}
|
|
21
21
|
const key = this.getCacheKey();
|
|
22
22
|
const ttl = this.getCacheTTL();
|
|
@@ -27,7 +27,7 @@ export default function extendQuery(mongoose, cache) {
|
|
|
27
27
|
return resultCache;
|
|
28
28
|
}
|
|
29
29
|
const result = await mongooseExec.call(this);
|
|
30
|
-
cache.set(key, result, ttl).catch((err) => {
|
|
30
|
+
await cache.set(key, result, ttl).catch((err) => {
|
|
31
31
|
console.error(err);
|
|
32
32
|
});
|
|
33
33
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAA;IAGtD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,MAAM,CAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACJ,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAA;IAGtD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,MAAM,CAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACJ,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,WAAW,GAAG,IAAQ;QAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACvD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACtC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAE9B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,WAAW,EAAE;YACf,OAAO,WAAW,CAAA;SACnB;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAwD,CAAA;QACnG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
|
package/dist/esm/extend/query.js
CHANGED
|
@@ -30,9 +30,9 @@ export default function extendQuery(mongoose, cache) {
|
|
|
30
30
|
this._key = customKey;
|
|
31
31
|
return this;
|
|
32
32
|
};
|
|
33
|
-
mongoose.Query.prototype.exec = async function () {
|
|
33
|
+
mongoose.Query.prototype.exec = async function (...args) {
|
|
34
34
|
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
35
|
-
return mongooseExec.apply(this);
|
|
35
|
+
return mongooseExec.apply(this, args);
|
|
36
36
|
}
|
|
37
37
|
const key = this.getCacheKey();
|
|
38
38
|
const ttl = this.getCacheTTL();
|
|
@@ -49,14 +49,16 @@ export default function extendQuery(mongoose, cache) {
|
|
|
49
49
|
}
|
|
50
50
|
const constructor = mongoose.model(model);
|
|
51
51
|
if (Array.isArray(resultCache)) {
|
|
52
|
-
return resultCache.map((item) =>
|
|
52
|
+
return resultCache.map((item) => {
|
|
53
|
+
return constructor.hydrate(item);
|
|
54
|
+
});
|
|
53
55
|
}
|
|
54
56
|
else {
|
|
55
57
|
return constructor.hydrate(resultCache);
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
60
|
const result = await mongooseExec.call(this);
|
|
59
|
-
cache.set(key, result, ttl).catch((err) => {
|
|
61
|
+
await cache.set(key, result, ttl).catch((err) => {
|
|
60
62
|
console.error(err);
|
|
61
63
|
});
|
|
62
64
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAA;IAGlD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG;QACrC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAA;QAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAE9C,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM;YACN,MAAM;YACN,OAAO;YACP,eAAe;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAA;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC,CAAA;IAGD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG;QACrC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QACzE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IData.js","sourceRoot":"","sources":["../../../src/interfaces/IData.ts"],"names":[],"mappings":""}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type IData from '../interfaces/IData';
|
|
1
2
|
import type ICacheOptions from '../interfaces/ICacheOptions';
|
|
2
3
|
declare class CacheEngine {
|
|
3
4
|
private engine;
|
|
4
5
|
private defaultTTL;
|
|
5
6
|
private readonly engines;
|
|
6
7
|
constructor(cacheOptions: ICacheOptions);
|
|
7
|
-
get(key: string): Promise<
|
|
8
|
+
get(key: string): Promise<IData>;
|
|
8
9
|
set(key: string, value: Record<string, unknown> | Record<string, unknown>[], ttl?: string): Promise<void>;
|
|
9
10
|
del(key: string): Promise<void>;
|
|
10
11
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/cache/Cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../../src/cache/Cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAE5C,OAAO,KAAK,aAAa,MAAM,6BAA6B,CAAA;AAK5D,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;gBAE1C,YAAY,EAAE,aAAa;IAoBlC,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAIjC,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1G,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type IData from '../../interfaces/IData';
|
|
1
2
|
import type ICacheEngine from '../../interfaces/ICacheEngine';
|
|
2
3
|
declare class MemoryCacheEngine implements ICacheEngine {
|
|
3
4
|
private cache;
|
|
4
5
|
constructor();
|
|
5
|
-
get(key: string):
|
|
6
|
-
set(key: string, value:
|
|
6
|
+
get(key: string): IData;
|
|
7
|
+
set(key: string, value: IData, ttl?: number): void;
|
|
7
8
|
del(key: string): void;
|
|
8
9
|
clear(): void;
|
|
9
10
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,iBAAkB,YAAW,YAAY;IAC7C,OAAO,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"MemoryCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/MemoryCacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAA;AAC/C,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,iBAAkB,YAAW,YAAY;IAC7C,OAAO,CAAC,KAAK,CAAiE;;IAM9E,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,KAAK;IASxB,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAW,GAAG,IAAI;IAIrD,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,IAAK,IAAI;IAId,KAAK,IAAK,IAAI;CAGf;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { RedisOptions } from 'ioredis';
|
|
2
|
+
import type IData from '../../interfaces/IData';
|
|
2
3
|
import type ICacheEngine from '../../interfaces/ICacheEngine';
|
|
3
4
|
declare class RedisCacheEngine implements ICacheEngine {
|
|
4
5
|
private client;
|
|
5
6
|
constructor(options: RedisOptions);
|
|
6
|
-
get(key: string): Promise<
|
|
7
|
+
get(key: string): Promise<IData>;
|
|
7
8
|
set(key: string, value: unknown, ttl?: number): Promise<void>;
|
|
8
9
|
del(key: string): Promise<void>;
|
|
9
10
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RedisCacheEngine.d.ts","sourceRoot":"","sources":["../../../../../src/cache/engine/RedisCacheEngine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAS,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAA;AAC/C,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,cAAM,gBAAiB,YAAW,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAO;gBAER,OAAO,EAAE,YAAY;IAO5B,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAkBjC,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,GAAG,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAkF3E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type IData from './IData';
|
|
1
2
|
interface ICacheEngine {
|
|
2
|
-
get: (key: string) => Promise<
|
|
3
|
-
set: (key: string, value:
|
|
3
|
+
get: (key: string) => Promise<IData> | IData;
|
|
4
|
+
set: (key: string, value: IData, ttl?: number) => Promise<void> | void;
|
|
4
5
|
del: (key: string) => Promise<void> | void;
|
|
5
6
|
clear: () => Promise<void> | void;
|
|
6
7
|
close: () => Promise<void> | void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ICacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/ICacheEngine.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ICacheEngine.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/ICacheEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAEhC,UAAU,YAAY;IACpB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;IAC5C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAClC;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IData.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/IData.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAAA;AAEjG,eAAe,KAAK,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-cache-mongoose",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Cache plugin for mongoose Queries and Aggregate (in-memory, redis)",
|
|
5
5
|
"author": "Alex Eagle",
|
|
6
6
|
"license": "MIT",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"build": "npm run clean && npm run build:cjs && npm run build:esm",
|
|
73
73
|
"build:cjs": "tsc -p config/tsconfig.cjs.json",
|
|
74
74
|
"build:esm": "tsc -p config/tsconfig.esm.json && mv ./dist/esm/plugin.js ./dist/esm/plugin.mjs",
|
|
75
|
-
"release": "npm
|
|
75
|
+
"release": "npm run lint && npm run build && np"
|
|
76
76
|
},
|
|
77
77
|
"dependencies": {
|
|
78
78
|
"ioredis": "5.3.2",
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
"@types/jest": "29.5.1",
|
|
90
90
|
"@types/ms": "^0.7.31",
|
|
91
91
|
"@types/node": "18.16.3",
|
|
92
|
-
"@typescript-eslint/eslint-plugin": "5.59.
|
|
93
|
-
"@typescript-eslint/parser": "5.59.
|
|
92
|
+
"@typescript-eslint/eslint-plugin": "5.59.2",
|
|
93
|
+
"@typescript-eslint/parser": "5.59.2",
|
|
94
94
|
"eslint": "8.39.0",
|
|
95
95
|
"eslint-config-standard": "17.0.0",
|
|
96
96
|
"eslint-plugin-import": "2.27.5",
|
package/src/cache/Cache.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import ms from 'ms'
|
|
2
2
|
|
|
3
|
+
import type IData from '../interfaces/IData'
|
|
3
4
|
import type ICacheEngine from '../interfaces/ICacheEngine'
|
|
4
5
|
import type ICacheOptions from '../interfaces/ICacheOptions'
|
|
5
6
|
|
|
@@ -31,7 +32,7 @@ class CacheEngine {
|
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
async get (key: string): Promise<
|
|
35
|
+
async get (key: string): Promise<IData> {
|
|
35
36
|
return this.engine.get(key)
|
|
36
37
|
}
|
|
37
38
|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import type IData from '../../interfaces/IData'
|
|
1
2
|
import type ICacheEngine from '../../interfaces/ICacheEngine'
|
|
2
3
|
|
|
3
4
|
class MemoryCacheEngine implements ICacheEngine {
|
|
4
|
-
private cache: Record<string, { value:
|
|
5
|
+
private cache: Record<string, { value: IData, expiresAt: number } | undefined>
|
|
5
6
|
|
|
6
7
|
constructor () {
|
|
7
8
|
this.cache = {}
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
get (key: string):
|
|
11
|
+
get (key: string): IData {
|
|
11
12
|
const item = this.cache[key]
|
|
12
13
|
if (!item || item.expiresAt < Date.now()) {
|
|
13
14
|
this.del(key)
|
|
@@ -16,7 +17,7 @@ class MemoryCacheEngine implements ICacheEngine {
|
|
|
16
17
|
return item.value
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
set (key: string, value:
|
|
20
|
+
set (key: string, value: IData, ttl = Infinity): void {
|
|
20
21
|
this.cache[key] = { value, expiresAt: Date.now() + ttl }
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import IORedis from 'ioredis'
|
|
2
|
+
import { Types } from 'mongoose'
|
|
2
3
|
|
|
3
4
|
import type { Redis, RedisOptions } from 'ioredis'
|
|
5
|
+
import type IData from '../../interfaces/IData'
|
|
4
6
|
import type ICacheEngine from '../../interfaces/ICacheEngine'
|
|
5
7
|
|
|
6
8
|
class RedisCacheEngine implements ICacheEngine {
|
|
@@ -13,12 +15,22 @@ class RedisCacheEngine implements ICacheEngine {
|
|
|
13
15
|
this.client = new IORedis(options)
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
async get (key: string): Promise<
|
|
18
|
+
async get (key: string): Promise<IData> {
|
|
17
19
|
const value = await this.client.get(key)
|
|
18
20
|
if (value === null) {
|
|
19
21
|
return undefined
|
|
20
22
|
}
|
|
21
|
-
return JSON.parse(value
|
|
23
|
+
return JSON.parse(value, (_key, value) => {
|
|
24
|
+
if (typeof value === 'string') {
|
|
25
|
+
const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
|
|
26
|
+
if (dateRegex.test(value)) {
|
|
27
|
+
return new Date(value)
|
|
28
|
+
} else if (Types.ObjectId.isValid(value)) {
|
|
29
|
+
return new Types.ObjectId(value)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return value as unknown
|
|
33
|
+
}) as Promise<Record<string, unknown> | Record<string, unknown>[]>
|
|
22
34
|
}
|
|
23
35
|
|
|
24
36
|
async set (key: string, value: unknown, ttl = Infinity): Promise<void> {
|
package/src/extend/aggregate.ts
CHANGED
|
@@ -27,9 +27,9 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
30
|
-
mongoose.Aggregate.prototype.exec = async function () {
|
|
30
|
+
mongoose.Aggregate.prototype.exec = async function (...args: []) {
|
|
31
31
|
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
32
|
-
return mongooseExec.apply(this)
|
|
32
|
+
return mongooseExec.apply(this, args)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
const key = this.getCacheKey()
|
|
@@ -44,7 +44,7 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
const result = await mongooseExec.call(this) as Record<string, unknown>[] | Record<string, unknown>
|
|
47
|
-
cache.set(key, result, ttl).catch((err) => {
|
|
47
|
+
await cache.set(key, result, ttl).catch((err) => {
|
|
48
48
|
console.error(err)
|
|
49
49
|
})
|
|
50
50
|
|
package/src/extend/query.ts
CHANGED
|
@@ -44,10 +44,10 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
44
44
|
return this
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
48
|
-
mongoose.Query.prototype.exec = async function () {
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, sonarjs/cognitive-complexity
|
|
48
|
+
mongoose.Query.prototype.exec = async function (...args: []) {
|
|
49
49
|
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
50
|
-
return mongooseExec.apply(this)
|
|
50
|
+
return mongooseExec.apply(this, args)
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
const key = this.getCacheKey()
|
|
@@ -67,16 +67,19 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
67
67
|
return resultCache
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
const constructor = mongoose.model(model)
|
|
70
|
+
const constructor = mongoose.model<unknown>(model)
|
|
71
|
+
|
|
71
72
|
if (Array.isArray(resultCache)) {
|
|
72
|
-
return resultCache.map((item) =>
|
|
73
|
+
return resultCache.map((item) => {
|
|
74
|
+
return constructor.hydrate(item)
|
|
75
|
+
})
|
|
73
76
|
} else {
|
|
74
|
-
return constructor.hydrate(resultCache)
|
|
77
|
+
return constructor.hydrate(resultCache)
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
const result = await mongooseExec.call(this) as Record<string, unknown>[] | Record<string, unknown>
|
|
79
|
-
cache.set(key, result, ttl).catch((err) => {
|
|
82
|
+
await cache.set(key, result, ttl).catch((err) => {
|
|
80
83
|
console.error(err)
|
|
81
84
|
})
|
|
82
85
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type IData from './IData'
|
|
2
|
+
|
|
1
3
|
interface ICacheEngine {
|
|
2
|
-
get: (key: string) => Promise<
|
|
3
|
-
set: (key: string, value:
|
|
4
|
+
get: (key: string) => Promise<IData> | IData
|
|
5
|
+
set: (key: string, value: IData, ttl?: number) => Promise<void> | void
|
|
4
6
|
del: (key: string) => Promise<void> | void
|
|
5
7
|
clear: () => Promise<void> | void
|
|
6
8
|
close: () => Promise<void> | void
|
|
@@ -137,7 +137,10 @@ describe('CacheMongoose', () => {
|
|
|
137
137
|
const user = await User.findById(john._id).cache('1 minute').exec()
|
|
138
138
|
const cachedUser = await User.findById(john._id).cache('1 minute').exec()
|
|
139
139
|
|
|
140
|
-
expect(user).toEqual(cachedUser)
|
|
140
|
+
expect(user?._id).toEqual(cachedUser?._id)
|
|
141
|
+
expect(user?.name).toEqual(cachedUser?.name)
|
|
142
|
+
expect(user?.createdAt).toEqual(cachedUser?.createdAt)
|
|
143
|
+
expect(user?.updatedAt).toEqual(cachedUser?.updatedAt)
|
|
141
144
|
})
|
|
142
145
|
|
|
143
146
|
it('findOne', async () => {
|
|
@@ -145,7 +148,10 @@ describe('CacheMongoose', () => {
|
|
|
145
148
|
await User.create({ name: 'Steve', age: 30, role: 'admin' })
|
|
146
149
|
const cachedUser = await User.findOne({ name: 'John', age: 30, role: 'admin' }).cache('1 minute').exec()
|
|
147
150
|
|
|
148
|
-
expect(user).toEqual(cachedUser)
|
|
151
|
+
expect(user?._id).toEqual(cachedUser?._id)
|
|
152
|
+
expect(user?.name).toEqual(cachedUser?.name)
|
|
153
|
+
expect(user?.createdAt).toEqual(cachedUser?.createdAt)
|
|
154
|
+
expect(user?.updatedAt).toEqual(cachedUser?.updatedAt)
|
|
149
155
|
})
|
|
150
156
|
|
|
151
157
|
it('find', async () => {
|
|
@@ -153,7 +159,7 @@ describe('CacheMongoose', () => {
|
|
|
153
159
|
await User.create({ name: 'Steve', age: 30, role: 'admin' })
|
|
154
160
|
const cachedUsers = await User.find({ age: { $gte: 30 } }).cache('1 minute').exec()
|
|
155
161
|
|
|
156
|
-
expect(users).
|
|
162
|
+
expect(users).toHaveLength(cachedUsers.length)
|
|
157
163
|
})
|
|
158
164
|
|
|
159
165
|
it('count', async () => {
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import mongoose
|
|
2
|
-
import
|
|
1
|
+
import mongoose from 'mongoose'
|
|
2
|
+
import plugin from '../src/plugin'
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
import User from './models/User'
|
|
5
|
+
import Story from './models/Story'
|
|
5
6
|
|
|
6
7
|
describe('cache redis', () => {
|
|
7
8
|
const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
|
|
8
|
-
const User = model('User', UserSchema)
|
|
9
9
|
|
|
10
|
-
const cache =
|
|
10
|
+
const cache = plugin.init(mongoose, {
|
|
11
11
|
engine: 'redis',
|
|
12
12
|
engineOptions: {
|
|
13
13
|
host: 'localhost',
|
|
14
14
|
port: 6379
|
|
15
15
|
},
|
|
16
|
-
defaultTTL: '
|
|
16
|
+
defaultTTL: '10 seconds'
|
|
17
17
|
})
|
|
18
18
|
|
|
19
19
|
beforeAll(async () => {
|
|
@@ -28,6 +28,7 @@ describe('cache redis', () => {
|
|
|
28
28
|
|
|
29
29
|
beforeEach(async () => {
|
|
30
30
|
await mongoose.connection.collection('users').deleteMany({})
|
|
31
|
+
await mongoose.connection.collection('stories').deleteMany({})
|
|
31
32
|
})
|
|
32
33
|
|
|
33
34
|
it('should use cache', async () => {
|
|
@@ -69,9 +70,9 @@ describe('cache redis', () => {
|
|
|
69
70
|
role: 'admin'
|
|
70
71
|
})
|
|
71
72
|
|
|
72
|
-
const cache1 = await User.findById(user._id).cache('
|
|
73
|
+
const cache1 = await User.findById(user._id).cache('30 seconds', 'custom-key-1').exec()
|
|
73
74
|
await User.findOneAndUpdate({ _id: user._id }, { name: 'John Doe 2' })
|
|
74
|
-
const cache2 = await User.findById(user._id).cache('
|
|
75
|
+
const cache2 = await User.findById(user._id).cache('30 seconds', 'custom-key-1').exec()
|
|
75
76
|
|
|
76
77
|
expect(cache1).not.toBeNull()
|
|
77
78
|
expect(cache2).not.toBeNull()
|
|
@@ -85,10 +86,10 @@ describe('cache redis', () => {
|
|
|
85
86
|
role: 'admin'
|
|
86
87
|
})
|
|
87
88
|
|
|
88
|
-
const cache1 = await User.findById(user._id).cache('
|
|
89
|
+
const cache1 = await User.findById(user._id).cache('30 seconds', 'custom-key-2').exec()
|
|
89
90
|
await User.updateOne({ _id: user._id }, { name: 'Steve' })
|
|
90
91
|
await cache.clear('custom-key-2')
|
|
91
|
-
const cache2 = await User.findById(user._id).cache('
|
|
92
|
+
const cache2 = await User.findById(user._id).cache('30 seconds', 'custom-key-2').exec()
|
|
92
93
|
|
|
93
94
|
expect(cache1).not.toBeNull()
|
|
94
95
|
expect(cache2).not.toBeNull()
|
|
@@ -144,14 +145,14 @@ describe('cache redis', () => {
|
|
|
144
145
|
const cache1 = await User.aggregate([
|
|
145
146
|
{ $match: { role: 'admin' } },
|
|
146
147
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
147
|
-
]).cache('
|
|
148
|
+
]).cache('30 seconds')
|
|
148
149
|
|
|
149
150
|
await User.create({ name: 'Mark', role: 'admin' })
|
|
150
151
|
|
|
151
152
|
const cache2 = await User.aggregate([
|
|
152
153
|
{ $match: { role: 'admin' } },
|
|
153
154
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
154
|
-
]).cache('
|
|
155
|
+
]).cache('30 seconds')
|
|
155
156
|
|
|
156
157
|
expect(cache1).not.toBeNull()
|
|
157
158
|
expect(cache2).not.toBeNull()
|
|
@@ -168,14 +169,14 @@ describe('cache redis', () => {
|
|
|
168
169
|
const cache1 = await User.aggregate([
|
|
169
170
|
{ $match: { role: 'admin' } },
|
|
170
171
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
171
|
-
]).cache('
|
|
172
|
+
]).cache('30 seconds', 'aggregate-custom-key')
|
|
172
173
|
|
|
173
174
|
await User.create({ name: 'Mark', role: 'admin' })
|
|
174
175
|
|
|
175
176
|
const cache2 = await User.aggregate([
|
|
176
177
|
{ $match: { role: 'admin' } },
|
|
177
178
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
178
|
-
]).cache('
|
|
179
|
+
]).cache('30 seconds', 'aggregate-custom-key')
|
|
179
180
|
|
|
180
181
|
// Don't use cache key
|
|
181
182
|
const cache3 = await User.aggregate([
|
|
@@ -197,9 +198,9 @@ describe('cache redis', () => {
|
|
|
197
198
|
{ name: 'Alice', role: 'user' }
|
|
198
199
|
])
|
|
199
200
|
|
|
200
|
-
const cache1 = await User.find({ role: 'admin' }).lean().cache('
|
|
201
|
+
const cache1 = await User.find({ role: 'admin' }).lean().cache('30 seconds')
|
|
201
202
|
await User.create({ name: 'Mark', role: 'admin' })
|
|
202
|
-
const cache2 = await User.find({ role: 'admin' }).lean().cache('
|
|
203
|
+
const cache2 = await User.find({ role: 'admin' }).lean().cache('30 seconds')
|
|
203
204
|
|
|
204
205
|
expect(cache1).not.toBeNull()
|
|
205
206
|
expect(cache2).not.toBeNull()
|
|
@@ -213,20 +214,101 @@ describe('cache redis', () => {
|
|
|
213
214
|
{ name: 'Andy', role: 'user' }
|
|
214
215
|
])
|
|
215
216
|
|
|
216
|
-
const cache1 = await User.find({ name: /^J/ }).cache('
|
|
217
|
+
const cache1 = await User.find({ name: /^J/ }).cache('30 seconds')
|
|
217
218
|
await User.create({ name: 'Jenifer', role: 'admin' })
|
|
218
|
-
const cache2 = await User.find({ name: /^J/ }).cache('
|
|
219
|
+
const cache2 = await User.find({ name: /^J/ }).cache('30 seconds')
|
|
219
220
|
|
|
220
221
|
expect(cache1).not.toBeNull()
|
|
221
222
|
expect(cache2).not.toBeNull()
|
|
222
223
|
expect(cache1?.length).toEqual(cache2?.length)
|
|
223
224
|
|
|
224
|
-
const cache3 = await User.find({ name: /^A/ }).cache('
|
|
225
|
+
const cache3 = await User.find({ name: /^A/ }).cache('30 seconds')
|
|
225
226
|
await User.create({ name: 'Alex', role: 'admin' })
|
|
226
|
-
const cache4 = await User.find({ name: /^A/ }).cache('
|
|
227
|
+
const cache4 = await User.find({ name: /^A/ }).cache('30 seconds')
|
|
227
228
|
|
|
228
229
|
expect(cache3).not.toBeNull()
|
|
229
230
|
expect(cache4).not.toBeNull()
|
|
230
231
|
expect(cache3?.length).toEqual(cache4?.length)
|
|
231
232
|
})
|
|
233
|
+
|
|
234
|
+
it('should findOne', async () => {
|
|
235
|
+
await User.create([
|
|
236
|
+
{ name: 'C', role: 'admin' },
|
|
237
|
+
{ name: 'V', role: 'user' },
|
|
238
|
+
{ name: 'G', role: 'user' }
|
|
239
|
+
])
|
|
240
|
+
|
|
241
|
+
const cache1 = await User.findOne({ name: 'G' }).lean().cache('30 seconds').exec()
|
|
242
|
+
expect(cache1).not.toBeNull()
|
|
243
|
+
expect(cache1?._id instanceof mongoose.Types.ObjectId).toBeTruthy()
|
|
244
|
+
expect(cache1).toHaveProperty('name', 'G')
|
|
245
|
+
|
|
246
|
+
const cache2 = await User.findOne({ name: 'G' }).lean().cache('30 seconds').exec()
|
|
247
|
+
expect(cache2).not.toBeNull()
|
|
248
|
+
expect(cache2?._id instanceof mongoose.Types.ObjectId).toBeTruthy()
|
|
249
|
+
expect(cache2).toHaveProperty('name', 'G')
|
|
250
|
+
expect(cache1).toEqual(cache2)
|
|
251
|
+
|
|
252
|
+
const cache3 = await User.findOne({ name: 'G' }).lean().cache('30 seconds').exec()
|
|
253
|
+
expect(cache3).not.toBeNull()
|
|
254
|
+
expect(cache3).toHaveProperty('name', 'G')
|
|
255
|
+
expect(cache2).toEqual(cache3)
|
|
256
|
+
|
|
257
|
+
const cache4 = await User.findOne({ name: 'V' }).lean().cache('30 seconds').exec()
|
|
258
|
+
expect(cache4).not.toBeNull()
|
|
259
|
+
expect(cache4).toHaveProperty('name', 'V')
|
|
260
|
+
expect(cache3).not.toEqual(cache4)
|
|
261
|
+
|
|
262
|
+
const cache5 = await User.findOne({ name: 'O' }).lean().cache('30 seconds').exec()
|
|
263
|
+
const cache6 = await User.findOne({ name: 'O' }).lean().cache('30 seconds').exec()
|
|
264
|
+
expect(cache5).toBeNull()
|
|
265
|
+
expect(cache6).toBeNull()
|
|
266
|
+
expect(cache5).toEqual(cache6)
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
it('should distinct("_id") and distinct("role") and distinct("createdAt")', async () => {
|
|
270
|
+
await User.create({ name: 'i', role: 'admin' })
|
|
271
|
+
await User.create({ name: 'p', role: 'user' })
|
|
272
|
+
await User.create({ name: 'm', role: 'user' })
|
|
273
|
+
|
|
274
|
+
const cache1 = await User.distinct('_id').cache('30 seconds').exec()
|
|
275
|
+
expect(cache1).not.toBeNull()
|
|
276
|
+
expect(cache1?.length).toBe(3)
|
|
277
|
+
|
|
278
|
+
const cache2 = await User.distinct('_id').cache('30 seconds').exec()
|
|
279
|
+
expect(cache2).not.toBeNull()
|
|
280
|
+
expect(cache2?.length).toBe(3)
|
|
281
|
+
|
|
282
|
+
const cache4 = await User.distinct('role').cache('30 seconds').exec()
|
|
283
|
+
expect(cache4).not.toBeNull()
|
|
284
|
+
expect(cache4?.length).toBe(2)
|
|
285
|
+
|
|
286
|
+
const cache5 = await User.distinct('role').cache('30 seconds').exec()
|
|
287
|
+
expect(cache5).not.toBeNull()
|
|
288
|
+
expect(cache5?.length).toBe(2)
|
|
289
|
+
|
|
290
|
+
const cache6 = await User.distinct('createdAt').cache('30 seconds').exec()
|
|
291
|
+
expect(cache6).not.toBeNull()
|
|
292
|
+
expect(cache6?.length).toBe(3)
|
|
293
|
+
const cache7 = await User.distinct('createdAt').cache('30 seconds').exec()
|
|
294
|
+
|
|
295
|
+
expect(cache1).toEqual(cache2)
|
|
296
|
+
expect(cache4).toEqual(cache5)
|
|
297
|
+
expect(cache6).toEqual(cache7)
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
it('should test exceptions', async () => {
|
|
301
|
+
const user = await User.create({ name: 'i', role: 'admin' })
|
|
302
|
+
const story1 = await Story.create({ title: '1', userId: user._id })
|
|
303
|
+
const story2 = await Story.create({ title: '2', userId: user._id })
|
|
304
|
+
|
|
305
|
+
const cache1 = await User.findOne({ name: 'i' }).populate({ path: 'stories' }).lean().cache('30 seconds').exec()
|
|
306
|
+
const cache2 = await User.findOne({ name: 'i' }).populate({ path: 'stories' }).lean().cache('30 seconds').exec()
|
|
307
|
+
expect(cache1).not.toBeNull()
|
|
308
|
+
expect(cache1?.stories).not.toBeNull()
|
|
309
|
+
expect(cache1?.stories?.length).toBe(2)
|
|
310
|
+
expect(cache1?.stories?.[0]._id).toEqual(story1._id)
|
|
311
|
+
expect(cache1?.stories?.[1]._id).toEqual(story2._id)
|
|
312
|
+
expect(cache1).toEqual(cache2)
|
|
313
|
+
})
|
|
232
314
|
})
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import type { HydratedDocument } from 'mongoose'
|
|
2
|
+
import type IStory from './IStory'
|
|
3
|
+
|
|
1
4
|
interface IUser {
|
|
2
5
|
name: string
|
|
3
6
|
role: string
|
|
4
7
|
age?: number
|
|
5
8
|
createdAt?: Date
|
|
6
9
|
updatedAt?: Date
|
|
10
|
+
stories?: HydratedDocument<IStory>[]
|
|
7
11
|
}
|
|
8
12
|
|
|
9
13
|
export default IUser
|
|
@@ -82,4 +82,20 @@ describe('generateHash()', () => {
|
|
|
82
82
|
expect(hash1).not.toEqual(hash3)
|
|
83
83
|
expect(hash3).not.toEqual(hash4)
|
|
84
84
|
})
|
|
85
|
+
|
|
86
|
+
it('should test dates', async () => {
|
|
87
|
+
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
|
|
88
|
+
const date = new Date()
|
|
89
|
+
const hash1 = getKey({
|
|
90
|
+
name: 'John Doe',
|
|
91
|
+
date: { $lte: date }
|
|
92
|
+
})
|
|
93
|
+
await wait(50)
|
|
94
|
+
const date2 = new Date()
|
|
95
|
+
const hash2 = getKey({
|
|
96
|
+
name: 'John Doe',
|
|
97
|
+
date: { $lte: date2 }
|
|
98
|
+
})
|
|
99
|
+
expect(hash1).not.toEqual(hash2)
|
|
100
|
+
})
|
|
85
101
|
})
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Schema } from 'mongoose'
|
|
2
|
+
|
|
3
|
+
import type IStory from '../interfaces/IStory'
|
|
4
|
+
|
|
5
|
+
const UserSchema = new Schema<IStory>({
|
|
6
|
+
userId: {
|
|
7
|
+
type: Schema.Types.ObjectId,
|
|
8
|
+
ref: 'User',
|
|
9
|
+
required: true,
|
|
10
|
+
index: true
|
|
11
|
+
},
|
|
12
|
+
title: {
|
|
13
|
+
type: String,
|
|
14
|
+
required: true
|
|
15
|
+
}
|
|
16
|
+
}, { timestamps: true })
|
|
17
|
+
|
|
18
|
+
export default UserSchema
|