mongodb-dynamic-api 4.22.0 → 4.24.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/CHANGELOG.md +39 -0
- package/package.json +1 -1
- package/src/dtos/index.d.ts +1 -0
- package/src/dtos/index.js +1 -0
- package/src/dtos/index.js.map +1 -1
- package/src/dtos/paging.query.d.ts +4 -0
- package/src/dtos/paging.query.js +35 -0
- package/src/dtos/paging.query.js.map +1 -0
- package/src/dynamic-api.module.js +6 -3
- package/src/dynamic-api.module.js.map +1 -1
- package/src/guards/base-policies.guard.d.ts +4 -1
- package/src/guards/base-policies.guard.js +14 -3
- package/src/guards/base-policies.guard.js.map +1 -1
- package/src/helpers/cache-path-registry.store.d.ts +13 -0
- package/src/helpers/cache-path-registry.store.js +45 -0
- package/src/helpers/cache-path-registry.store.js.map +1 -0
- package/src/helpers/index.d.ts +3 -0
- package/src/helpers/index.js +3 -0
- package/src/helpers/index.js.map +1 -1
- package/src/helpers/mixin-data.helper.js +19 -0
- package/src/helpers/mixin-data.helper.js.map +1 -1
- package/src/helpers/paging-params.helper.d.ts +13 -0
- package/src/helpers/paging-params.helper.js +14 -0
- package/src/helpers/paging-params.helper.js.map +1 -0
- package/src/helpers/paging-presenter-warning.helper.d.ts +3 -0
- package/src/helpers/paging-presenter-warning.helper.js +16 -0
- package/src/helpers/paging-presenter-warning.helper.js.map +1 -0
- package/src/helpers/pipeline-paging.helper.d.ts +3 -0
- package/src/helpers/pipeline-paging.helper.js +13 -0
- package/src/helpers/pipeline-paging.helper.js.map +1 -0
- package/src/interceptors/dynamic-api-cache.interceptor.d.ts +5 -1
- package/src/interceptors/dynamic-api-cache.interceptor.js +18 -3
- package/src/interceptors/dynamic-api-cache.interceptor.js.map +1 -1
- package/src/interfaces/dynamic-api-cache-options.interface.d.ts +1 -0
- package/src/interfaces/dynamic-api-custom-route.interface.d.ts +8 -2
- package/src/interfaces/dynamic-api-global-state.interface.d.ts +1 -0
- package/src/interfaces/dynamic-api-service-callback.interface.d.ts +1 -0
- package/src/mixins/policies-guard.mixin.d.ts +8 -1
- package/src/mixins/policies-guard.mixin.js +6 -2
- package/src/mixins/policies-guard.mixin.js.map +1 -1
- package/src/modules/auth/services/base-auth.service.js +1 -1
- package/src/modules/auth/services/base-auth.service.js.map +1 -1
- package/src/modules/dynamic-api-config/dynamic-api-config.module.js +8 -1
- package/src/modules/dynamic-api-config/dynamic-api-config.module.js.map +1 -1
- package/src/routes/aggregate/aggregate-controller.mixin.js +2 -1
- package/src/routes/aggregate/aggregate-controller.mixin.js.map +1 -1
- package/src/routes/aggregate/aggregate-gateway.mixin.js +3 -1
- package/src/routes/aggregate/aggregate-gateway.mixin.js.map +1 -1
- package/src/routes/aggregate/base-aggregate.service.d.ts +0 -1
- package/src/routes/aggregate/base-aggregate.service.js +3 -11
- package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
- package/src/routes/cache-purge/cache-purge.helper.js +5 -9
- package/src/routes/cache-purge/cache-purge.helper.js.map +1 -1
- package/src/routes/custom/create-custom-route-controller.js +83 -41
- package/src/routes/custom/create-custom-route-controller.js.map +1 -1
- package/src/routes/custom/create-custom-route-gateway.js +13 -6
- package/src/routes/custom/create-custom-route-gateway.js.map +1 -1
- package/src/routes/custom/custom-route-callback.service.d.ts +7 -0
- package/src/routes/custom/custom-route-callback.service.js +11 -0
- package/src/routes/custom/custom-route-callback.service.js.map +1 -0
- package/src/routes/get-many/get-many-controller.mixin.js +1 -1
- package/src/routes/get-many/get-many-controller.mixin.js.map +1 -1
- package/src/services/base/base.service.d.ts +4 -0
- package/src/services/base/base.service.js +58 -4
- package/src/services/base/base.service.js.map +1 -1
- package/src/services/dynamic-api-cache/dynamic-api-cache.service.d.ts +13 -0
- package/src/services/dynamic-api-cache/dynamic-api-cache.service.js +84 -0
- package/src/services/dynamic-api-cache/dynamic-api-cache.service.js.map +1 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.d.ts +1 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +4 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js.map +1 -1
- package/src/services/index.d.ts +1 -0
- package/src/services/index.js +1 -0
- package/src/services/index.js.map +1 -1
- package/src/version.json +1 -1
- package/test/for-feature/aggregate-ability-predicate-paging.e2e-spec.d.ts +1 -0
- package/test/for-feature/aggregate-ability-predicate-paging.e2e-spec.js +157 -0
- package/test/for-feature/aggregate-ability-predicate-paging.e2e-spec.js.map +1 -0
- package/test/for-feature/aggregate-paging-without-from-aggregate.e2e-spec.d.ts +1 -0
- package/test/for-feature/aggregate-paging-without-from-aggregate.e2e-spec.js +68 -0
- package/test/for-feature/aggregate-paging-without-from-aggregate.e2e-spec.js.map +1 -0
- package/test/for-feature/cache-identity-key.e2e-spec.d.ts +1 -0
- package/test/for-feature/cache-identity-key.e2e-spec.js +120 -0
- package/test/for-feature/cache-identity-key.e2e-spec.js.map +1 -0
- package/test/for-feature/cache-scoped-invalidation.e2e-spec.d.ts +1 -0
- package/test/for-feature/cache-scoped-invalidation.e2e-spec.js +170 -0
- package/test/for-feature/cache-scoped-invalidation.e2e-spec.js.map +1 -0
- package/test/for-feature/custom-route-auth-ability-predicate.e2e-spec.d.ts +1 -0
- package/test/for-feature/custom-route-auth-ability-predicate.e2e-spec.js +108 -0
- package/test/for-feature/custom-route-auth-ability-predicate.e2e-spec.js.map +1 -0
- package/test/for-feature/custom-route-inject.e2e-spec.d.ts +1 -0
- package/test/for-feature/custom-route-inject.e2e-spec.js +101 -0
- package/test/for-feature/custom-route-inject.e2e-spec.js.map +1 -0
- package/test/for-feature/custom-route-params-openapi.e2e-spec.d.ts +1 -0
- package/test/for-feature/custom-route-params-openapi.e2e-spec.js +77 -0
- package/test/for-feature/custom-route-params-openapi.e2e-spec.js.map +1 -0
- package/test/for-feature/custom-route-target-param.e2e-spec.d.ts +1 -0
- package/test/for-feature/custom-route-target-param.e2e-spec.js +102 -0
- package/test/for-feature/custom-route-target-param.e2e-spec.js.map +1 -0
- package/test/for-feature/derived-fields-raw-write-recompute.e2e-spec.d.ts +1 -0
- package/test/for-feature/derived-fields-raw-write-recompute.e2e-spec.js +152 -0
- package/test/for-feature/derived-fields-raw-write-recompute.e2e-spec.js.map +1 -0
- package/test/for-feature/exclude-from-response.e2e-spec.d.ts +1 -0
- package/test/for-feature/exclude-from-response.e2e-spec.js +93 -0
- package/test/for-feature/exclude-from-response.e2e-spec.js.map +1 -0
- package/test/for-feature/index-sync.e2e-spec.js +42 -0
- package/test/for-feature/index-sync.e2e-spec.js.map +1 -1
- package/test/for-feature/paging-query-helper.e2e-spec.d.ts +1 -0
- package/test/for-feature/paging-query-helper.e2e-spec.js +92 -0
- package/test/for-feature/paging-query-helper.e2e-spec.js.map +1 -0
- package/test/for-root/auth-api-basic.e2e-spec.js +2 -0
- package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-update-account-derived-field.e2e-spec.d.ts +1 -0
- package/test/for-root/auth-api-update-account-derived-field.e2e-spec.js +71 -0
- package/test/for-root/auth-api-update-account-derived-field.e2e-spec.js.map +1 -0
- package/test/for-root/initialization.e2e-spec.js +2 -0
- package/test/for-root/initialization.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-basic.e2e-spec.js +1 -0
- package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
|
|
3
|
+
## [4.24.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.23.0...v4.24.0) (2026-08-29)
|
|
4
|
+
|
|
5
|
+
### aggregate
|
|
6
|
+
|
|
7
|
+
* **aggregate:** make abilityPredicate compatible with .Paging() pipelines ([450649e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/450649ebc40f53657dd1c84f760fcfe05ab743c0))
|
|
8
|
+
* **aggregate:** warn on silently dropped paging results, add PagingQuery helper ([7708d5e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/7708d5e68e9e922023d0519e2de149f05f929f4b))
|
|
9
|
+
|
|
10
|
+
### entities
|
|
11
|
+
|
|
12
|
+
* **entities:** recompute @DerivedField on useAuth updateAccount and custom routes ([3526172](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/35261722dd796763c83ac24d0764901e66759224))
|
|
13
|
+
|
|
14
|
+
### guards
|
|
15
|
+
|
|
16
|
+
* **guards:** add authAbilityPredicate for document-less custom routes ([f4f99d3](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f4f99d3a492dda5b07217b6f6b6a66af3f7dcbf6))
|
|
17
|
+
|
|
18
|
+
## [4.23.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.22.0...v4.23.0) (2026-08-23)
|
|
19
|
+
|
|
20
|
+
### quality
|
|
21
|
+
|
|
22
|
+
* **quality:** resolve 6 SonarCloud leak-period issues on develop ([43e51fb](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/43e51fb1281d5896d2a6bbf714386b10661f43f4))
|
|
23
|
+
|
|
24
|
+
### custom-routes
|
|
25
|
+
|
|
26
|
+
* **custom-routes:** DI resolution via inject (F8) ([8bc60af](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/8bc60af727152da8eb1b41a27c301aa17bf459c5))
|
|
27
|
+
* **custom-routes:** dTOs.params for OpenAPI path param docs (F9) ([e42449f](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e42449f9d49d7a2ceecb3b57f3cf25663c92c32c))
|
|
28
|
+
|
|
29
|
+
### entities
|
|
30
|
+
|
|
31
|
+
* **entities:** recompute @DerivedField on single-document raw writes (F5) ([411222a](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/411222ae703558dfe1836280baac70dc8dde0f4e))
|
|
32
|
+
|
|
33
|
+
### cache
|
|
34
|
+
|
|
35
|
+
* **cache:** identity-aware cache key + filter-mode safety warning (F1, F2) ([4641906](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/464190614571e323d37c704ebca7537395277229))
|
|
36
|
+
* **cache:** scoped invalidation via DynamicApiCacheService (F3, F4) ([c1c701d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/c1c701d1cf4986655f270284e6ada94923c589ce))
|
|
37
|
+
|
|
38
|
+
### guards
|
|
39
|
+
|
|
40
|
+
* **guards:** targetParam for custom routes with a non-id path param (F7) ([977de6d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/977de6d292af965f639c9749fd4b7973bd14373b))
|
|
41
|
+
|
|
3
42
|
## [4.22.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.21.0...v4.22.0) (2026-08-16)
|
|
4
43
|
|
|
5
44
|
### ci
|
package/package.json
CHANGED
package/src/dtos/index.d.ts
CHANGED
package/src/dtos/index.js
CHANGED
|
@@ -18,4 +18,5 @@ __exportStar(require("./many-entity.query"), exports);
|
|
|
18
18
|
__exportStar(require("./delete.presenter"), exports);
|
|
19
19
|
__exportStar(require("./entity.param"), exports);
|
|
20
20
|
__exportStar(require("./entity.query"), exports);
|
|
21
|
+
__exportStar(require("./paging.query"), exports);
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
package/src/dtos/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/dtos/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,qDAAmC;AACnC,iDAA+B;AAC/B,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/dtos/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,qDAAmC;AACnC,iDAA+B;AAC/B,iDAA+B;AAC/B,iDAA+B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PagingQuery = void 0;
|
|
13
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const class_validator_1 = require("class-validator");
|
|
16
|
+
class PagingQuery {
|
|
17
|
+
}
|
|
18
|
+
exports.PagingQuery = PagingQuery;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, swagger_1.ApiPropertyOptional)({ example: 1, minimum: 1, description: '1-based page number.' }),
|
|
21
|
+
(0, class_validator_1.IsOptional)(),
|
|
22
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
23
|
+
(0, class_validator_1.IsInt)(),
|
|
24
|
+
(0, class_validator_1.Min)(1),
|
|
25
|
+
__metadata("design:type", Number)
|
|
26
|
+
], PagingQuery.prototype, "page", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, swagger_1.ApiPropertyOptional)({ example: 20, minimum: 1, description: 'Documents per page.' }),
|
|
29
|
+
(0, class_validator_1.IsOptional)(),
|
|
30
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
31
|
+
(0, class_validator_1.IsInt)(),
|
|
32
|
+
(0, class_validator_1.Min)(1),
|
|
33
|
+
__metadata("design:type", Number)
|
|
34
|
+
], PagingQuery.prototype, "pageSize", void 0);
|
|
35
|
+
//# sourceMappingURL=paging.query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paging.query.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/dtos/paging.query.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAsD;AACtD,yDAAyC;AACzC,qDAAyD;AAuBzD,MAAa,WAAW;CAcvB;AAdD,kCAcC;AARC;IALC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACpF,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;yCACO;AAOd;IALC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACpF,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;6CACW"}
|
|
@@ -16,6 +16,7 @@ const mongoose_1 = require("@nestjs/mongoose");
|
|
|
16
16
|
const gateways_1 = require("./gateways");
|
|
17
17
|
const guards_1 = require("./guards");
|
|
18
18
|
const helpers_1 = require("./helpers");
|
|
19
|
+
const cache_path_registry_store_1 = require("./helpers/cache-path-registry.store");
|
|
19
20
|
const interceptors_1 = require("./interceptors");
|
|
20
21
|
const interfaces_1 = require("./interfaces");
|
|
21
22
|
const modules_1 = require("./modules");
|
|
@@ -56,6 +57,7 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
|
56
57
|
const schema = (0, helpers_1.buildSchemaFromEntity)(entity);
|
|
57
58
|
const databaseModule = mongoose_1.MongooseModule.forFeature([{ name: entity.name, schema }], this.state.get('connectionName'));
|
|
58
59
|
services_1.DynamicApiGlobalStateService.addEntitySchema(entity, schema);
|
|
60
|
+
cache_path_registry_store_1.DynamicApiCachePathRegistryStore.register(entity.name, controllerOptions.path);
|
|
59
61
|
return new Promise((resolve, reject) => {
|
|
60
62
|
const waitForState = setTimeout(() => {
|
|
61
63
|
reject(new Error('Dynamic API state could not be initialized. Please check your configuration.'));
|
|
@@ -123,9 +125,9 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
|
123
125
|
providers: [
|
|
124
126
|
{
|
|
125
127
|
provide: core_1.APP_INTERCEPTOR,
|
|
126
|
-
inject: [cache_manager_1.CACHE_MANAGER, core_1.Reflector, http_adapter_host_1.HttpAdapterHost, interfaces_1.DYNAMIC_API_GLOBAL_STATE],
|
|
127
|
-
useFactory: (cacheManager, reflector, httpAdapterHost, state) => {
|
|
128
|
-
return new interceptors_1.DynamicApiCacheInterceptor(cacheManager, reflector, httpAdapterHost, state);
|
|
128
|
+
inject: [cache_manager_1.CACHE_MANAGER, core_1.Reflector, http_adapter_host_1.HttpAdapterHost, interfaces_1.DYNAMIC_API_GLOBAL_STATE, services_1.DynamicApiCacheService],
|
|
129
|
+
useFactory: (cacheManager, reflector, httpAdapterHost, state, cacheService) => {
|
|
130
|
+
return new interceptors_1.DynamicApiCacheInterceptor(cacheManager, reflector, httpAdapterHost, state, cacheService);
|
|
129
131
|
},
|
|
130
132
|
},
|
|
131
133
|
...(routes.some((r) => r.broadcast) ? [
|
|
@@ -149,6 +151,7 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
|
149
151
|
isGlobalCacheEnabled: useGlobalCache,
|
|
150
152
|
...(onAfterSaveError ? { onAfterSaveError } : {}),
|
|
151
153
|
...(cacheOptions?.excludePaths ? { cacheExcludedPaths: cacheOptions?.excludePaths } : {}),
|
|
154
|
+
...(cacheOptions?.keyBy ? { cacheKeyBy: cacheOptions.keyBy } : {}),
|
|
152
155
|
...(useAuth?.userEntity ? {
|
|
153
156
|
isAuthEnabled: true,
|
|
154
157
|
credentials: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-api.module.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/dynamic-api.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,yDAAmE;AACnE,2CAAuD;AACvD,uCAAqE;AACrE,8EAAyE;AACzE,+CAAkD;AAElD,yCAA8D;AAC9D,qCAAkD;AAClD,uCAA2H;AAC3H,iDAA4D;AAC5D,6CAA6R;AAE7R,uCAAsF;AACtF,qCAA+T;AAC/T,
|
|
1
|
+
{"version":3,"file":"dynamic-api.module.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/dynamic-api.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext, Type } from '@nestjs/common';
|
|
2
2
|
import { PipelineStage } from 'mongodb-pipeline-builder';
|
|
3
3
|
import { Model } from 'mongoose';
|
|
4
|
-
import { AbilityPredicate, PredicateBehavior, RouteType } from '../interfaces';
|
|
4
|
+
import { AbilityPredicate, AuthAbilityPredicate, PredicateBehavior, RouteType } from '../interfaces';
|
|
5
5
|
import { BaseEntity } from '../models';
|
|
6
6
|
import { BaseService } from '../services';
|
|
7
7
|
declare abstract class BasePoliciesGuard<Entity extends BaseEntity> extends BaseService<Entity> implements CanActivate {
|
|
@@ -9,8 +9,10 @@ declare abstract class BasePoliciesGuard<Entity extends BaseEntity> extends Base
|
|
|
9
9
|
protected routeType: RouteType;
|
|
10
10
|
protected entity: Type<Entity>;
|
|
11
11
|
protected abilityPredicate: AbilityPredicate<Entity> | undefined;
|
|
12
|
+
protected authAbilityPredicate: AuthAbilityPredicate<unknown> | undefined;
|
|
12
13
|
protected predicateBehavior: PredicateBehavior | undefined;
|
|
13
14
|
protected queryToPipeline?: (query: unknown) => PipelineStage[];
|
|
15
|
+
protected targetParam: string | undefined;
|
|
14
16
|
protected constructor(model: Model<Entity>);
|
|
15
17
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
16
18
|
}
|
|
@@ -18,6 +20,7 @@ declare abstract class BaseSocketPoliciesGuard<Entity extends BaseEntity> extend
|
|
|
18
20
|
protected readonly model: Model<Entity>;
|
|
19
21
|
protected routeType: RouteType;
|
|
20
22
|
protected abilityPredicate: AbilityPredicate<Entity> | undefined;
|
|
23
|
+
protected authAbilityPredicate: AuthAbilityPredicate<unknown> | undefined;
|
|
21
24
|
protected predicateBehavior: PredicateBehavior | undefined;
|
|
22
25
|
protected entity: Type<Entity>;
|
|
23
26
|
protected queryToPipeline?: (query: unknown) => PipelineStage[];
|
|
@@ -11,14 +11,21 @@ class BasePoliciesGuard extends services_1.BaseService {
|
|
|
11
11
|
this.model = model;
|
|
12
12
|
}
|
|
13
13
|
async canActivate(context) {
|
|
14
|
-
const { user, query, params } = context.switchToHttp().getRequest();
|
|
14
|
+
const { user, query, params, body } = context.switchToHttp().getRequest();
|
|
15
|
+
if (this.authAbilityPredicate) {
|
|
16
|
+
if (!user || !this.authAbilityPredicate(user, body)) {
|
|
17
|
+
throw new common_1.ForbiddenException('Access Denied');
|
|
18
|
+
}
|
|
19
|
+
this.user = user;
|
|
20
|
+
}
|
|
15
21
|
if (this.abilityPredicate && this.predicateBehavior !== 'filter') {
|
|
16
22
|
if (!user) {
|
|
17
23
|
throw new common_1.ForbiddenException('Access Denied');
|
|
18
24
|
}
|
|
19
25
|
this.user = user;
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
const targetId = params?.[this.targetParam ?? 'id'];
|
|
27
|
+
if (targetId) {
|
|
28
|
+
await this.findOneDocumentWithAbilityPredicate(targetId, query);
|
|
22
29
|
}
|
|
23
30
|
else if (this.routeType === 'Aggregate' && query && this.queryToPipeline) {
|
|
24
31
|
await this.aggregateDocumentsWithAbilityPredicate(this.queryToPipeline(query));
|
|
@@ -57,6 +64,10 @@ class BaseSocketPoliciesGuard extends services_1.BaseService {
|
|
|
57
64
|
this.logger.warn('No user data in socket');
|
|
58
65
|
throw new websockets_1.WsException('Access Denied');
|
|
59
66
|
}
|
|
67
|
+
if (this.authAbilityPredicate && !this.authAbilityPredicate(socket.user, data)) {
|
|
68
|
+
this.logger.warn('authAbilityPredicate denied access');
|
|
69
|
+
throw new websockets_1.WsException('Access Denied');
|
|
70
|
+
}
|
|
60
71
|
if (this.abilityPredicate && this.predicateBehavior !== 'filter') {
|
|
61
72
|
try {
|
|
62
73
|
this.user = socket.user;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-policies.guard.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/guards/base-policies.guard.ts"],"names":[],"mappings":";;;AAAA,2CAAyF;AACzF,mDAAiD;AAIjD,sCAAoD;AAEpD,0CAA0C;AAG1C,MAAe,iBAA6C,SAAQ,sBAAmB;
|
|
1
|
+
{"version":3,"file":"base-policies.guard.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/guards/base-policies.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface CachePathEntry {
|
|
2
|
+
entityName: string;
|
|
3
|
+
path: string;
|
|
4
|
+
}
|
|
5
|
+
declare class DynamicApiCachePathRegistryStore {
|
|
6
|
+
private static readonly entries;
|
|
7
|
+
static register(entityName: string, path: string): void;
|
|
8
|
+
static getAll(): CachePathEntry[];
|
|
9
|
+
static getPath(entityName: string): string | undefined;
|
|
10
|
+
static findPrefixForUrl(url: string): string | undefined;
|
|
11
|
+
static reset(): void;
|
|
12
|
+
}
|
|
13
|
+
export { DynamicApiCachePathRegistryStore, CachePathEntry };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamicApiCachePathRegistryStore = void 0;
|
|
4
|
+
class DynamicApiCachePathRegistryStore {
|
|
5
|
+
static register(entityName, path) {
|
|
6
|
+
DynamicApiCachePathRegistryStore.entries.set(entityName, { entityName, path });
|
|
7
|
+
}
|
|
8
|
+
static getAll() {
|
|
9
|
+
return Array.from(DynamicApiCachePathRegistryStore.entries.values());
|
|
10
|
+
}
|
|
11
|
+
static getPath(entityName) {
|
|
12
|
+
return DynamicApiCachePathRegistryStore.entries.get(entityName)?.path;
|
|
13
|
+
}
|
|
14
|
+
static findPrefixForUrl(url) {
|
|
15
|
+
const [pathname] = url.split('?');
|
|
16
|
+
const urlSegments = pathname.split('/').filter(Boolean);
|
|
17
|
+
let best;
|
|
18
|
+
for (const { path } of DynamicApiCachePathRegistryStore.entries.values()) {
|
|
19
|
+
const pathSegments = path.split('/').filter(Boolean);
|
|
20
|
+
if (pathSegments.length === 0) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
for (let start = 0; start <= urlSegments.length - pathSegments.length; start++) {
|
|
24
|
+
const matches = pathSegments.every((segment, i) => urlSegments[start + i] === segment);
|
|
25
|
+
if (!matches) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (!best || pathSegments.length > best.segmentCount) {
|
|
29
|
+
best = {
|
|
30
|
+
prefix: `/${urlSegments.slice(0, start + pathSegments.length).join('/')}`,
|
|
31
|
+
segmentCount: pathSegments.length,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return best?.prefix;
|
|
38
|
+
}
|
|
39
|
+
static reset() {
|
|
40
|
+
DynamicApiCachePathRegistryStore.entries.clear();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.DynamicApiCachePathRegistryStore = DynamicApiCachePathRegistryStore;
|
|
44
|
+
DynamicApiCachePathRegistryStore.entries = new Map();
|
|
45
|
+
//# sourceMappingURL=cache-path-registry.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-path-registry.store.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/cache-path-registry.store.ts"],"names":[],"mappings":";;;AAeA,MAAM,gCAAgC;IAGpC,MAAM,CAAC,QAAQ,CAAC,UAAkB,EAAE,IAAY;QAE9C,gCAAgC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,UAAkB;QAC/B,OAAO,gCAAgC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IACxE,CAAC;IAUD,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACjC,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,IAA0D,CAAC;QAE/D,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,gCAAgC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACzE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/E,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;gBACvF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrD,IAAI,GAAG;wBACL,MAAM,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;wBACzE,YAAY,EAAE,YAAY,CAAC,MAAM;qBAClC,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,MAAM,CAAC;IACtB,CAAC;IAGD,MAAM,CAAC,KAAK;QACV,gCAAgC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACnD,CAAC;;AAGM,4EAAgC;AA5Df,wCAAO,GAAG,IAAI,GAAG,EAA0B,CAAC"}
|
package/src/helpers/index.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export * from './mint-token-pair.helper';
|
|
|
7
7
|
export * from './mixin-data.helper';
|
|
8
8
|
export * from './mongo-transaction.helper';
|
|
9
9
|
export * from './mongoose-cast-error.helper';
|
|
10
|
+
export * from './paging-params.helper';
|
|
11
|
+
export * from './paging-presenter-warning.helper';
|
|
12
|
+
export * from './pipeline-paging.helper';
|
|
10
13
|
export * from './predicate-identifier.helper';
|
|
11
14
|
export * from './repository.helper';
|
|
12
15
|
export * from './resolve-broadcast.helper';
|
package/src/helpers/index.js
CHANGED
|
@@ -23,6 +23,9 @@ __exportStar(require("./mint-token-pair.helper"), exports);
|
|
|
23
23
|
__exportStar(require("./mixin-data.helper"), exports);
|
|
24
24
|
__exportStar(require("./mongo-transaction.helper"), exports);
|
|
25
25
|
__exportStar(require("./mongoose-cast-error.helper"), exports);
|
|
26
|
+
__exportStar(require("./paging-params.helper"), exports);
|
|
27
|
+
__exportStar(require("./paging-presenter-warning.helper"), exports);
|
|
28
|
+
__exportStar(require("./pipeline-paging.helper"), exports);
|
|
26
29
|
__exportStar(require("./predicate-identifier.helper"), exports);
|
|
27
30
|
__exportStar(require("./repository.helper"), exports);
|
|
28
31
|
__exportStar(require("./resolve-broadcast.helper"), exports);
|
package/src/helpers/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yEAAuD;AACvD,kDAAgC;AAChC,qDAAmC;AACnC,sDAAoC;AACpC,kDAAgC;AAChC,2DAAyC;AACzC,sDAAoC;AACpC,6DAA2C;AAC3C,+DAA6C;AAC7C,gEAA8C;AAC9C,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,qEAAmD;AACnD,0DAAwC;AACxC,6DAA2C;AAC3C,6DAA2C;AAC3C,oDAAkC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yEAAuD;AACvD,kDAAgC;AAChC,qDAAmC;AACnC,sDAAoC;AACpC,kDAAgC;AAChC,2DAAyC;AACzC,sDAAoC;AACpC,6DAA2C;AAC3C,+DAA6C;AAC7C,yDAAuC;AACvC,oEAAkD;AAClD,2DAAyC;AACzC,gEAA8C;AAC9C,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,qEAAmD;AACnD,0DAAwC;AACxC,6DAA2C;AAC3C,6DAA2C;AAC3C,oDAAkC"}
|
|
@@ -3,8 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getMixinData = getMixinData;
|
|
4
4
|
const lodash_helper_1 = require("./lodash.helper");
|
|
5
5
|
const event_registry_store_1 = require("./event-registry.store");
|
|
6
|
+
const logger_1 = require("../logger");
|
|
7
|
+
const dynamic_api_global_state_service_1 = require("../services/dynamic-api-global-state/dynamic-api-global-state.service");
|
|
6
8
|
const controller_ability_predicates_helper_1 = require("./controller-ability-predicates.helper");
|
|
7
9
|
const format_helper_1 = require("./format.helper");
|
|
10
|
+
const FILTER_MODE_ROUTE_TYPES = new Set(['GetMany', 'Aggregate']);
|
|
11
|
+
const logger = new logger_1.MongoDBDynamicApiLogger('DynamicApiModule');
|
|
8
12
|
function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }, isGateway = false, broadcastConfig) {
|
|
9
13
|
const displayedName = (0, format_helper_1.getDisplayedName)(apiTag, entity.name, subPath);
|
|
10
14
|
let isPublic;
|
|
@@ -28,6 +32,21 @@ function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCac
|
|
|
28
32
|
disableCache = false;
|
|
29
33
|
}
|
|
30
34
|
const abilityPredicate = routeAbilityPredicate ?? (0, controller_ability_predicates_helper_1.getPredicateFromControllerAbilityPredicates)(controllerAbilityPredicates, routeType);
|
|
35
|
+
if (!isGateway &&
|
|
36
|
+
!isPublic &&
|
|
37
|
+
abilityPredicate &&
|
|
38
|
+
predicateBehavior === 'filter' &&
|
|
39
|
+
!disableCache &&
|
|
40
|
+
FILTER_MODE_ROUTE_TYPES.has(routeType) &&
|
|
41
|
+
dynamic_api_global_state_service_1.DynamicApiGlobalStateService.getValue('isGlobalCacheEnabled')) {
|
|
42
|
+
logger.warn(`[Cache Safety] Route ${routeType} on ${entity.name}: predicateBehavior 'filter' combined with an `
|
|
43
|
+
+ `active response cache. In 'filter' mode the Guard performs no per-request check, so if the cache's `
|
|
44
|
+
+ `key doesn't vary per caller (see cacheOptions.keyBy), the response computed for the first caller `
|
|
45
|
+
+ `could be served as-is to a later caller with different permissions. Safe by default when `
|
|
46
|
+
+ `cacheOptions.keyBy is 'url+identity' (the default) and every caller is authenticated. Otherwise, `
|
|
47
|
+
+ `set disableCache: true on this route, use a predicateBehavior other than 'filter', or mark the `
|
|
48
|
+
+ `route isPublic: true if its filtered response is genuinely identical for every caller.`);
|
|
49
|
+
}
|
|
31
50
|
const event = eventName ?? (0, lodash_helper_1.kebabCase)(`${routeType}/${displayedName}`);
|
|
32
51
|
if (broadcastConfig) {
|
|
33
52
|
event_registry_store_1.DynamicApiEventRegistryStore.register({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface ParsePagingParamsOptions {
|
|
2
|
+
defaultPageSize?: number;
|
|
3
|
+
maxPageSize?: number;
|
|
4
|
+
}
|
|
5
|
+
interface ParsedPagingParams {
|
|
6
|
+
page: number;
|
|
7
|
+
pageSize: number;
|
|
8
|
+
}
|
|
9
|
+
declare function parsePagingParams(query: {
|
|
10
|
+
page?: number;
|
|
11
|
+
pageSize?: number;
|
|
12
|
+
}, options?: ParsePagingParamsOptions): ParsedPagingParams;
|
|
13
|
+
export { parsePagingParams, ParsePagingParamsOptions, ParsedPagingParams };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePagingParams = parsePagingParams;
|
|
4
|
+
function parsePagingParams(query, options = {}) {
|
|
5
|
+
const { defaultPageSize = 20, maxPageSize = 100 } = options;
|
|
6
|
+
const page = clamp(query.page, 1, 1, Number.POSITIVE_INFINITY);
|
|
7
|
+
const pageSize = clamp(query.pageSize, defaultPageSize, 1, maxPageSize);
|
|
8
|
+
return { page, pageSize };
|
|
9
|
+
}
|
|
10
|
+
function clamp(value, fallback, min, max) {
|
|
11
|
+
const truncated = Number.isFinite(value) ? Math.trunc(value) : fallback;
|
|
12
|
+
return Math.min(max, Math.max(min, truncated));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=paging-params.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paging-params.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/paging-params.helper.ts"],"names":[],"mappings":";;AAiDS,8CAAiB;AAlB1B,SAAS,iBAAiB,CACxB,KAA2C,EAC3C,UAAoC,EAAE;IAEtC,MAAM,EAAE,eAAe,GAAG,EAAE,EAAE,WAAW,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAE5D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAExE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAGD,SAAS,KAAK,CAAC,KAAyB,EAAE,QAAgB,EAAE,GAAW,EAAE,GAAW;IAClF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.warnIfPagingResultDropped = warnIfPagingResultDropped;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
const pipeline_paging_helper_1 = require("./pipeline-paging.helper");
|
|
6
|
+
const logger = new logger_1.MongoDBDynamicApiLogger('AggregateRoute');
|
|
7
|
+
function warnIfPagingResultDropped(pipeline, hasFromAggregate, entityName) {
|
|
8
|
+
if (hasFromAggregate || !(0, pipeline_paging_helper_1.isPagingPipeline)(pipeline)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
logger.warn(`[Aggregate] "${entityName}": pipeline uses .Paging(), but the route's presenter has no `
|
|
12
|
+
+ 'static fromAggregate(list, count, totalPage) method — count/totalPage are computed then '
|
|
13
|
+
+ 'silently dropped from the response; only the raw list array is returned. Add fromAggregate '
|
|
14
|
+
+ 'to the presenter (dTOs.presenter) to receive { list, count, totalPage } instead.');
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=paging-presenter-warning.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paging-presenter-warning.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/paging-presenter-warning.helper.ts"],"names":[],"mappings":";;AAqCS,8DAAyB;AApClC,sCAAoD;AACpD,qEAA4D;AAE5D,MAAM,MAAM,GAAG,IAAI,gCAAuB,CAAC,gBAAgB,CAAC,CAAC;AAgB7D,SAAS,yBAAyB,CAChC,QAAyB,EACzB,gBAAyB,EACzB,UAAkB;IAElB,IAAI,gBAAgB,IAAI,CAAC,IAAA,yCAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CACT,gBAAgB,UAAU,+DAA+D;UACvF,0FAA0F;UAC1F,6FAA6F;UAC7F,kFAAkF,CACrF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPagingPipeline = isPagingPipeline;
|
|
4
|
+
function isPagingPipeline(pipeline) {
|
|
5
|
+
const firstStageFacet = pipeline[0]?.$facet;
|
|
6
|
+
if (!firstStageFacet) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
const hasValidDocs = Array.isArray(firstStageFacet.docs) && firstStageFacet.docs.length > 0;
|
|
10
|
+
const hasValidCount = Array.isArray(firstStageFacet.count) && firstStageFacet.count.length > 0;
|
|
11
|
+
return hasValidDocs && hasValidCount;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=pipeline-paging.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-paging.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/pipeline-paging.helper.ts"],"names":[],"mappings":";;AAoCS,4CAAgB;AAbzB,SAAS,gBAAgB,CAAC,QAAyB;IACjD,MAAM,eAAe,GAAI,QAAQ,CAAC,CAAC,CAAsB,EAAE,MAAM,CAAC;IAElE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5F,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAE/F,OAAO,YAAY,IAAI,aAAa,CAAC;AACvC,CAAC"}
|
|
@@ -5,14 +5,18 @@ import { HttpAdapterHost } from '@nestjs/core/helpers/http-adapter-host';
|
|
|
5
5
|
import { Cache } from 'cache-manager';
|
|
6
6
|
import { Observable } from 'rxjs';
|
|
7
7
|
import { DynamicApiGlobalState } from '../interfaces';
|
|
8
|
+
import { DynamicApiCacheService } from '../services/dynamic-api-cache/dynamic-api-cache.service';
|
|
8
9
|
export declare class DynamicApiCacheInterceptor extends CacheInterceptor {
|
|
9
10
|
protected readonly cacheManager: Cache;
|
|
10
11
|
protected readonly reflector: Reflector;
|
|
11
12
|
protected readonly httpAdapterHost: HttpAdapterHost;
|
|
12
13
|
private readonly state;
|
|
14
|
+
private readonly cacheService;
|
|
13
15
|
private readonly excludePaths;
|
|
14
|
-
constructor(cacheManager: Cache, reflector: Reflector, httpAdapterHost: HttpAdapterHost, state: DynamicApiGlobalState);
|
|
16
|
+
constructor(cacheManager: Cache, reflector: Reflector, httpAdapterHost: HttpAdapterHost, state: DynamicApiGlobalState, cacheService: DynamicApiCacheService);
|
|
15
17
|
intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>>;
|
|
16
18
|
private static readonly AUTH_PATH_PATTERN;
|
|
19
|
+
protected trackBy(context: ExecutionContext): string | undefined;
|
|
20
|
+
private static extractIdentity;
|
|
17
21
|
isRequestCacheable(context: ExecutionContext): boolean;
|
|
18
22
|
}
|
|
@@ -20,13 +20,15 @@ const core_1 = require("@nestjs/core");
|
|
|
20
20
|
const http_adapter_host_1 = require("@nestjs/core/helpers/http-adapter-host");
|
|
21
21
|
const rxjs_1 = require("rxjs");
|
|
22
22
|
const decorators_1 = require("../decorators");
|
|
23
|
+
const dynamic_api_cache_service_1 = require("../services/dynamic-api-cache/dynamic-api-cache.service");
|
|
23
24
|
let DynamicApiCacheInterceptor = DynamicApiCacheInterceptor_1 = class DynamicApiCacheInterceptor extends cache_manager_1.CacheInterceptor {
|
|
24
|
-
constructor(cacheManager, reflector, httpAdapterHost, state) {
|
|
25
|
+
constructor(cacheManager, reflector, httpAdapterHost, state, cacheService) {
|
|
25
26
|
super(cacheManager, reflector);
|
|
26
27
|
this.cacheManager = cacheManager;
|
|
27
28
|
this.reflector = reflector;
|
|
28
29
|
this.httpAdapterHost = httpAdapterHost;
|
|
29
30
|
this.state = state;
|
|
31
|
+
this.cacheService = cacheService;
|
|
30
32
|
this.excludePaths = [
|
|
31
33
|
'/',
|
|
32
34
|
...this.state.cacheExcludedPaths,
|
|
@@ -40,13 +42,26 @@ let DynamicApiCacheInterceptor = DynamicApiCacheInterceptor_1 = class DynamicApi
|
|
|
40
42
|
const req = context.switchToHttp().getRequest();
|
|
41
43
|
const isWriteOperation = !this.allowedMethods.includes(req.method);
|
|
42
44
|
if (isWriteOperation) {
|
|
43
|
-
return Promise.resolve(next.handle().pipe((0, rxjs_1.tap)(() => { this.
|
|
45
|
+
return Promise.resolve(next.handle().pipe((0, rxjs_1.tap)(() => { this.cacheService.invalidateForUrl(req.url); })));
|
|
44
46
|
}
|
|
45
47
|
if (!this.isRequestCacheable(context)) {
|
|
46
48
|
return Promise.resolve(next.handle());
|
|
47
49
|
}
|
|
48
50
|
return super.intercept(context, next);
|
|
49
51
|
}
|
|
52
|
+
trackBy(context) {
|
|
53
|
+
const req = context.switchToHttp().getRequest();
|
|
54
|
+
const url = req?.url;
|
|
55
|
+
if (!url || this.state.cacheKeyBy !== 'url+identity') {
|
|
56
|
+
return url;
|
|
57
|
+
}
|
|
58
|
+
const identity = DynamicApiCacheInterceptor_1.extractIdentity(req);
|
|
59
|
+
return identity ? `${url}::${identity}` : url;
|
|
60
|
+
}
|
|
61
|
+
static extractIdentity(req) {
|
|
62
|
+
const id = req?.user?._id ?? req?.user?.id;
|
|
63
|
+
return id !== undefined && id !== null ? id.toString() : undefined;
|
|
64
|
+
}
|
|
50
65
|
isRequestCacheable(context) {
|
|
51
66
|
const disableCache = this.reflector.get(decorators_1.DISABLE_CACHE_KEY, context.getHandler());
|
|
52
67
|
if (disableCache === true) {
|
|
@@ -65,6 +80,6 @@ exports.DynamicApiCacheInterceptor = DynamicApiCacheInterceptor = DynamicApiCach
|
|
|
65
80
|
(0, common_1.Injectable)(),
|
|
66
81
|
__param(0, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
|
|
67
82
|
__metadata("design:paramtypes", [Object, core_1.Reflector,
|
|
68
|
-
http_adapter_host_1.HttpAdapterHost, Object])
|
|
83
|
+
http_adapter_host_1.HttpAdapterHost, Object, dynamic_api_cache_service_1.DynamicApiCacheService])
|
|
69
84
|
], DynamicApiCacheInterceptor);
|
|
70
85
|
//# sourceMappingURL=dynamic-api-cache.interceptor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-api-cache.interceptor.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interceptors/dynamic-api-cache.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAwE;AACxE,2CAAmF;AACnF,uCAAyC;AACzC,8EAAyE;AAEzE,+BAAuC;AACvC,8CAAkD;
|
|
1
|
+
{"version":3,"file":"dynamic-api-cache.interceptor.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/interceptors/dynamic-api-cache.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAwE;AACxE,2CAAmF;AACnF,uCAAyC;AACzC,8EAAyE;AAEzE,+BAAuC;AACvC,8CAAkD;AAKlD,uGAAiG;AAI1F,IAAM,0BAA0B,kCAAhC,MAAM,0BAA2B,SAAQ,gCAAgB;IAM9D,YACyB,YAAsC,EAC1C,SAAoB,EACpB,eAAgC,EAClC,KAA4B,EAC5B,YAAoC;QAErD,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QANW,iBAAY,GAAZ,YAAY,CAAO;QAC1C,cAAS,GAAT,SAAS,CAAW;QACpB,oBAAe,GAAf,eAAe,CAAiB;QAClC,UAAK,GAAL,KAAK,CAAuB;QAC5B,iBAAY,GAAZ,YAAY,CAAwB;QAVtC,iBAAY,GAAG;YAC9B,GAAG;YACH,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB;SACjC,CAAC;QAUA,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAEM,SAAS,CAAC,OAAyB,EAAE,IAAiB;QAC3D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEnE,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAChB,IAAA,UAAG,EAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5D,CACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAUS,OAAO,CAAC,OAAyB;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,GAAG,GAAuB,GAAG,EAAE,GAAG,CAAC;QAEzC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,cAAc,EAAE,CAAC;YACrD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,GAAG,4BAA0B,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,GAA+C;QAC5E,MAAM,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAE,EAA6B,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,CAAC;IAED,kBAAkB,CAAC,OAAyB;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAU,8BAAiB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1F,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAChD,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,oBAAoB;YAC/B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YACxC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,4BAA0B,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAC1F,CAAC;IACJ,CAAC;;AA9EU,gEAA0B;AAwCb,4CAAiB,GAAG,iBAAiB,AAApB,CAAqB;qCAxCnD,0BAA0B;IAFtC,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,6BAAa,CAAC,CAAA;6CACQ,gBAAS;QACH,mCAAe,UAEpB,kDAAsB;GAX5C,0BAA0B,CA+EtC"}
|