mongodb-dynamic-api 5.1.0 → 5.2.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.
Files changed (64) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/package.json +1 -1
  3. package/src/helpers/controller-ability-predicates.helper.d.ts +3 -2
  4. package/src/helpers/controller-ability-predicates.helper.js +15 -0
  5. package/src/helpers/controller-ability-predicates.helper.js.map +1 -1
  6. package/src/helpers/mixin-data.helper.d.ts +3 -2
  7. package/src/helpers/mixin-data.helper.js +3 -1
  8. package/src/helpers/mixin-data.helper.js.map +1 -1
  9. package/src/interfaces/dynamic-api-ability.interface.d.ts +1 -0
  10. package/src/interfaces/dynamic-api-route-config.interface.d.ts +2 -1
  11. package/src/interfaces/dynamic-api-route-config.interface.js.map +1 -1
  12. package/src/routes/aggregate/aggregate-controller.mixin.js +2 -2
  13. package/src/routes/aggregate/aggregate-controller.mixin.js.map +1 -1
  14. package/src/routes/aggregate/aggregate-gateway.mixin.js +2 -2
  15. package/src/routes/aggregate/aggregate-gateway.mixin.js.map +1 -1
  16. package/src/routes/create-many/create-many-controller.mixin.js +2 -2
  17. package/src/routes/create-many/create-many-controller.mixin.js.map +1 -1
  18. package/src/routes/create-many/create-many-gateway.mixin.js +2 -2
  19. package/src/routes/create-many/create-many-gateway.mixin.js.map +1 -1
  20. package/src/routes/create-one/create-one-controller.mixin.js +2 -2
  21. package/src/routes/create-one/create-one-controller.mixin.js.map +1 -1
  22. package/src/routes/create-one/create-one-gateway.mixin.js +2 -2
  23. package/src/routes/create-one/create-one-gateway.mixin.js.map +1 -1
  24. package/src/routes/delete-many/delete-many-controller.mixin.js +2 -2
  25. package/src/routes/delete-many/delete-many-controller.mixin.js.map +1 -1
  26. package/src/routes/delete-many/delete-many-gateway.mixin.js +2 -2
  27. package/src/routes/delete-many/delete-many-gateway.mixin.js.map +1 -1
  28. package/src/routes/delete-one/delete-one-controller.mixin.js +2 -2
  29. package/src/routes/delete-one/delete-one-controller.mixin.js.map +1 -1
  30. package/src/routes/delete-one/delete-one-gateway.mixin.js +2 -2
  31. package/src/routes/delete-one/delete-one-gateway.mixin.js.map +1 -1
  32. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js +2 -2
  33. package/src/routes/duplicate-many/duplicate-many-controller.mixin.js.map +1 -1
  34. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js +2 -2
  35. package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js.map +1 -1
  36. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js +2 -2
  37. package/src/routes/duplicate-one/duplicate-one-controller.mixin.js.map +1 -1
  38. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js +2 -2
  39. package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js.map +1 -1
  40. package/src/routes/get-many/get-many-controller.mixin.js +2 -2
  41. package/src/routes/get-many/get-many-controller.mixin.js.map +1 -1
  42. package/src/routes/get-many/get-many-gateway.mixin.js +2 -2
  43. package/src/routes/get-many/get-many-gateway.mixin.js.map +1 -1
  44. package/src/routes/get-one/get-one-controller.mixin.js +2 -2
  45. package/src/routes/get-one/get-one-controller.mixin.js.map +1 -1
  46. package/src/routes/get-one/get-one-gateway.mixin.js +2 -2
  47. package/src/routes/get-one/get-one-gateway.mixin.js.map +1 -1
  48. package/src/routes/replace-one/replace-one-controller.mixin.js +2 -2
  49. package/src/routes/replace-one/replace-one-controller.mixin.js.map +1 -1
  50. package/src/routes/replace-one/replace-one-gateway.mixin.js +2 -2
  51. package/src/routes/replace-one/replace-one-gateway.mixin.js.map +1 -1
  52. package/src/routes/update-many/update-many-controller.mixin.js +2 -2
  53. package/src/routes/update-many/update-many-controller.mixin.js.map +1 -1
  54. package/src/routes/update-many/update-many-gateway.mixin.js +2 -2
  55. package/src/routes/update-many/update-many-gateway.mixin.js.map +1 -1
  56. package/src/routes/update-one/update-one-controller.mixin.js +2 -2
  57. package/src/routes/update-one/update-one-controller.mixin.js.map +1 -1
  58. package/src/routes/update-one/update-one-gateway.mixin.js +2 -2
  59. package/src/routes/update-one/update-one-gateway.mixin.js.map +1 -1
  60. package/src/version.json +1 -1
  61. package/test/for-feature/standard-route-auth-ability-predicate.e2e-spec.d.ts +1 -0
  62. package/test/for-feature/standard-route-auth-ability-predicate.e2e-spec.js +177 -0
  63. package/test/for-feature/standard-route-auth-ability-predicate.e2e-spec.js.map +1 -0
  64. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const vitest_1 = require("vitest");
13
+ const mongoose_1 = require("@nestjs/mongoose");
14
+ const mongoose_2 = require("mongoose");
15
+ const src_1 = require("../../src");
16
+ const e2e_setup_1 = require("../e2e.setup");
17
+ require("dotenv/config");
18
+ const shared_1 = require("../shared");
19
+ (0, vitest_1.describe)('DynamicApiModule forFeature - standard route authAbilityPredicate (e2e)', () => {
20
+ (0, vitest_1.beforeEach)(() => {
21
+ src_1.DynamicApiModule.state['resetState']();
22
+ });
23
+ (0, vitest_1.afterEach)(async () => {
24
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_2.default.connections);
25
+ });
26
+ let StdAuthPredicateUserEntity = class StdAuthPredicateUserEntity extends src_1.BaseEntity {
27
+ };
28
+ __decorate([
29
+ (0, mongoose_1.Prop)({ type: String, required: true }),
30
+ __metadata("design:type", String)
31
+ ], StdAuthPredicateUserEntity.prototype, "email", void 0);
32
+ __decorate([
33
+ (0, mongoose_1.Prop)({ type: String, required: true }),
34
+ __metadata("design:type", String)
35
+ ], StdAuthPredicateUserEntity.prototype, "password", void 0);
36
+ __decorate([
37
+ (0, mongoose_1.Prop)({ type: String, default: 'user' }),
38
+ __metadata("design:type", String)
39
+ ], StdAuthPredicateUserEntity.prototype, "role", void 0);
40
+ StdAuthPredicateUserEntity = __decorate([
41
+ (0, mongoose_1.Schema)({ collection: 'std_auth_predicate_users' })
42
+ ], StdAuthPredicateUserEntity);
43
+ let StdAuthPredicateEntryEntity = class StdAuthPredicateEntryEntity extends src_1.BaseEntity {
44
+ };
45
+ __decorate([
46
+ (0, mongoose_1.Prop)({ type: String, required: true }),
47
+ __metadata("design:type", String)
48
+ ], StdAuthPredicateEntryEntity.prototype, "title", void 0);
49
+ StdAuthPredicateEntryEntity = __decorate([
50
+ (0, mongoose_1.Schema)({ collection: 'std_auth_predicate_entries' })
51
+ ], StdAuthPredicateEntryEntity);
52
+ const registerAndLogin = async (email, role) => {
53
+ await e2e_setup_1.server.post('/auth/register', { email, password: 'password123', role });
54
+ const { body: { accessToken } } = await e2e_setup_1.server.post('/auth/login', { email, password: 'password123' });
55
+ const { body: account } = await e2e_setup_1.server.get('/auth/account', { authToken: accessToken });
56
+ return { accessToken, id: account.id };
57
+ };
58
+ const isAdminRole = (_entity, user) => user.role === 'admin';
59
+ const setupWithRoutes = async (routes) => {
60
+ await (0, shared_1.initApp)({
61
+ entity: StdAuthPredicateEntryEntity,
62
+ controllerOptions: { path: 'std-auth-predicate-entries' },
63
+ routes,
64
+ }, {
65
+ useAuth: {
66
+ userEntity: StdAuthPredicateUserEntity,
67
+ login: { loginField: 'email', passwordField: 'password', additionalFields: ['role'] },
68
+ register: {
69
+ additionalFields: [{ name: 'role', required: false }],
70
+ },
71
+ },
72
+ });
73
+ };
74
+ (0, vitest_1.describe)('abilityPredicate alone on CreateOne — the fail-open bug this option exists to fix', () => {
75
+ (0, vitest_1.beforeEach)(() => setupWithRoutes([
76
+ { type: 'CreateOne', abilityPredicate: isAdminRole },
77
+ { type: 'GetMany' },
78
+ ]));
79
+ (0, vitest_1.it)('demonstrates the fail-open bug: a non-admin creates a document because the collection is empty', async () => {
80
+ const nonAdmin = await registerAndLogin('member@std-auth-predicate.co', 'user');
81
+ const { status } = await e2e_setup_1.server.post('/std-auth-predicate-entries', { title: 'should have been denied' }, { authToken: nonAdmin.accessToken });
82
+ (0, vitest_1.expect)(status).toBe(201);
83
+ });
84
+ });
85
+ (0, vitest_1.describe)('authAbilityPredicate on CreateOne — the fix (route-level)', () => {
86
+ (0, vitest_1.beforeEach)(() => setupWithRoutes([
87
+ { type: 'CreateOne', authAbilityPredicate: (user) => user.role === 'admin' },
88
+ { type: 'GetMany' },
89
+ ]));
90
+ (0, vitest_1.it)('denies a non-admin, regardless of the backing collection being empty', async () => {
91
+ const nonAdmin = await registerAndLogin('member2@std-auth-predicate.co', 'user');
92
+ const { status } = await e2e_setup_1.server.post('/std-auth-predicate-entries', { title: 'should be denied' }, { authToken: nonAdmin.accessToken });
93
+ (0, vitest_1.expect)(status).toBe(403);
94
+ });
95
+ (0, vitest_1.it)('allows an admin', async () => {
96
+ const admin = await registerAndLogin('admin@std-auth-predicate.co', 'admin');
97
+ const { status, body } = await e2e_setup_1.server.post('/std-auth-predicate-entries', { title: 'allowed' }, { authToken: admin.accessToken });
98
+ (0, vitest_1.expect)(status).toBe(201);
99
+ (0, vitest_1.expect)(body.title).toBe('allowed');
100
+ });
101
+ (0, vitest_1.it)('denies an unauthenticated request', async () => {
102
+ const { status } = await e2e_setup_1.server.post('/std-auth-predicate-entries', { title: 'no token' });
103
+ (0, vitest_1.expect)(status).toBe(401);
104
+ });
105
+ });
106
+ (0, vitest_1.describe)('abilityPredicate alone on GetMany — the fail-open bug this option exists to fix', () => {
107
+ (0, vitest_1.beforeEach)(() => setupWithRoutes([
108
+ { type: 'GetMany', abilityPredicate: isAdminRole },
109
+ ]));
110
+ (0, vitest_1.it)('demonstrates the fail-open bug: a non-admin gets 200 because the collection is empty', async () => {
111
+ const nonAdmin = await registerAndLogin('member3@std-auth-predicate.co', 'user');
112
+ const { status } = await e2e_setup_1.server.get('/std-auth-predicate-entries', { authToken: nonAdmin.accessToken });
113
+ (0, vitest_1.expect)(status).toBe(200);
114
+ });
115
+ });
116
+ (0, vitest_1.describe)('authAbilityPredicate on GetMany — the fix (route-level)', () => {
117
+ (0, vitest_1.beforeEach)(() => setupWithRoutes([
118
+ { type: 'GetMany', authAbilityPredicate: (user) => user.role === 'admin' },
119
+ ]));
120
+ (0, vitest_1.it)('denies a non-admin, regardless of the backing collection being empty', async () => {
121
+ const nonAdmin = await registerAndLogin('member4@std-auth-predicate.co', 'user');
122
+ const { status } = await e2e_setup_1.server.get('/std-auth-predicate-entries', { authToken: nonAdmin.accessToken });
123
+ (0, vitest_1.expect)(status).toBe(403);
124
+ });
125
+ (0, vitest_1.it)('allows an admin', async () => {
126
+ const admin = await registerAndLogin('admin2@std-auth-predicate.co', 'admin');
127
+ const { status, body } = await e2e_setup_1.server.get('/std-auth-predicate-entries', { authToken: admin.accessToken });
128
+ (0, vitest_1.expect)(status).toBe(200);
129
+ (0, vitest_1.expect)(body).toEqual([]);
130
+ });
131
+ });
132
+ (0, vitest_1.describe)('authAbilityPredicate via controllerOptions.abilityPredicates — the fix (controller-level shorthand)', () => {
133
+ (0, vitest_1.beforeEach)(async () => {
134
+ await (0, shared_1.initApp)({
135
+ entity: StdAuthPredicateEntryEntity,
136
+ controllerOptions: {
137
+ path: 'std-auth-predicate-entries',
138
+ abilityPredicates: [
139
+ {
140
+ targets: ['CreateOne', 'GetMany'],
141
+ predicate: () => true,
142
+ authAbilityPredicate: (user) => user.role === 'admin',
143
+ },
144
+ ],
145
+ },
146
+ routes: [{ type: 'CreateOne' }, { type: 'GetMany' }],
147
+ }, {
148
+ useAuth: {
149
+ userEntity: StdAuthPredicateUserEntity,
150
+ login: { loginField: 'email', passwordField: 'password', additionalFields: ['role'] },
151
+ register: {
152
+ additionalFields: [{ name: 'role', required: false }],
153
+ },
154
+ },
155
+ });
156
+ });
157
+ (0, vitest_1.it)('denies a non-admin on CreateOne', async () => {
158
+ const nonAdmin = await registerAndLogin('member5@std-auth-predicate.co', 'user');
159
+ const { status } = await e2e_setup_1.server.post('/std-auth-predicate-entries', { title: 'denied' }, { authToken: nonAdmin.accessToken });
160
+ (0, vitest_1.expect)(status).toBe(403);
161
+ });
162
+ (0, vitest_1.it)('denies a non-admin on GetMany', async () => {
163
+ const nonAdmin = await registerAndLogin('member6@std-auth-predicate.co', 'user');
164
+ const { status } = await e2e_setup_1.server.get('/std-auth-predicate-entries', { authToken: nonAdmin.accessToken });
165
+ (0, vitest_1.expect)(status).toBe(403);
166
+ });
167
+ (0, vitest_1.it)('allows an admin on both CreateOne and GetMany', async () => {
168
+ const admin = await registerAndLogin('admin3@std-auth-predicate.co', 'admin');
169
+ const createResponse = await e2e_setup_1.server.post('/std-auth-predicate-entries', { title: 'allowed' }, { authToken: admin.accessToken });
170
+ const getManyResponse = await e2e_setup_1.server.get('/std-auth-predicate-entries', { authToken: admin.accessToken });
171
+ (0, vitest_1.expect)(createResponse.status).toBe(201);
172
+ (0, vitest_1.expect)(getManyResponse.status).toBe(200);
173
+ (0, vitest_1.expect)(getManyResponse.body).toHaveLength(1);
174
+ });
175
+ });
176
+ });
177
+ //# sourceMappingURL=standard-route-auth-ability-predicate.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-route-auth-ability-predicate.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-feature/standard-route-auth-ability-predicate.e2e-spec.ts"],"names":[],"mappings":"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"}