mongodb-dynamic-api 1.3.3 → 1.4.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 +13 -0
- package/README.md +410 -1
- 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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
|
|
3
|
+
## [1.4.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v1.3.3...v1.4.0) (2024-03-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### authentication
|
|
7
|
+
|
|
8
|
+
* **authentication:** add register ability predicate ([811b085](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/811b0853ed836ce33a7a56312c3e045b5f73f5ee))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### api
|
|
12
|
+
|
|
13
|
+
* **api:** add authentication ([a692b7b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a692b7b0fcd774dc5152b9f82ed22107c543110a))
|
|
14
|
+
* **api:** add casl ability to control route access ([6202a24](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/6202a247d301a7a72ce47f596a288d66724999f1))
|
|
15
|
+
|
|
3
16
|
## [1.3.3](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v1.3.2...v1.3.3) (2024-03-06)
|
|
4
17
|
|
|
5
18
|
|
package/README.md
CHANGED
|
@@ -67,6 +67,16 @@
|
|
|
67
67
|
npm install --save mongodb-dynamic-api
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
+
___
|
|
71
|
+
|
|
72
|
+
### Table of Contents
|
|
73
|
+
|
|
74
|
+
[Swagger UI](#swagger-ui--optional-but-strongly-recommended)
|
|
75
|
+
<br>[Validation](#validation--optional)
|
|
76
|
+
<br>[Versioning](#versioning--optional)
|
|
77
|
+
<br>[Caching](#caching--enabled-by-default)
|
|
78
|
+
<br>[Authentication](#authentication--optional)
|
|
79
|
+
<br>[Casl](#casl--only-with-authentication)
|
|
70
80
|
|
|
71
81
|
---
|
|
72
82
|
### HOW TO ENJOY IT
|
|
@@ -235,7 +245,7 @@ go to the swagger API path (default to `/dynamic-api`) and you will see the auto
|
|
|
235
245
|
|
|
236
246
|

|
|
237
247
|
|
|
238
|
-
<a href="https://github.com/MikeDev75015/mongodb-dynamic-api/blob/develop/README/swagger.md" target="_blank">See more User API screenshots</a>
|
|
248
|
+
<a href="https://github.com/MikeDev75015/mongodb-dynamic-api/blob/develop/README/swagger-user-api.md" target="_blank">See more User API screenshots</a>
|
|
239
249
|
|
|
240
250
|
___
|
|
241
251
|
### [Validation](https://docs.nestjs.com/techniques/validation#using-the-built-in-validationpipe) (optional)
|
|
@@ -505,6 +515,405 @@ When you request the `/users` route with the `GET` method, the response will be
|
|
|
505
515
|
```
|
|
506
516
|

|
|
507
517
|
|
|
518
|
+
|
|
519
|
+
___
|
|
520
|
+
|
|
521
|
+
### [Authentication](https://docs.nestjs.com/security/authorization#integrating-casl) (optional)
|
|
522
|
+
|
|
523
|
+
An authentication strategy like <a href="https://docs.nestjs.com/security/authentication#jwt-token" target="_blank">JWT</a> is already implemented in the Dynamic API.
|
|
524
|
+
All you have to do is to pass the User object and some options to the `useAuth` property of the `DynamicApiModule.forRoot` method.
|
|
525
|
+
|
|
526
|
+
**Configuration**
|
|
527
|
+
|
|
528
|
+
Ok, let's update our `User` class to add a `password` field.
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
// user.ts
|
|
532
|
+
import { IsEmail } from 'class-validator';
|
|
533
|
+
|
|
534
|
+
@Schema({ collection: 'users' })
|
|
535
|
+
export class User extends BaseEntity {
|
|
536
|
+
@ApiProperty()
|
|
537
|
+
@IsNotEmpty()
|
|
538
|
+
@IsString()
|
|
539
|
+
@Prop({ type: String, required: true })
|
|
540
|
+
email: string;
|
|
541
|
+
|
|
542
|
+
@Exclude()
|
|
543
|
+
@IsNotEmpty()
|
|
544
|
+
@IsString()
|
|
545
|
+
@Prop({ type: String, required: true })
|
|
546
|
+
password: string;
|
|
547
|
+
|
|
548
|
+
@ApiPropertyOptional({ type: Boolean, default: false })
|
|
549
|
+
@IsBoolean()
|
|
550
|
+
@IsOptional()
|
|
551
|
+
@Prop({ type: Boolean, default: false })
|
|
552
|
+
isAdmin: boolean;
|
|
553
|
+
|
|
554
|
+
@ApiPropertyOptional()
|
|
555
|
+
@IsNotEmpty()
|
|
556
|
+
@IsString()
|
|
557
|
+
@IsOptional()
|
|
558
|
+
@Prop({ type: String })
|
|
559
|
+
company?: string;
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
Now, we are going to add the `useAuth` property to the `DynamicApiModule.forRoot` method and pass the `User` object and some options.
|
|
564
|
+
|
|
565
|
+
```typescript
|
|
566
|
+
// app.module.ts
|
|
567
|
+
import { DynamicApiModule } from 'mongodb-dynamic-api';
|
|
568
|
+
import { User } from './users/user';
|
|
569
|
+
import { UsersModule } from './users/users.module';
|
|
570
|
+
|
|
571
|
+
@Module({
|
|
572
|
+
imports: [
|
|
573
|
+
DynamicApiModule.forRoot('...', {
|
|
574
|
+
// ...,
|
|
575
|
+
useAuth: { // <- add this
|
|
576
|
+
user: {
|
|
577
|
+
entity: User, // <- put here the entity which will represent a User of your API
|
|
578
|
+
loginField: 'email',
|
|
579
|
+
passwordField: 'password',
|
|
580
|
+
},
|
|
581
|
+
jwt: {
|
|
582
|
+
secret: 'my-secret', // <- replace by your own JWT secret in production
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
|
+
}),
|
|
586
|
+
UsersModule,
|
|
587
|
+
],
|
|
588
|
+
controllers: [AppController],
|
|
589
|
+
providers: [AppService],
|
|
590
|
+
})
|
|
591
|
+
export class AppModule {}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
By setting the `useAuth` property, the Dynamic API will automatically add the authentication API.
|
|
595
|
+
<br>It will add the `/auth/register`, `/auth/login`, and `/auth/account` routes to the API.
|
|
596
|
+
|
|
597
|
+
By default, only the `/auth/register` and `/auth/login` routes are public.
|
|
598
|
+
All other routes are protected and require a valid `JWT token` to access them.
|
|
599
|
+
|
|
600
|
+
**Swagger Configuration**
|
|
601
|
+
|
|
602
|
+
For Swagger users, you must enable the bearer Auth option by setting the `bearerAuth` property to `true` in the enableDynamicAPISwagger method.
|
|
603
|
+
This will add the Authorize button in the Swagger UI. This button will allow you to pass the `JWT Token` and unlock the protected routes.
|
|
604
|
+
|
|
605
|
+
```typescript
|
|
606
|
+
// main.ts
|
|
607
|
+
import { enableDynamicAPISwagger } from 'mongodb-dynamic-api';
|
|
608
|
+
|
|
609
|
+
async function bootstrap() {
|
|
610
|
+
const app = await NestFactory.create(AppModule);
|
|
611
|
+
// ...
|
|
612
|
+
enableDynamicAPISwagger(app, {
|
|
613
|
+
// ...,
|
|
614
|
+
swaggerExtraConfig: { // <- add this line in your main.ts file
|
|
615
|
+
bearerAuth: true,
|
|
616
|
+
},
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
await app.listen(3000);
|
|
620
|
+
}
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+

|
|
624
|
+
|
|
625
|
+
<a href="https://github.com/MikeDev75015/mongodb-dynamic-api/blob/develop/README/swagger-authentication-api.md" target="_blank">See more Authentication API screenshots</a>
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
**Usage**
|
|
629
|
+
|
|
630
|
+
Ok let's add a new user with the `POST` method on the `/auth/register` route.
|
|
631
|
+
<br>You will receive a valid `JWT token` in the response.
|
|
632
|
+
|
|
633
|
+
```text
|
|
634
|
+
POST /auth/register
|
|
635
|
+
|
|
636
|
+
curl -X 'POST' \
|
|
637
|
+
'<your-host>/auth/register' \
|
|
638
|
+
-H 'accept: application/json' \
|
|
639
|
+
-H 'Content-Type: application/json' \
|
|
640
|
+
-d '{
|
|
641
|
+
"email": "<your-email>",
|
|
642
|
+
"password": "<your-password>" // <- the password will be hashed automatically before saving in the database
|
|
643
|
+
}'
|
|
644
|
+
```
|
|
645
|
+
```json
|
|
646
|
+
# Server response
|
|
647
|
+
{"accessToken":"<your-jwt-token>"}
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
If you go to `/auth/login` and request the route with the `POST` method passing the `email` and `password` fields in the body.
|
|
651
|
+
<br>You will also receive a valid `JWT token` in the response.
|
|
652
|
+
|
|
653
|
+
```text
|
|
654
|
+
POST /auth/login
|
|
655
|
+
|
|
656
|
+
curl -X 'POST' \
|
|
657
|
+
'<your-host>/auth/login' \
|
|
658
|
+
-H 'accept: application/json' \
|
|
659
|
+
-H 'Content-Type: application/json' \
|
|
660
|
+
-d '{
|
|
661
|
+
"email": "<your-email>",
|
|
662
|
+
"password": "<your-password>"
|
|
663
|
+
}'
|
|
664
|
+
```
|
|
665
|
+
```json
|
|
666
|
+
# Server response
|
|
667
|
+
{"accessToken":"<your-jwt-token>"}
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
Now let's request the `/auth/account` protected route with the `GET` method and pass our valid JWT token in the `Authorization` header.
|
|
671
|
+
|
|
672
|
+
```text
|
|
673
|
+
GET /auth/account
|
|
674
|
+
|
|
675
|
+
curl -X 'GET' \
|
|
676
|
+
'<your-host>/auth/account' \
|
|
677
|
+
-H 'accept: application/json' \
|
|
678
|
+
-H 'Authorization: Bearer <your-jwt-token>'
|
|
679
|
+
```
|
|
680
|
+
```json
|
|
681
|
+
# Server response
|
|
682
|
+
{"id":"65edc717c1ec...","email":"<your-email>"}
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
Great, now you have a fully functional authentication API.
|
|
686
|
+
|
|
687
|
+
All other routes are protected and require a valid JWT token to be accessed. You can easily make it public by adding the `isPublic` property to the `controllerOptions` object or to the `route` object in the `DynamicApiModule.forFeature` method.
|
|
688
|
+
|
|
689
|
+
```typescript
|
|
690
|
+
// users.module.ts
|
|
691
|
+
import { DynamicApiModule } from 'mongodb-dynamic-api';
|
|
692
|
+
import { User } from './user';
|
|
693
|
+
|
|
694
|
+
@Module({
|
|
695
|
+
imports: [
|
|
696
|
+
DynamicApiModule.forFeature({
|
|
697
|
+
entity: User,
|
|
698
|
+
controllerOptions: {
|
|
699
|
+
path: 'users',
|
|
700
|
+
isPublic: true, // <- add this to make all user API routes public
|
|
701
|
+
},
|
|
702
|
+
// ...
|
|
703
|
+
}),
|
|
704
|
+
],
|
|
705
|
+
})
|
|
706
|
+
export class UsersModule {}
|
|
707
|
+
```
|
|
708
|
+
```typescript
|
|
709
|
+
// users.module.ts
|
|
710
|
+
import { DynamicApiModule } from 'mongodb-dynamic-api';
|
|
711
|
+
import { User } from './user';
|
|
712
|
+
|
|
713
|
+
@Module({
|
|
714
|
+
imports: [
|
|
715
|
+
DynamicApiModule.forFeature({
|
|
716
|
+
entity: User,
|
|
717
|
+
controllerOptions: {
|
|
718
|
+
path: 'users',
|
|
719
|
+
},
|
|
720
|
+
routes: [
|
|
721
|
+
{ type: 'GetMany' }, // <- protected route
|
|
722
|
+
{ type: 'GetOne', isPublic: true }, // <- public route
|
|
723
|
+
{ type: 'UpdateOne' }, // <- protected route
|
|
724
|
+
{ type: 'DeleteOne' }, // <- protected route
|
|
725
|
+
],
|
|
726
|
+
}),
|
|
727
|
+
],
|
|
728
|
+
})
|
|
729
|
+
export class UsersModule {}
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
___
|
|
733
|
+
|
|
734
|
+
### [Casl](https://docs.nestjs.com/security/authorization#integrating-casl) (only with authentication)
|
|
735
|
+
|
|
736
|
+
Casl will allow you to condition the actions of your users for each protected route of your APIs.
|
|
737
|
+
<br>Authentication is required, you need to enable it or implement your own strategy that adds the User object in the request.
|
|
738
|
+
|
|
739
|
+
**MongoDB dynamic API** uses the `User` object in the requests to apply the ability predicates defined in the `DynamicApiModule.forFeature`.
|
|
740
|
+
<br>You can define them either **in the controller options**,
|
|
741
|
+
or **in each route object** declared in the routes property.
|
|
742
|
+
<br>*If the ability predicates are specified in 2, those defined in the route will have priority.*
|
|
743
|
+
|
|
744
|
+
**An ability predicate is an arrow function that takes a subject and the User object (optional) as arguments and returns a boolean.**
|
|
745
|
+
|
|
746
|
+
Let's create a new Article content and set the ability predicates to the `UpdateOne`, `DeleteOne` and `DeleteMany` routes.
|
|
747
|
+
|
|
748
|
+
**Configuration**
|
|
749
|
+
|
|
750
|
+
```typescript
|
|
751
|
+
// article.ts
|
|
752
|
+
import { Prop } from '@nestjs/mongoose';
|
|
753
|
+
import { ApiProperty } from '@nestjs/swagger';
|
|
754
|
+
import { BaseEntity } from 'mongodb-dynamic-api';
|
|
755
|
+
|
|
756
|
+
export class Article extends BaseEntity {
|
|
757
|
+
@ApiProperty({ type: Boolean, default: false })
|
|
758
|
+
@Prop({ type: Boolean, default: false })
|
|
759
|
+
isPublished: boolean;
|
|
760
|
+
|
|
761
|
+
@ApiProperty()
|
|
762
|
+
@Prop({ type: String })
|
|
763
|
+
authorId: string;
|
|
764
|
+
}
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
```typescript
|
|
768
|
+
// articles.module.ts
|
|
769
|
+
import { Module } from '@nestjs/common';
|
|
770
|
+
import { DynamicApiModule } from 'mongodb-dynamic-api';
|
|
771
|
+
import { User } from '../users/user';
|
|
772
|
+
import { Article } from './article';
|
|
773
|
+
|
|
774
|
+
@Module({
|
|
775
|
+
imports: [
|
|
776
|
+
DynamicApiModule.forFeature({
|
|
777
|
+
entity: Article,
|
|
778
|
+
controllerOptions: {
|
|
779
|
+
path: 'articles',
|
|
780
|
+
abilityPredicates: [ // <- declare the ability predicates in the controller options
|
|
781
|
+
{
|
|
782
|
+
targets: ['DeleteMany', 'DeleteOne'], // <- declare the targets
|
|
783
|
+
predicate: (_: Article, user: User) => user.isAdmin, // <- add the condition
|
|
784
|
+
},
|
|
785
|
+
],
|
|
786
|
+
},
|
|
787
|
+
routes: [
|
|
788
|
+
{ type: 'GetMany', isPublic: true },
|
|
789
|
+
{ type: 'GetOne', isPublic: true },
|
|
790
|
+
{ type: 'CreateOne' },
|
|
791
|
+
{
|
|
792
|
+
type: 'UpdateOne',
|
|
793
|
+
abilityPredicate: (article: Article, user: User) => // <- declare the ability predicate in the route object
|
|
794
|
+
article.authorId === user.id && !article.isPublished,
|
|
795
|
+
},
|
|
796
|
+
],
|
|
797
|
+
}),
|
|
798
|
+
],
|
|
799
|
+
})
|
|
800
|
+
export class ArticlesModule {}
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
```typescript
|
|
804
|
+
// app.module.ts
|
|
805
|
+
import { Module } from '@nestjs/common';
|
|
806
|
+
import { DynamicApiModule } from 'mongodb-dynamic-api';
|
|
807
|
+
import { AppController } from './app.controller';
|
|
808
|
+
import { AppService } from './app.service';
|
|
809
|
+
import { User } from './users/user';
|
|
810
|
+
import { ArticlesModule } from './articles/articles.module';
|
|
811
|
+
|
|
812
|
+
@Module({
|
|
813
|
+
imports: [
|
|
814
|
+
DynamicApiModule.forRoot(
|
|
815
|
+
'your-mongodb-uri',
|
|
816
|
+
{
|
|
817
|
+
useAuth: {
|
|
818
|
+
user: {
|
|
819
|
+
entity: User,
|
|
820
|
+
additionalFields: {
|
|
821
|
+
toRegister: ['isAdmin'], // <- here you can set additional fields to display in the register body
|
|
822
|
+
toRequest: ['isAdmin', 'company'], // <- here you can set additional fields to the User object in the request
|
|
823
|
+
},
|
|
824
|
+
},
|
|
825
|
+
},
|
|
826
|
+
},
|
|
827
|
+
),
|
|
828
|
+
ArticlesModule,
|
|
829
|
+
],
|
|
830
|
+
controllers: [AppController],
|
|
831
|
+
providers: [AppService],
|
|
832
|
+
})
|
|
833
|
+
export class AppModule {}
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
**Usage**
|
|
838
|
+
|
|
839
|
+
First, let's create an admin user with the `POST` method on the `/auth/register` public route.
|
|
840
|
+
```text
|
|
841
|
+
POST /auth/register
|
|
842
|
+
|
|
843
|
+
curl -X 'POST' \
|
|
844
|
+
'<your-host>/auth/register' \
|
|
845
|
+
-H 'accept: application/json' \
|
|
846
|
+
-H 'Content-Type: application/json' \
|
|
847
|
+
-d '{
|
|
848
|
+
"email": "admin@test.co",
|
|
849
|
+
"isAdmin": true,
|
|
850
|
+
"password": "admin"
|
|
851
|
+
}'
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
Then, we are going to protect the `/auth/register` route by setting the `protectRegister` property to `true` and add a **register ability predicate** in the useAuth Object of the `DynamicApiModule.forRoot` method.
|
|
855
|
+
```typescript
|
|
856
|
+
// app.module.ts
|
|
857
|
+
@Module({
|
|
858
|
+
imports: [
|
|
859
|
+
DynamicApiModule.forRoot(
|
|
860
|
+
'your-mongodb-uri',
|
|
861
|
+
{
|
|
862
|
+
useAuth: {
|
|
863
|
+
// ...,
|
|
864
|
+
protectRegister: true, // <- add this line
|
|
865
|
+
registerAbilityPredicate: (user: User) => user.isAdmin,
|
|
866
|
+
},
|
|
867
|
+
},
|
|
868
|
+
),
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
Ok, now let's create a non admin user with the `POST` method on the `/auth/register` route.
|
|
872
|
+
```text
|
|
873
|
+
POST /auth/register
|
|
874
|
+
|
|
875
|
+
curl -X 'POST' \
|
|
876
|
+
'<your-host>/auth/register' \
|
|
877
|
+
-H 'accept: application/json' \
|
|
878
|
+
-H 'Content-Type: application/json' \
|
|
879
|
+
-d '{
|
|
880
|
+
"email": "toto@test.co",
|
|
881
|
+
"password": "toto"
|
|
882
|
+
}'
|
|
883
|
+
```
|
|
884
|
+
```json
|
|
885
|
+
# Server response
|
|
886
|
+
{"accessToken":"<toto-jwt-token>"}
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
Next, under toto's account (not admin), we will try to register a new user with the `POST` method on the `/auth/register` route.
|
|
890
|
+
<br>The register ability predicate will return `false` and we will receive a `403 Forbidden` error.
|
|
891
|
+
|
|
892
|
+
```text
|
|
893
|
+
POST /auth/register
|
|
894
|
+
|
|
895
|
+
curl -X 'POST' \
|
|
896
|
+
'http://localhost:5000/auth/register' \
|
|
897
|
+
-H 'accept: application/json' \
|
|
898
|
+
-H 'Authorization: Bearer <toto-jwt-token>' \
|
|
899
|
+
-H 'Content-Type: application/json' \
|
|
900
|
+
-d '{
|
|
901
|
+
"email": "bill@test.co",
|
|
902
|
+
"password": "bill"
|
|
903
|
+
}'
|
|
904
|
+
```
|
|
905
|
+
```json
|
|
906
|
+
# Server response
|
|
907
|
+
{
|
|
908
|
+
"message": "Forbidden resource",
|
|
909
|
+
"error": "Forbidden",
|
|
910
|
+
"statusCode": 403
|
|
911
|
+
}
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
The register route is now well protected and only an admin user can create new users.
|
|
915
|
+
|
|
916
|
+
|
|
508
917
|
___
|
|
509
918
|
|
|
510
919
|
More coming soon...
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mongodb-dynamic-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
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 };
|