mongodb-dynamic-api 1.3.3 → 1.4.1
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 +15 -0
- package/README.md +476 -21
- package/package.json +11 -1
- package/src/builders/casl/casl-ability.builder.d.ts +5 -0
- package/src/builders/casl/casl-ability.builder.js +14 -0
- package/src/builders/index.d.ts +3 -1
- package/src/builders/index.js +3 -1
- package/src/builders/route-decorators/auth-decorators.builder.d.ts +7 -0
- package/src/builders/route-decorators/auth-decorators.builder.js +14 -0
- package/src/builders/route-decorators/route-decorators.builder.d.ts +23 -0
- package/src/builders/{route-decorators.builder.js → route-decorators/route-decorators.builder.js} +45 -23
- package/src/decorators/check-policies.decorator.d.ts +5 -0
- package/src/decorators/check-policies.decorator.js +8 -0
- package/src/decorators/index.d.ts +2 -0
- package/src/decorators/index.js +2 -0
- package/src/decorators/public.decorator.d.ts +3 -0
- package/src/decorators/public.decorator.js +8 -0
- package/src/dynamic-api.module.d.ts +5 -4
- package/src/dynamic-api.module.js +132 -87
- package/src/guards/base-policies.guard.d.ts +13 -0
- package/src/guards/base-policies.guard.js +32 -0
- package/src/guards/dynamic-api-jwt-auth.guard.d.ts +11 -0
- package/src/guards/dynamic-api-jwt-auth.guard.js +38 -0
- package/src/guards/index.d.ts +2 -0
- package/src/guards/index.js +18 -0
- package/src/helpers/controller-ability-predicates.helper.d.ts +4 -0
- package/src/helpers/controller-ability-predicates.helper.js +23 -0
- package/src/helpers/index.d.ts +1 -0
- package/src/helpers/index.js +1 -0
- package/src/helpers/route-decorators.helper.d.ts +2 -2
- package/src/helpers/schema.helper.d.ts +28 -0
- package/src/helpers/schema.helper.js +22 -0
- package/src/index.d.ts +3 -1
- package/src/index.js +3 -1
- package/src/interceptors/dynamic-api-cache.interceptor.d.ts +16 -0
- package/src/interceptors/dynamic-api-cache.interceptor.js +48 -0
- package/src/interceptors/index.d.ts +1 -0
- package/src/interceptors/index.js +17 -0
- package/src/interfaces/controller-options.interface.d.ts +5 -1
- package/src/interfaces/decorator-builder.interface.d.ts +5 -0
- package/src/interfaces/dynamic-api-cache-options.interface.d.ts +1 -0
- package/src/interfaces/dynamic-api-casl-ability.interface.d.ts +17 -0
- package/src/interfaces/dynamic-api-casl-ability.interface.js +11 -0
- package/src/interfaces/dynamic-api-global-state.interface.d.ts +16 -0
- package/src/interfaces/dynamic-api-options.interface.d.ts +5 -2
- package/src/interfaces/dynamic-api-options.interface.js +3 -0
- package/src/interfaces/dynamic-api-policy-handler.interface.d.ts +16 -0
- package/src/interfaces/dynamic-api-route-config.interface.d.ts +7 -9
- package/src/interfaces/dynamic-api-route-dtos-bundle.type.d.ts +8 -0
- package/src/interfaces/dynamic-api-route-module.type.d.ts +3 -0
- package/src/interfaces/dynamic-api-route-type.type.d.ts +2 -0
- package/src/interfaces/index.d.ts +11 -2
- package/src/interfaces/index.js +11 -2
- package/src/mixins/create-policies-guard.mixin.d.ts +5 -0
- package/src/mixins/create-policies-guard.mixin.js +37 -0
- package/src/mixins/index.d.ts +1 -0
- package/src/mixins/index.js +1 -0
- package/src/modules/auth/auth.helper.d.ts +10 -0
- package/src/modules/auth/auth.helper.js +103 -0
- package/src/modules/auth/auth.module.d.ts +12 -0
- package/src/modules/auth/auth.module.js +55 -0
- package/src/modules/auth/guards/index.d.ts +2 -0
- package/src/modules/auth/guards/index.js +18 -0
- package/src/modules/auth/guards/jwt-auth.guard.d.ts +4 -0
- package/src/modules/auth/guards/jwt-auth.guard.js +17 -0
- package/src/modules/auth/guards/local-auth.guard.d.ts +4 -0
- package/src/modules/auth/guards/local-auth.guard.js +17 -0
- package/src/modules/auth/index.d.ts +7 -0
- package/src/modules/auth/index.js +23 -0
- package/src/modules/auth/interfaces/auth-controller.interface.d.ts +9 -0
- package/src/modules/auth/interfaces/auth-options.interface.d.ts +22 -0
- package/src/modules/auth/interfaces/auth-service.interface.d.ts +12 -0
- package/src/modules/auth/interfaces/index.d.ts +3 -0
- package/src/modules/auth/interfaces/index.js +19 -0
- package/src/modules/auth/mixins/auth-controller.mixin.d.ts +6 -0
- package/src/modules/auth/mixins/auth-controller.mixin.js +101 -0
- package/src/modules/auth/mixins/auth-register-policies-guard.mixin.d.ts +6 -0
- package/src/modules/auth/mixins/auth-register-policies-guard.mixin.js +59 -0
- package/src/modules/auth/mixins/index.d.ts +2 -0
- package/src/modules/auth/mixins/index.js +18 -0
- package/src/modules/auth/services/base-auth.service.d.ts +51 -0
- package/src/modules/auth/services/base-auth.service.js +64 -0
- package/src/modules/auth/services/index.d.ts +1 -0
- package/src/modules/auth/services/index.js +17 -0
- package/src/modules/auth/strategies/index.d.ts +1 -0
- package/src/modules/auth/strategies/index.js +17 -0
- package/src/modules/auth/strategies/jwt.strategy.d.ts +8 -0
- package/src/modules/auth/strategies/jwt.strategy.js +35 -0
- package/src/modules/dynamic-api-config/dynamic-api-config.module.d.ts +5 -0
- package/src/modules/dynamic-api-config/dynamic-api-config.module.js +31 -0
- package/src/modules/dynamic-api-config/index.d.ts +1 -0
- package/src/modules/dynamic-api-config/index.js +17 -0
- package/src/modules/index.d.ts +2 -11
- package/src/modules/index.js +2 -11
- package/src/routes/create-many/create-many-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/create-many/create-many-controller.mixin.js +26 -4
- package/src/{modules → routes}/create-many/create-many.helper.d.ts +2 -2
- package/src/{modules → routes}/create-many/create-many.helper.js +6 -4
- package/src/{modules → routes}/create-many/create-many.module.d.ts +1 -1
- package/src/{modules → routes}/create-many/create-many.module.js +2 -2
- package/src/routes/create-one/create-one-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/create-one/create-one-controller.mixin.js +25 -3
- package/src/{modules → routes}/create-one/create-one.helper.d.ts +2 -2
- package/src/{modules → routes}/create-one/create-one.helper.js +6 -4
- package/src/routes/create-one/create-one.module.d.ts +6 -0
- package/src/{modules → routes}/create-one/create-one.module.js +3 -3
- package/src/routes/delete-many/delete-many-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/delete-many/delete-many-controller.mixin.js +26 -3
- package/src/{modules → routes}/delete-many/delete-many.helper.d.ts +2 -2
- package/src/{modules → routes}/delete-many/delete-many.helper.js +6 -4
- package/src/routes/delete-many/delete-many.module.d.ts +6 -0
- package/src/{modules → routes}/delete-many/delete-many.module.js +3 -3
- package/src/routes/delete-one/delete-one-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/delete-one/delete-one-controller.mixin.js +26 -3
- package/src/{modules → routes}/delete-one/delete-one.helper.d.ts +2 -2
- package/src/{modules → routes}/delete-one/delete-one.helper.js +6 -4
- package/src/routes/delete-one/delete-one.module.d.ts +6 -0
- package/src/{modules → routes}/delete-one/delete-one.module.js +3 -3
- package/src/routes/duplicate-many/duplicate-many-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/duplicate-many/duplicate-many-controller.mixin.js +25 -3
- package/src/{modules → routes}/duplicate-many/duplicate-many.helper.d.ts +2 -2
- package/src/{modules → routes}/duplicate-many/duplicate-many.helper.js +6 -4
- package/src/routes/duplicate-many/duplicate-many.module.d.ts +6 -0
- package/src/{modules → routes}/duplicate-many/duplicate-many.module.js +3 -3
- package/src/routes/duplicate-one/duplicate-one-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/duplicate-one/duplicate-one-controller.mixin.js +25 -3
- package/src/{modules → routes}/duplicate-one/duplicate-one.helper.d.ts +2 -2
- package/src/{modules → routes}/duplicate-one/duplicate-one.helper.js +6 -4
- package/src/routes/duplicate-one/duplicate-one.module.d.ts +6 -0
- package/src/{modules → routes}/duplicate-one/duplicate-one.module.js +3 -3
- package/src/routes/get-many/get-many-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/get-many/get-many-controller.mixin.js +28 -6
- package/src/routes/get-many/get-many-service.interface.js +2 -0
- package/src/{modules → routes}/get-many/get-many.helper.d.ts +2 -2
- package/src/{modules → routes}/get-many/get-many.helper.js +6 -4
- package/src/routes/get-many/get-many.module.d.ts +6 -0
- package/src/{modules → routes}/get-many/get-many.module.js +3 -3
- package/src/routes/get-one/get-one-controller.interface.js +2 -0
- package/src/routes/get-one/get-one-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/get-one/get-one-controller.mixin.js +25 -3
- package/src/routes/get-one/get-one-service.interface.js +2 -0
- package/src/{modules → routes}/get-one/get-one.helper.d.ts +2 -2
- package/src/{modules → routes}/get-one/get-one.helper.js +6 -4
- package/src/routes/get-one/get-one.module.d.ts +6 -0
- package/src/{modules → routes}/get-one/get-one.module.js +3 -3
- package/src/routes/index.d.ts +11 -0
- package/src/routes/index.js +27 -0
- package/src/routes/replace-one/replace-one-controller.interface.js +2 -0
- package/src/routes/replace-one/replace-one-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/replace-one/replace-one-controller.mixin.js +25 -3
- package/src/routes/replace-one/replace-one-service.interface.js +2 -0
- package/src/{modules → routes}/replace-one/replace-one.helper.d.ts +2 -2
- package/src/{modules → routes}/replace-one/replace-one.helper.js +6 -4
- package/src/routes/replace-one/replace-one.module.d.ts +6 -0
- package/src/{modules → routes}/replace-one/replace-one.module.js +3 -3
- package/src/routes/update-many/update-many-controller.interface.js +2 -0
- package/src/routes/update-many/update-many-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/update-many/update-many-controller.mixin.js +25 -3
- package/src/routes/update-many/update-many-service.interface.js +2 -0
- package/src/{modules → routes}/update-many/update-many.helper.d.ts +2 -2
- package/src/{modules → routes}/update-many/update-many.helper.js +6 -4
- package/src/routes/update-many/update-many.module.d.ts +6 -0
- package/src/{modules → routes}/update-many/update-many.module.js +3 -3
- package/src/routes/update-one/update-one-controller.interface.js +2 -0
- package/src/routes/update-one/update-one-controller.mixin.d.ts +6 -0
- package/src/{modules → routes}/update-one/update-one-controller.mixin.js +25 -3
- package/src/routes/update-one/update-one-service.interface.js +2 -0
- package/src/{modules → routes}/update-one/update-one.helper.d.ts +2 -2
- package/src/{modules → routes}/update-one/update-one.helper.js +6 -4
- package/src/routes/update-one/update-one.module.d.ts +6 -0
- package/src/{modules → routes}/update-one/update-one.module.js +3 -3
- package/src/services/{base.service.d.ts → base/base.service.d.ts} +1 -1
- package/src/services/{base.service.js → base/base.service.js} +2 -2
- package/src/services/bcrypt/bcrypt.service.d.ts +5 -0
- package/src/services/bcrypt/bcrypt.service.js +26 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.d.ts +11 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +36 -0
- package/src/services/index.d.ts +3 -1
- package/src/services/index.js +3 -1
- package/src/version.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/src/builders/route-decorators.builder.d.ts +0 -20
- package/src/modules/create-many/create-many-controller.mixin.d.ts +0 -6
- package/src/modules/create-one/create-one-controller.mixin.d.ts +0 -6
- package/src/modules/create-one/create-one.module.d.ts +0 -6
- package/src/modules/delete-many/delete-many-controller.mixin.d.ts +0 -6
- package/src/modules/delete-many/delete-many.module.d.ts +0 -6
- package/src/modules/delete-one/delete-one-controller.mixin.d.ts +0 -6
- package/src/modules/delete-one/delete-one.module.d.ts +0 -6
- package/src/modules/duplicate-many/duplicate-many-controller.mixin.d.ts +0 -6
- package/src/modules/duplicate-many/duplicate-many.module.d.ts +0 -6
- package/src/modules/duplicate-one/duplicate-one-controller.mixin.d.ts +0 -6
- package/src/modules/duplicate-one/duplicate-one.module.d.ts +0 -6
- package/src/modules/get-many/get-many-controller.mixin.d.ts +0 -6
- package/src/modules/get-many/get-many.module.d.ts +0 -6
- package/src/modules/get-one/get-one-controller.mixin.d.ts +0 -6
- package/src/modules/get-one/get-one.module.d.ts +0 -6
- package/src/modules/replace-one/replace-one-controller.mixin.d.ts +0 -6
- package/src/modules/replace-one/replace-one.module.d.ts +0 -6
- package/src/modules/update-many/update-many-controller.mixin.d.ts +0 -6
- package/src/modules/update-many/update-many.module.d.ts +0 -6
- package/src/modules/update-one/update-one-controller.mixin.d.ts +0 -6
- package/src/modules/update-one/update-one.module.d.ts +0 -6
- /package/src/{modules/create-many/create-many-controller.interface.js → interfaces/decorator-builder.interface.js} +0 -0
- /package/src/{modules/create-many/create-many-service.interface.js → interfaces/dynamic-api-global-state.interface.js} +0 -0
- /package/src/{modules/create-one/create-one-controller.interface.js → interfaces/dynamic-api-policy-handler.interface.js} +0 -0
- /package/src/{modules/create-one/create-one-service.interface.js → interfaces/dynamic-api-route-dtos-bundle.type.js} +0 -0
- /package/src/{modules/delete-many/delete-many-controller.interface.js → interfaces/dynamic-api-route-module.type.js} +0 -0
- /package/src/{modules/delete-many/delete-many-service.interface.js → interfaces/dynamic-api-route-type.type.js} +0 -0
- /package/src/modules/{delete-one/delete-one-controller.interface.js → auth/interfaces/auth-controller.interface.js} +0 -0
- /package/src/modules/{delete-one/delete-one-service.interface.js → auth/interfaces/auth-options.interface.js} +0 -0
- /package/src/modules/{duplicate-many/duplicate-many-controller.interface.js → auth/interfaces/auth-service.interface.js} +0 -0
- /package/src/{modules → routes}/create-many/base-create-many.service.d.ts +0 -0
- /package/src/{modules → routes}/create-many/base-create-many.service.js +0 -0
- /package/src/{modules → routes}/create-many/create-many-controller.interface.d.ts +0 -0
- /package/src/{modules/duplicate-many/duplicate-many-service.interface.js → routes/create-many/create-many-controller.interface.js} +0 -0
- /package/src/{modules → routes}/create-many/create-many-service.interface.d.ts +0 -0
- /package/src/{modules/duplicate-one/duplicate-one-controller.interface.js → routes/create-many/create-many-service.interface.js} +0 -0
- /package/src/{modules → routes}/create-many/index.d.ts +0 -0
- /package/src/{modules → routes}/create-many/index.js +0 -0
- /package/src/{modules → routes}/create-one/base-create-one.service.d.ts +0 -0
- /package/src/{modules → routes}/create-one/base-create-one.service.js +0 -0
- /package/src/{modules → routes}/create-one/create-one-controller.interface.d.ts +0 -0
- /package/src/{modules/duplicate-one/duplicate-one-service.interface.js → routes/create-one/create-one-controller.interface.js} +0 -0
- /package/src/{modules → routes}/create-one/create-one-service.interface.d.ts +0 -0
- /package/src/{modules/get-many/get-many-controller.interface.js → routes/create-one/create-one-service.interface.js} +0 -0
- /package/src/{modules → routes}/create-one/index.d.ts +0 -0
- /package/src/{modules → routes}/create-one/index.js +0 -0
- /package/src/{modules → routes}/delete-many/base-delete-many.service.d.ts +0 -0
- /package/src/{modules → routes}/delete-many/base-delete-many.service.js +0 -0
- /package/src/{modules → routes}/delete-many/delete-many-controller.interface.d.ts +0 -0
- /package/src/{modules/get-many/get-many-service.interface.js → routes/delete-many/delete-many-controller.interface.js} +0 -0
- /package/src/{modules → routes}/delete-many/delete-many-service.interface.d.ts +0 -0
- /package/src/{modules/get-one/get-one-controller.interface.js → routes/delete-many/delete-many-service.interface.js} +0 -0
- /package/src/{modules → routes}/delete-many/delete-many.presenter.d.ts +0 -0
- /package/src/{modules → routes}/delete-many/delete-many.presenter.js +0 -0
- /package/src/{modules → routes}/delete-many/index.d.ts +0 -0
- /package/src/{modules → routes}/delete-many/index.js +0 -0
- /package/src/{modules → routes}/delete-one/base-delete-one.service.d.ts +0 -0
- /package/src/{modules → routes}/delete-one/base-delete-one.service.js +0 -0
- /package/src/{modules → routes}/delete-one/delete-one-controller.interface.d.ts +0 -0
- /package/src/{modules/get-one/get-one-service.interface.js → routes/delete-one/delete-one-controller.interface.js} +0 -0
- /package/src/{modules → routes}/delete-one/delete-one-service.interface.d.ts +0 -0
- /package/src/{modules/replace-one/replace-one-controller.interface.js → routes/delete-one/delete-one-service.interface.js} +0 -0
- /package/src/{modules → routes}/delete-one/delete-one.presenter.d.ts +0 -0
- /package/src/{modules → routes}/delete-one/delete-one.presenter.js +0 -0
- /package/src/{modules → routes}/delete-one/index.d.ts +0 -0
- /package/src/{modules → routes}/delete-one/index.js +0 -0
- /package/src/{modules → routes}/duplicate-many/base-duplicate-many.service.d.ts +0 -0
- /package/src/{modules → routes}/duplicate-many/base-duplicate-many.service.js +0 -0
- /package/src/{modules → routes}/duplicate-many/duplicate-many-controller.interface.d.ts +0 -0
- /package/src/{modules/replace-one/replace-one-service.interface.js → routes/duplicate-many/duplicate-many-controller.interface.js} +0 -0
- /package/src/{modules → routes}/duplicate-many/duplicate-many-service.interface.d.ts +0 -0
- /package/src/{modules/update-many/update-many-controller.interface.js → routes/duplicate-many/duplicate-many-service.interface.js} +0 -0
- /package/src/{modules → routes}/duplicate-many/index.d.ts +0 -0
- /package/src/{modules → routes}/duplicate-many/index.js +0 -0
- /package/src/{modules → routes}/duplicate-one/base-duplicate-one.service.d.ts +0 -0
- /package/src/{modules → routes}/duplicate-one/base-duplicate-one.service.js +0 -0
- /package/src/{modules → routes}/duplicate-one/duplicate-one-controller.interface.d.ts +0 -0
- /package/src/{modules/update-many/update-many-service.interface.js → routes/duplicate-one/duplicate-one-controller.interface.js} +0 -0
- /package/src/{modules → routes}/duplicate-one/duplicate-one-service.interface.d.ts +0 -0
- /package/src/{modules/update-one/update-one-controller.interface.js → routes/duplicate-one/duplicate-one-service.interface.js} +0 -0
- /package/src/{modules → routes}/duplicate-one/index.d.ts +0 -0
- /package/src/{modules → routes}/duplicate-one/index.js +0 -0
- /package/src/{modules → routes}/get-many/base-get-many.service.d.ts +0 -0
- /package/src/{modules → routes}/get-many/base-get-many.service.js +0 -0
- /package/src/{modules → routes}/get-many/get-many-controller.interface.d.ts +0 -0
- /package/src/{modules/update-one/update-one-service.interface.js → routes/get-many/get-many-controller.interface.js} +0 -0
- /package/src/{modules → routes}/get-many/get-many-service.interface.d.ts +0 -0
- /package/src/{modules → routes}/get-many/index.d.ts +0 -0
- /package/src/{modules → routes}/get-many/index.js +0 -0
- /package/src/{modules → routes}/get-one/base-get-one.service.d.ts +0 -0
- /package/src/{modules → routes}/get-one/base-get-one.service.js +0 -0
- /package/src/{modules → routes}/get-one/get-one-controller.interface.d.ts +0 -0
- /package/src/{modules → routes}/get-one/get-one-service.interface.d.ts +0 -0
- /package/src/{modules → routes}/get-one/index.d.ts +0 -0
- /package/src/{modules → routes}/get-one/index.js +0 -0
- /package/src/{modules → routes}/replace-one/base-replace-one.service.d.ts +0 -0
- /package/src/{modules → routes}/replace-one/base-replace-one.service.js +0 -0
- /package/src/{modules → routes}/replace-one/index.d.ts +0 -0
- /package/src/{modules → routes}/replace-one/index.js +0 -0
- /package/src/{modules → routes}/replace-one/replace-one-controller.interface.d.ts +0 -0
- /package/src/{modules → routes}/replace-one/replace-one-service.interface.d.ts +0 -0
- /package/src/{modules → routes}/update-many/base-update-many.service.d.ts +0 -0
- /package/src/{modules → routes}/update-many/base-update-many.service.js +0 -0
- /package/src/{modules → routes}/update-many/index.d.ts +0 -0
- /package/src/{modules → routes}/update-many/index.js +0 -0
- /package/src/{modules → routes}/update-many/update-many-controller.interface.d.ts +0 -0
- /package/src/{modules → routes}/update-many/update-many-service.interface.d.ts +0 -0
- /package/src/{modules → routes}/update-one/base-update-one.service.d.ts +0 -0
- /package/src/{modules → routes}/update-one/base-update-one.service.js +0 -0
- /package/src/{modules → routes}/update-one/index.d.ts +0 -0
- /package/src/{modules → routes}/update-one/index.js +0 -0
- /package/src/{modules → routes}/update-one/update-one-controller.interface.d.ts +0 -0
- /package/src/{modules → routes}/update-one/update-one-service.interface.d.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mongodb-dynamic-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Auto generated CRUD API for MongoDB using NestJS",
|
|
5
5
|
"readmeFilename": "README.md",
|
|
6
6
|
"main": "index.js",
|
|
@@ -38,19 +38,26 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://mikedev75015.github.io",
|
|
40
40
|
"dependencies": {
|
|
41
|
+
"@casl/ability": "^6.7.0",
|
|
41
42
|
"@nestjs/cache-manager": "^2.2.1",
|
|
42
43
|
"@nestjs/common": "^10.3.2",
|
|
43
44
|
"@nestjs/core": "^10.3.2",
|
|
45
|
+
"@nestjs/jwt": "^10.2.0",
|
|
44
46
|
"@nestjs/mongoose": "^10.0.4",
|
|
47
|
+
"@nestjs/passport": "^10.0.3",
|
|
45
48
|
"@nestjs/platform-express": "^10.3.2",
|
|
46
49
|
"@nestjs/swagger": "^7.3.0",
|
|
47
50
|
"@types/lodash": "^4.14.202",
|
|
51
|
+
"bcrypt": "^5.1.1",
|
|
48
52
|
"builder-pattern": "^2.2.0",
|
|
49
53
|
"cache-manager": "^5.4.0",
|
|
50
54
|
"class-transformer": "^0.5.1",
|
|
51
55
|
"class-validator": "^0.14.1",
|
|
52
56
|
"lodash": "^4.17.21",
|
|
53
57
|
"mongoose": "^8.1.1",
|
|
58
|
+
"passport": "^0.7.0",
|
|
59
|
+
"passport-jwt": "^4.0.1",
|
|
60
|
+
"passport-local": "^1.0.0",
|
|
54
61
|
"reflect-metadata": "^0.2.1",
|
|
55
62
|
"rxjs": "^7.8.1"
|
|
56
63
|
},
|
|
@@ -63,9 +70,12 @@
|
|
|
63
70
|
"@release-it/conventional-changelog": "^8.0.1",
|
|
64
71
|
"@swc/cli": "^0.3.9",
|
|
65
72
|
"@swc/core": "^1.4.0",
|
|
73
|
+
"@types/bcrypt": "^5.0.2",
|
|
66
74
|
"@types/express": "^4.17.21",
|
|
67
75
|
"@types/jest": "^29.5.12",
|
|
68
76
|
"@types/node": "^20.11.16",
|
|
77
|
+
"@types/passport-jwt": "^4.0.1",
|
|
78
|
+
"@types/passport-local": "^1.0.38",
|
|
69
79
|
"@types/supertest": "^6.0.2",
|
|
70
80
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
71
81
|
"@typescript-eslint/parser": "^6.21.0",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { AppAbility, DynamicApiRouteCaslAbilityPredicate, RouteType } from '../../interfaces';
|
|
3
|
+
import { BaseEntity } from '../../models';
|
|
4
|
+
declare function CaslAbilityBuilder<Entity extends BaseEntity>(entity: Type<Entity>, routeType: RouteType, abilityPredicate: DynamicApiRouteCaslAbilityPredicate<Entity>, user: unknown): AppAbility<Entity>;
|
|
5
|
+
export { CaslAbilityBuilder };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CaslAbilityBuilder = void 0;
|
|
4
|
+
const ability_1 = require("@casl/ability");
|
|
5
|
+
function CaslAbilityBuilder(entity, routeType, abilityPredicate, user) {
|
|
6
|
+
const { can, build } = new ability_1.AbilityBuilder(ability_1.createMongoAbility);
|
|
7
|
+
if (abilityPredicate(new entity(), user)) {
|
|
8
|
+
can(routeType, entity);
|
|
9
|
+
}
|
|
10
|
+
return build({
|
|
11
|
+
detectSubjectType: (object) => object.constructor
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
exports.CaslAbilityBuilder = CaslAbilityBuilder;
|
package/src/builders/index.d.ts
CHANGED
package/src/builders/index.js
CHANGED
|
@@ -14,4 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
17
|
+
__exportStar(require("./casl/casl-ability.builder"), exports);
|
|
18
|
+
__exportStar(require("./route-decorators/auth-decorators.builder"), exports);
|
|
19
|
+
__exportStar(require("./route-decorators/route-decorators.builder"), exports);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DecoratorBuilder } from '../../interfaces';
|
|
2
|
+
declare class AuthDecoratorsBuilder implements DecoratorBuilder<any> {
|
|
3
|
+
private readonly protectRegister;
|
|
4
|
+
constructor(protectRegister: boolean | undefined);
|
|
5
|
+
build(): (ClassDecorator & MethodDecorator)[];
|
|
6
|
+
}
|
|
7
|
+
export { AuthDecoratorsBuilder };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthDecoratorsBuilder = void 0;
|
|
4
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
5
|
+
const decorators_1 = require("../../decorators");
|
|
6
|
+
class AuthDecoratorsBuilder {
|
|
7
|
+
constructor(protectRegister) {
|
|
8
|
+
this.protectRegister = protectRegister;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
return !this.protectRegister ? [(0, decorators_1.Public)()] : [(0, swagger_1.ApiBearerAuth)()];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.AuthDecoratorsBuilder = AuthDecoratorsBuilder;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { DecoratorBuilder, RouteType } from '../../interfaces';
|
|
3
|
+
import { BaseEntity } from '../../models';
|
|
4
|
+
declare class RouteDecoratorsBuilder<Entity extends BaseEntity> implements DecoratorBuilder<Entity> {
|
|
5
|
+
private readonly routeType;
|
|
6
|
+
private readonly entity;
|
|
7
|
+
private readonly version;
|
|
8
|
+
private readonly description;
|
|
9
|
+
private readonly isPublic;
|
|
10
|
+
private readonly dTOs;
|
|
11
|
+
private readonly responseRouteTypeIsArray;
|
|
12
|
+
private readonly bodyRouteTypeIsOptional;
|
|
13
|
+
constructor(routeType: RouteType, entity: Type<Entity>, version: string | undefined, description: string | undefined, isPublic: boolean | undefined, dTOs?: {
|
|
14
|
+
param?: Type;
|
|
15
|
+
query?: Type;
|
|
16
|
+
body?: Type;
|
|
17
|
+
presenter?: Type;
|
|
18
|
+
});
|
|
19
|
+
build(): any[];
|
|
20
|
+
private getRouteDecorators;
|
|
21
|
+
private getApiDecorators;
|
|
22
|
+
}
|
|
23
|
+
export { RouteDecoratorsBuilder };
|
package/src/builders/{route-decorators.builder.js → route-decorators/route-decorators.builder.js}
RENAMED
|
@@ -4,16 +4,16 @@ exports.RouteDecoratorsBuilder = void 0;
|
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const swagger_1 = require("@nestjs/swagger");
|
|
6
6
|
const lodash_1 = require("lodash");
|
|
7
|
+
const decorators_1 = require("../../decorators");
|
|
8
|
+
const dynamic_api_module_1 = require("../../dynamic-api.module");
|
|
7
9
|
class RouteDecoratorsBuilder {
|
|
8
|
-
constructor(routeType, entity, version, description,
|
|
10
|
+
constructor(routeType, entity, version, description, isPublic, dTOs = {}) {
|
|
9
11
|
this.routeType = routeType;
|
|
10
12
|
this.entity = entity;
|
|
11
13
|
this.version = version;
|
|
12
14
|
this.description = description;
|
|
13
|
-
this.
|
|
14
|
-
this.
|
|
15
|
-
this.body = body;
|
|
16
|
-
this.presenter = presenter;
|
|
15
|
+
this.isPublic = isPublic;
|
|
16
|
+
this.dTOs = dTOs;
|
|
17
17
|
this.responseRouteTypeIsArray = [
|
|
18
18
|
'GetMany',
|
|
19
19
|
'CreateMany',
|
|
@@ -25,39 +25,59 @@ class RouteDecoratorsBuilder {
|
|
|
25
25
|
];
|
|
26
26
|
}
|
|
27
27
|
build() {
|
|
28
|
-
const [paramKey] = this.param ? (0, lodash_1.keys)(new this.param()) : [];
|
|
28
|
+
const [paramKey] = this.dTOs.param ? (0, lodash_1.keys)(new this.dTOs.param()) : [];
|
|
29
29
|
return [
|
|
30
30
|
...this.getRouteDecorators(paramKey),
|
|
31
31
|
...this.getApiDecorators(paramKey),
|
|
32
32
|
];
|
|
33
33
|
}
|
|
34
34
|
getRouteDecorators(paramKey) {
|
|
35
|
+
let routeDecorators = [];
|
|
36
|
+
const isAuthEnabled = dynamic_api_module_1.DynamicApiModule.state.get('isAuthEnabled');
|
|
37
|
+
if (this.isPublic) {
|
|
38
|
+
routeDecorators.push((0, decorators_1.Public)());
|
|
39
|
+
}
|
|
40
|
+
else if (isAuthEnabled) {
|
|
41
|
+
routeDecorators.push((0, swagger_1.ApiBearerAuth)());
|
|
42
|
+
}
|
|
35
43
|
switch (this.routeType) {
|
|
36
44
|
case 'GetMany':
|
|
37
|
-
|
|
45
|
+
routeDecorators.push((0, common_1.Get)());
|
|
46
|
+
break;
|
|
38
47
|
case 'GetOne':
|
|
39
|
-
|
|
48
|
+
routeDecorators.push((0, common_1.Get)(`:${paramKey}`));
|
|
49
|
+
break;
|
|
40
50
|
case 'CreateMany':
|
|
41
|
-
|
|
51
|
+
routeDecorators.push((0, common_1.Post)('many'));
|
|
52
|
+
break;
|
|
42
53
|
case 'CreateOne':
|
|
43
|
-
|
|
54
|
+
routeDecorators.push((0, common_1.Post)());
|
|
55
|
+
break;
|
|
44
56
|
case 'UpdateMany':
|
|
45
|
-
|
|
57
|
+
routeDecorators.push((0, common_1.Patch)());
|
|
58
|
+
break;
|
|
46
59
|
case 'UpdateOne':
|
|
47
|
-
|
|
60
|
+
routeDecorators.push((0, common_1.Patch)(`:${paramKey}`));
|
|
61
|
+
break;
|
|
48
62
|
case 'ReplaceOne':
|
|
49
|
-
|
|
63
|
+
routeDecorators.push((0, common_1.Put)(`:${paramKey}`));
|
|
64
|
+
break;
|
|
50
65
|
case 'DuplicateMany':
|
|
51
|
-
|
|
66
|
+
routeDecorators.push((0, common_1.Post)(`duplicate`));
|
|
67
|
+
break;
|
|
52
68
|
case 'DuplicateOne':
|
|
53
|
-
|
|
69
|
+
routeDecorators.push((0, common_1.Post)(`duplicate/:${paramKey}`));
|
|
70
|
+
break;
|
|
54
71
|
case 'DeleteMany':
|
|
55
|
-
|
|
72
|
+
routeDecorators.push((0, common_1.Delete)());
|
|
73
|
+
break;
|
|
56
74
|
case 'DeleteOne':
|
|
57
|
-
|
|
75
|
+
routeDecorators.push((0, common_1.Delete)(`:${paramKey}`));
|
|
76
|
+
break;
|
|
58
77
|
default:
|
|
59
78
|
throw new Error(`Unexpected route type! Cannot build route decorators. Received: ${this.routeType}`);
|
|
60
79
|
}
|
|
80
|
+
return routeDecorators;
|
|
61
81
|
}
|
|
62
82
|
getApiDecorators(paramKey) {
|
|
63
83
|
return [
|
|
@@ -67,17 +87,19 @@ class RouteDecoratorsBuilder {
|
|
|
67
87
|
`${(0, lodash_1.upperFirst)((0, lodash_1.lowerCase)(this.routeType))} ${(0, lodash_1.lowerCase)(this.entity.name)}`,
|
|
68
88
|
}),
|
|
69
89
|
(0, swagger_1.ApiResponse)({
|
|
70
|
-
type: this.presenter ?? this.entity,
|
|
90
|
+
type: this.dTOs.presenter ?? this.entity,
|
|
71
91
|
isArray: this.responseRouteTypeIsArray.includes(this.routeType),
|
|
72
92
|
}),
|
|
73
|
-
...(this.body ? [
|
|
74
|
-
|
|
93
|
+
...(this.dTOs.body ? [
|
|
94
|
+
(0, swagger_1.ApiBody)({
|
|
95
|
+
type: this.dTOs.body,
|
|
75
96
|
required: !this.bodyRouteTypeIsOptional.includes(this.routeType),
|
|
76
|
-
})
|
|
77
|
-
|
|
97
|
+
}),
|
|
98
|
+
] : []),
|
|
99
|
+
...(this.dTOs.param && paramKey
|
|
78
100
|
? [
|
|
79
101
|
(0, swagger_1.ApiParam)({
|
|
80
|
-
type: typeof new this.param()[paramKey],
|
|
102
|
+
type: typeof new this.dTOs.param()[paramKey],
|
|
81
103
|
name: paramKey,
|
|
82
104
|
}),
|
|
83
105
|
]
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PolicyHandler } from '../interfaces';
|
|
2
|
+
import { BaseEntity } from '../models';
|
|
3
|
+
declare const CHECK_POLICIES_KEY = "check_policy";
|
|
4
|
+
declare const CheckPolicies: <Entity extends BaseEntity>(...handlers: PolicyHandler<Entity>[]) => import("@nestjs/common").CustomDecorator<string>;
|
|
5
|
+
export { CheckPolicies, CHECK_POLICIES_KEY };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CHECK_POLICIES_KEY = exports.CheckPolicies = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const CHECK_POLICIES_KEY = 'check_policy';
|
|
6
|
+
exports.CHECK_POLICIES_KEY = CHECK_POLICIES_KEY;
|
|
7
|
+
const CheckPolicies = (...handlers) => (0, common_1.SetMetadata)(CHECK_POLICIES_KEY, handlers);
|
|
8
|
+
exports.CheckPolicies = CheckPolicies;
|
package/src/decorators/index.js
CHANGED
|
@@ -14,4 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./check-policies.decorator"), exports);
|
|
18
|
+
__exportStar(require("./public.decorator"), exports);
|
|
17
19
|
__exportStar(require("./schema-options.decorator"), exports);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Public = exports.IS_PUBLIC_KEY = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const IS_PUBLIC_KEY = 'isPublic';
|
|
6
|
+
exports.IS_PUBLIC_KEY = IS_PUBLIC_KEY;
|
|
7
|
+
const Public = () => (0, common_1.SetMetadata)(IS_PUBLIC_KEY, true);
|
|
8
|
+
exports.Public = Public;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
2
|
import { DynamicApiForFeatureOptions, DynamicApiForRootOptions } from './interfaces';
|
|
3
3
|
import { BaseEntity } from './models';
|
|
4
|
+
import { DynamicApiGlobalStateService } from './services';
|
|
4
5
|
export declare class DynamicApiModule {
|
|
5
|
-
static readonly
|
|
6
|
-
static
|
|
7
|
-
static
|
|
8
|
-
static
|
|
6
|
+
static readonly state: DynamicApiGlobalStateService;
|
|
7
|
+
static forRoot(uri: string, { useGlobalCache, cacheOptions, useAuth, }?: DynamicApiForRootOptions): DynamicModule;
|
|
8
|
+
static forFeature<Entity extends BaseEntity>({ entity, controllerOptions, routes, }: DynamicApiForFeatureOptions<Entity>): Promise<DynamicModule>;
|
|
9
|
+
private static setDefaultRoutesIfNotConfigured;
|
|
9
10
|
}
|
|
@@ -11,43 +11,143 @@ exports.DynamicApiModule = void 0;
|
|
|
11
11
|
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
12
12
|
const common_1 = require("@nestjs/common");
|
|
13
13
|
const core_1 = require("@nestjs/core");
|
|
14
|
+
const http_adapter_host_1 = require("@nestjs/core/helpers/http-adapter-host");
|
|
14
15
|
const mongoose_1 = require("@nestjs/mongoose");
|
|
15
|
-
const
|
|
16
|
+
const rxjs_1 = require("rxjs");
|
|
17
|
+
const guards_1 = require("./guards");
|
|
16
18
|
const helpers_1 = require("./helpers");
|
|
19
|
+
const interceptors_1 = require("./interceptors");
|
|
20
|
+
const interfaces_1 = require("./interfaces");
|
|
17
21
|
const modules_1 = require("./modules");
|
|
22
|
+
const routes_1 = require("./routes");
|
|
23
|
+
const services_1 = require("./services");
|
|
18
24
|
let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
19
|
-
static forRoot(uri, { useGlobalCache = true, cacheOptions = {} } = {}) {
|
|
25
|
+
static forRoot(uri, { useGlobalCache = true, cacheOptions = {}, useAuth, } = {}) {
|
|
20
26
|
if (!uri) {
|
|
21
27
|
throw new Error('You must provide a valid mongodb uri in the forRoot method to use MongoDB Dynamic API');
|
|
22
28
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
this.state.set([
|
|
30
|
+
'partial', {
|
|
31
|
+
initialized: true,
|
|
32
|
+
isGlobalCacheEnabled: useGlobalCache,
|
|
33
|
+
...(cacheOptions?.excludePaths ? { cacheExcludedPaths: cacheOptions?.excludePaths } : {}),
|
|
34
|
+
...(useAuth?.user ? {
|
|
35
|
+
isAuthEnabled: true,
|
|
36
|
+
credentials: {
|
|
37
|
+
loginField: !useAuth.user.loginField ? 'email' : String(useAuth.user.loginField),
|
|
38
|
+
passwordField: !useAuth.user.passwordField ? 'password' : String(useAuth.user.passwordField),
|
|
39
|
+
},
|
|
40
|
+
jwtSecret: useAuth.jwt?.secret ?? 'dynamic-api-jwt-secret',
|
|
41
|
+
} : {}),
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
26
44
|
return {
|
|
27
45
|
module: DynamicApiModule_1,
|
|
28
46
|
imports: [
|
|
29
|
-
|
|
30
|
-
|
|
47
|
+
modules_1.DynamicApiConfigModule.register(this.state.get()),
|
|
48
|
+
cache_manager_1.CacheModule.register({ isGlobal: true, ...cacheOptions }),
|
|
49
|
+
mongoose_1.MongooseModule.forRoot(uri, { connectionName: this.state.get('connectionName') }),
|
|
50
|
+
...(useAuth?.user ? [
|
|
51
|
+
modules_1.AuthModule.forRoot({
|
|
52
|
+
user: {
|
|
53
|
+
entity: useAuth.user.entity,
|
|
54
|
+
loginField: useAuth.user.loginField ?? 'email',
|
|
55
|
+
passwordField: useAuth.user.passwordField ?? 'password',
|
|
56
|
+
additionalFields: useAuth.user.additionalFields ?? {
|
|
57
|
+
toRegister: [],
|
|
58
|
+
toRequest: [],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
jwt: {
|
|
62
|
+
secret: useAuth.jwt?.secret ?? 'dynamic-api-jwt-secret',
|
|
63
|
+
expiresIn: useAuth.jwt?.expiresIn ?? '1d',
|
|
64
|
+
},
|
|
65
|
+
protectRegister: useAuth.protectRegister ?? false,
|
|
66
|
+
registerAbilityPredicate: useAuth.registerAbilityPredicate,
|
|
67
|
+
}),
|
|
68
|
+
] : []),
|
|
31
69
|
],
|
|
70
|
+
exports: [modules_1.DynamicApiConfigModule],
|
|
32
71
|
};
|
|
33
72
|
}
|
|
34
|
-
static forFeature({ entity, controllerOptions
|
|
35
|
-
const {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
73
|
+
static forFeature({ entity, controllerOptions, routes = [], }) {
|
|
74
|
+
const databaseModule = mongoose_1.MongooseModule.forFeature([{ name: entity.name, schema: (0, helpers_1.buildSchemaFromEntity)(entity) }], this.state.get('connectionName'));
|
|
75
|
+
routes = this.setDefaultRoutesIfNotConfigured([...routes]);
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
const waitInitializedStateInterval = setInterval(async () => {
|
|
78
|
+
const stateInitialized = await (0, rxjs_1.firstValueFrom)(this.state.get().onInitialized());
|
|
79
|
+
if (!stateInitialized) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (waitForState) {
|
|
83
|
+
clearTimeout(waitForState);
|
|
84
|
+
}
|
|
85
|
+
clearInterval(waitInitializedStateInterval);
|
|
86
|
+
const { version: controllerVersion, validationPipeOptions: controllerValidationPipeOptions, } = controllerOptions;
|
|
87
|
+
const castType = (t) => t;
|
|
88
|
+
const castModule = (m) => m;
|
|
89
|
+
const moduleByRouteType = new Map([
|
|
90
|
+
[castType('CreateMany'), castModule(routes_1.CreateManyModule)],
|
|
91
|
+
[castType('CreateOne'), castModule(routes_1.CreateOneModule)],
|
|
92
|
+
[castType('DeleteMany'), castModule(routes_1.DeleteManyModule)],
|
|
93
|
+
[castType('DeleteOne'), castModule(routes_1.DeleteOneModule)],
|
|
94
|
+
[castType('DuplicateMany'), castModule(routes_1.DuplicateManyModule)],
|
|
95
|
+
[castType('DuplicateOne'), castModule(routes_1.DuplicateOneModule)],
|
|
96
|
+
[castType('GetMany'), castModule(routes_1.GetManyModule)],
|
|
97
|
+
[castType('GetOne'), castModule(routes_1.GetOneModule)],
|
|
98
|
+
[castType('ReplaceOne'), castModule(routes_1.ReplaceOneModule)],
|
|
99
|
+
[castType('UpdateMany'), castModule(routes_1.UpdateManyModule)],
|
|
100
|
+
[castType('UpdateOne'), castModule(routes_1.UpdateOneModule)],
|
|
101
|
+
]);
|
|
102
|
+
const apiModule = {
|
|
103
|
+
module: DynamicApiModule_1,
|
|
104
|
+
imports: [
|
|
105
|
+
...routes.map((routeConfig) => {
|
|
106
|
+
const { type, description: routeDescription, version: routeVersion, validationPipeOptions: routeValidationPipeOptions, } = routeConfig;
|
|
107
|
+
const module = moduleByRouteType.get(type);
|
|
108
|
+
if (!module) {
|
|
109
|
+
reject(new Error(`Route module for ${type} not found`));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const description = routeDescription ?? (0, helpers_1.getDefaultRouteDescription)(type, entity.name);
|
|
113
|
+
const version = routeVersion ?? controllerVersion;
|
|
114
|
+
if (version && !(0, helpers_1.isValidVersion)(version)) {
|
|
115
|
+
reject(new Error(`Invalid version ${version} for ${type} route.`
|
|
116
|
+
+ ' Version must be a string that matches numeric format, e.g. 1, 2, 3, ..., 99.'));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const validationPipeOptions = routeValidationPipeOptions ?? controllerValidationPipeOptions;
|
|
120
|
+
return module.forFeature(databaseModule, entity, controllerOptions, { ...routeConfig, description }, version, validationPipeOptions ?? { transform: true });
|
|
121
|
+
}),
|
|
122
|
+
],
|
|
123
|
+
providers: [
|
|
124
|
+
{
|
|
125
|
+
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);
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
provide: core_1.APP_GUARD,
|
|
133
|
+
inject: [core_1.Reflector, interfaces_1.DYNAMIC_API_GLOBAL_STATE],
|
|
134
|
+
useFactory: (reflector, state) => {
|
|
135
|
+
return new guards_1.DynamicApiJwtAuthGuard(reflector, state);
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
resolve(apiModule);
|
|
141
|
+
}, 500);
|
|
142
|
+
const waitForState = setTimeout(() => {
|
|
143
|
+
clearInterval(waitInitializedStateInterval);
|
|
144
|
+
reject(new Error('Dynamic API state could not be initialized. Please check your configuration.'));
|
|
145
|
+
}, 5000);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
static setDefaultRoutesIfNotConfigured(routes) {
|
|
49
149
|
if (!routes.length) {
|
|
50
|
-
|
|
150
|
+
return [
|
|
51
151
|
{ type: 'GetMany' },
|
|
52
152
|
{ type: 'GetOne' },
|
|
53
153
|
{ type: 'CreateMany' },
|
|
@@ -61,73 +161,18 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
|
61
161
|
{ type: 'DeleteOne' },
|
|
62
162
|
];
|
|
63
163
|
}
|
|
64
|
-
return
|
|
65
|
-
module: DynamicApiModule_1,
|
|
66
|
-
imports: [
|
|
67
|
-
...routes
|
|
68
|
-
.map(({ type, dTOs, description: routeDescription, version: routeVersion, validationPipeOptions: routeValidationPipeOptions, }) => {
|
|
69
|
-
let module;
|
|
70
|
-
switch (type) {
|
|
71
|
-
case 'CreateMany':
|
|
72
|
-
module = modules_1.CreateManyModule;
|
|
73
|
-
break;
|
|
74
|
-
case 'CreateOne':
|
|
75
|
-
module = modules_1.CreateOneModule;
|
|
76
|
-
break;
|
|
77
|
-
case 'DeleteMany':
|
|
78
|
-
module = modules_1.DeleteManyModule;
|
|
79
|
-
break;
|
|
80
|
-
case 'DeleteOne':
|
|
81
|
-
module = modules_1.DeleteOneModule;
|
|
82
|
-
break;
|
|
83
|
-
case 'DuplicateMany':
|
|
84
|
-
module = modules_1.DuplicateManyModule;
|
|
85
|
-
break;
|
|
86
|
-
case 'DuplicateOne':
|
|
87
|
-
module = modules_1.DuplicateOneModule;
|
|
88
|
-
break;
|
|
89
|
-
case 'GetMany':
|
|
90
|
-
module = modules_1.GetManyModule;
|
|
91
|
-
break;
|
|
92
|
-
case 'GetOne':
|
|
93
|
-
module = modules_1.GetOneModule;
|
|
94
|
-
break;
|
|
95
|
-
case 'ReplaceOne':
|
|
96
|
-
module = modules_1.ReplaceOneModule;
|
|
97
|
-
break;
|
|
98
|
-
case 'UpdateMany':
|
|
99
|
-
module = modules_1.UpdateManyModule;
|
|
100
|
-
break;
|
|
101
|
-
case 'UpdateOne':
|
|
102
|
-
module = modules_1.UpdateOneModule;
|
|
103
|
-
break;
|
|
104
|
-
default:
|
|
105
|
-
throw new Error(`Route for ${type} is not implemented`);
|
|
106
|
-
}
|
|
107
|
-
const description = routeDescription ?? (0, helpers_1.getDefaultRouteDescription)(type, entity.name);
|
|
108
|
-
const version = routeVersion ?? controllerVersion;
|
|
109
|
-
if (version && !(0, helpers_1.isValidVersion)(version)) {
|
|
110
|
-
throw new Error(`Invalid version ${version} for ${type} route. Version must be a string that matches numeric format, e.g. 1, 2, 3, ..., 99.`);
|
|
111
|
-
}
|
|
112
|
-
const validationPipeOptions = routeValidationPipeOptions ?? controllerValidationPipeOptions;
|
|
113
|
-
return module.forFeature(databaseModule, entity, { path, apiTag }, { description, dTOs }, version, validationPipeOptions);
|
|
114
|
-
})
|
|
115
|
-
.filter((module) => module),
|
|
116
|
-
],
|
|
117
|
-
providers: [
|
|
118
|
-
...(DynamicApiModule_1.isGlobalCacheEnabled ? [
|
|
119
|
-
{
|
|
120
|
-
provide: core_1.APP_INTERCEPTOR,
|
|
121
|
-
useClass: cache_manager_1.CacheInterceptor,
|
|
122
|
-
},
|
|
123
|
-
] : []),
|
|
124
|
-
],
|
|
125
|
-
};
|
|
164
|
+
return routes;
|
|
126
165
|
}
|
|
127
166
|
};
|
|
128
167
|
exports.DynamicApiModule = DynamicApiModule;
|
|
129
|
-
DynamicApiModule.
|
|
130
|
-
|
|
168
|
+
DynamicApiModule.state = new services_1.DynamicApiGlobalStateService({
|
|
169
|
+
connectionName: 'dynamic-api-connection',
|
|
170
|
+
isGlobalCacheEnabled: true,
|
|
171
|
+
isAuthEnabled: false,
|
|
172
|
+
credentials: null,
|
|
173
|
+
jwtSecret: undefined,
|
|
174
|
+
cacheExcludedPaths: [],
|
|
175
|
+
});
|
|
131
176
|
exports.DynamicApiModule = DynamicApiModule = DynamicApiModule_1 = __decorate([
|
|
132
177
|
(0, common_1.Module)({})
|
|
133
178
|
], DynamicApiModule);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext, Type } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { DynamicApiRouteCaslAbilityPredicate, RouteType } from '../interfaces';
|
|
4
|
+
import { BaseEntity } from '../models';
|
|
5
|
+
export declare abstract class BasePoliciesGuard<Entity extends BaseEntity> implements CanActivate {
|
|
6
|
+
protected readonly reflector: Reflector;
|
|
7
|
+
protected routeType: RouteType;
|
|
8
|
+
protected entity: Type<Entity>;
|
|
9
|
+
protected abilityPredicate: DynamicApiRouteCaslAbilityPredicate<Entity> | undefined;
|
|
10
|
+
protected constructor(reflector: Reflector);
|
|
11
|
+
canActivate(context: ExecutionContext): boolean;
|
|
12
|
+
private execPolicyHandler;
|
|
13
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BasePoliciesGuard = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const builders_1 = require("../builders");
|
|
6
|
+
const decorators_1 = require("../decorators");
|
|
7
|
+
class BasePoliciesGuard {
|
|
8
|
+
constructor(reflector) {
|
|
9
|
+
this.reflector = reflector;
|
|
10
|
+
}
|
|
11
|
+
canActivate(context) {
|
|
12
|
+
const policyHandlers = this.reflector.get(decorators_1.CHECK_POLICIES_KEY, context.getHandler());
|
|
13
|
+
if (!policyHandlers || !this.abilityPredicate) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
let { user } = context.switchToHttp().getRequest();
|
|
17
|
+
if (!user) {
|
|
18
|
+
throw new common_1.ForbiddenException('Forbidden resource');
|
|
19
|
+
}
|
|
20
|
+
const ability = (0, builders_1.CaslAbilityBuilder)(this.entity, this.routeType, this.abilityPredicate, user);
|
|
21
|
+
return policyHandlers.every((handler) => {
|
|
22
|
+
return this.execPolicyHandler(handler, ability);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
execPolicyHandler(handler, ability) {
|
|
26
|
+
if (typeof handler === 'function') {
|
|
27
|
+
return handler(ability);
|
|
28
|
+
}
|
|
29
|
+
return handler.handle(ability);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.BasePoliciesGuard = BasePoliciesGuard;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { DynamicApiGlobalState } from '../interfaces';
|
|
4
|
+
declare const DynamicApiJwtAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
|
|
5
|
+
export declare class DynamicApiJwtAuthGuard extends DynamicApiJwtAuthGuard_base {
|
|
6
|
+
private reflector;
|
|
7
|
+
private readonly state;
|
|
8
|
+
constructor(reflector: Reflector, state: DynamicApiGlobalState);
|
|
9
|
+
canActivate(context: ExecutionContext): boolean | Promise<boolean> | import("rxjs").Observable<boolean>;
|
|
10
|
+
}
|
|
11
|
+
export {};
|