@flowerforce/flowerbase 1.0.1-beta.9 → 1.0.2
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 +17 -0
- package/LICENSE +1 -1
- package/README.md +466 -7
- package/dist/auth/controller.d.ts.map +1 -1
- package/dist/auth/controller.js +11 -1
- package/dist/auth/providers/local-userpass/controller.d.ts.map +1 -1
- package/dist/auth/providers/local-userpass/controller.js +15 -15
- package/dist/auth/utils.d.ts +2 -1
- package/dist/auth/utils.d.ts.map +1 -1
- package/dist/auth/utils.js +14 -10
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -3
- package/dist/features/endpoints/utils.d.ts +1 -1
- package/dist/features/endpoints/utils.d.ts.map +1 -1
- package/dist/features/endpoints/utils.js +5 -2
- package/dist/features/functions/controller.d.ts.map +1 -1
- package/dist/features/functions/controller.js +12 -8
- package/dist/features/functions/dtos.d.ts +2 -1
- package/dist/features/functions/dtos.d.ts.map +1 -1
- package/dist/features/functions/interface.d.ts +2 -1
- package/dist/features/functions/interface.d.ts.map +1 -1
- package/dist/features/functions/utils.d.ts +1 -1
- package/dist/features/functions/utils.d.ts.map +1 -1
- package/dist/features/functions/utils.js +4 -4
- package/dist/features/triggers/index.d.ts.map +1 -1
- package/dist/features/triggers/index.js +9 -3
- package/dist/features/triggers/interface.d.ts +4 -4
- package/dist/features/triggers/interface.d.ts.map +1 -1
- package/dist/features/triggers/utils.d.ts.map +1 -1
- package/dist/features/triggers/utils.js +25 -14
- package/dist/global.d.ts +9 -0
- package/dist/global.d.ts.map +1 -0
- package/dist/global.js +2 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -9
- package/dist/model.d.ts +1 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +15 -0
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/api/index.js +6 -1
- package/dist/services/aws/index.d.ts.map +1 -1
- package/dist/services/aws/index.js +5 -5
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/mongodb-atlas/index.d.ts.map +1 -1
- package/dist/services/mongodb-atlas/index.js +76 -71
- package/dist/services/mongodb-atlas/model.d.ts +3 -3
- package/dist/services/mongodb-atlas/model.d.ts.map +1 -1
- package/dist/services/mongodb-atlas/utils.d.ts.map +1 -1
- package/dist/state.d.ts +2 -2
- package/dist/state.d.ts.map +1 -1
- package/dist/utils/context/helpers.d.ts +4 -4
- package/dist/utils/context/helpers.d.ts.map +1 -1
- package/dist/utils/context/helpers.js +1 -1
- package/dist/utils/context/index.d.ts.map +1 -1
- package/dist/utils/context/index.js +3 -5
- package/dist/utils/helpers/someAsync.d.ts.map +1 -1
- package/dist/utils/initializer/exposeRoutes.d.ts.map +1 -1
- package/dist/utils/initializer/exposeRoutes.js +44 -1
- package/dist/utils/initializer/registerPlugins.d.ts.map +1 -1
- package/dist/utils/initializer/registerPlugins.js +9 -9
- package/dist/utils/roles/helpers.d.ts.map +1 -1
- package/dist/utils/roles/helpers.js +9 -7
- package/dist/utils/roles/interface.d.ts.map +1 -1
- package/dist/utils/roles/machines/commonValidators.d.ts +2 -2
- package/dist/utils/roles/machines/commonValidators.d.ts.map +1 -1
- package/dist/utils/roles/machines/commonValidators.js +5 -6
- package/dist/utils/roles/machines/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/interface.d.ts.map +1 -1
- package/dist/utils/roles/machines/machine.d.ts +3 -3
- package/dist/utils/roles/machines/machine.d.ts.map +1 -1
- package/dist/utils/roles/machines/machine.js +12 -4
- package/dist/utils/roles/machines/read/A/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/A/index.js +12 -2
- package/dist/utils/roles/machines/read/B/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/B/index.js +20 -5
- package/dist/utils/roles/machines/read/C/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/C/index.js +20 -5
- package/dist/utils/roles/machines/read/D/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/D/index.js +13 -3
- package/dist/utils/roles/machines/read/D/validators.d.ts +1 -1
- package/dist/utils/roles/machines/read/D/validators.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/D/validators.js +8 -4
- package/dist/utils/roles/machines/utils.d.ts +4 -4
- package/dist/utils/roles/machines/utils.d.ts.map +1 -1
- package/dist/utils/roles/machines/utils.js +5 -1
- package/dist/utils/roles/machines/write/A/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/write/A/index.js +13 -3
- package/dist/utils/roles/machines/write/B/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/write/B/index.js +37 -10
- package/dist/utils/roles/machines/write/C/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/write/C/index.js +13 -3
- package/dist/utils/roles/machines/write/C/validators.d.ts +1 -1
- package/dist/utils/roles/machines/write/C/validators.d.ts.map +1 -1
- package/dist/utils/roles/machines/write/C/validators.js +8 -4
- package/dist/utils/rules-matcher/interface.d.ts.map +1 -1
- package/dist/utils/rules-matcher/utils.d.ts.map +1 -1
- package/dist/utils/rules.d.ts.map +1 -1
- package/package.json +9 -2
- package/src/auth/controller.ts +12 -1
- package/src/auth/providers/local-userpass/controller.ts +47 -39
- package/src/auth/providers/local-userpass/dtos.ts +1 -1
- package/src/auth/utils.ts +24 -18
- package/src/constants.ts +7 -3
- package/src/features/endpoints/utils.ts +6 -4
- package/src/features/functions/controller.ts +23 -22
- package/src/features/functions/dtos.ts +9 -9
- package/src/features/functions/interface.ts +2 -1
- package/src/features/functions/utils.ts +12 -12
- package/src/features/triggers/index.ts +9 -6
- package/src/features/triggers/interface.ts +9 -10
- package/src/features/triggers/utils.ts +57 -29
- package/src/global.ts +9 -0
- package/src/index.ts +16 -11
- package/src/model.ts +3 -1
- package/src/services/api/index.ts +6 -1
- package/src/services/aws/index.ts +19 -17
- package/src/services/mongodb-atlas/index.ts +204 -163
- package/src/services/mongodb-atlas/model.ts +13 -13
- package/src/services/mongodb-atlas/utils.ts +6 -4
- package/src/state.ts +32 -20
- package/src/utils/__tests__/STEP_A_STATES.test.ts +78 -47
- package/src/utils/__tests__/STEP_B_STATES.test.ts +168 -105
- package/src/utils/__tests__/STEP_C_STATES.test.ts +150 -78
- package/src/utils/__tests__/STEP_D_STATES.test.ts +129 -86
- package/src/utils/__tests__/checkAdditionalFieldsFn.test.ts +35 -35
- package/src/utils/__tests__/checkApplyWhen.test.ts +40 -41
- package/src/utils/__tests__/checkFieldsPropertyExists.test.ts +40 -40
- package/src/utils/__tests__/checkIsValidFieldNameFn.test.ts +185 -184
- package/src/utils/__tests__/comparePassword.test.ts +27 -30
- package/src/utils/__tests__/evaluateDocumentsFiltersReadFn.test.ts +55 -47
- package/src/utils/__tests__/evaluateDocumentsFiltersWriteFn.test.ts +61 -47
- package/src/utils/__tests__/evaluateTopLevelReadFn.test.ts +48 -48
- package/src/utils/__tests__/evaluateTopLevelWriteFn.test.ts +56 -56
- package/src/utils/__tests__/exposeRoutes.test.ts +46 -44
- package/src/utils/__tests__/generateContextData.test.ts +57 -51
- package/src/utils/__tests__/getDefaultRule.test.ts +32 -27
- package/src/utils/__tests__/getKey.test.ts +10 -10
- package/src/utils/__tests__/getKeys.test.ts +10 -9
- package/src/utils/__tests__/getWinningRole.test.ts +57 -50
- package/src/utils/__tests__/hashPassword.test.ts +24 -25
- package/src/utils/__tests__/isEmpty.test.ts +14 -15
- package/src/utils/__tests__/logMachineInfo.test.ts +12 -12
- package/src/utils/__tests__/operators.test.ts +94 -96
- package/src/utils/__tests__/readFileContent.test.ts +28 -28
- package/src/utils/__tests__/registerPlugins.test.ts +44 -32
- package/src/utils/__tests__/rule.test.ts +47 -49
- package/src/utils/__tests__/rulesMatcherInterfaces.test.ts +57 -52
- package/src/utils/__tests__/rulesMatcherUtils.test.ts +64 -53
- package/src/utils/__tests__/someAsync.test.ts +46 -49
- package/src/utils/context/helpers.ts +1 -1
- package/src/utils/context/index.ts +7 -10
- package/src/utils/crypto/index.ts +2 -2
- package/src/utils/helpers/someAsync.ts +11 -11
- package/src/utils/initializer/exposeRoutes.ts +56 -2
- package/src/utils/initializer/registerPlugins.ts +11 -13
- package/src/utils/roles/helpers.ts +22 -15
- package/src/utils/roles/interface.ts +2 -3
- package/src/utils/roles/machines/commonValidators.ts +23 -14
- package/src/utils/roles/machines/index.ts +7 -4
- package/src/utils/roles/machines/interface.ts +17 -5
- package/src/utils/roles/machines/machine.ts +97 -72
- package/src/utils/roles/machines/read/A/index.ts +12 -4
- package/src/utils/roles/machines/read/B/index.ts +20 -7
- package/src/utils/roles/machines/read/C/index.ts +24 -8
- package/src/utils/roles/machines/read/D/index.ts +14 -8
- package/src/utils/roles/machines/read/D/validators.ts +21 -13
- package/src/utils/roles/machines/read/index.ts +5 -5
- package/src/utils/roles/machines/utils.ts +30 -13
- package/src/utils/roles/machines/write/A/index.ts +13 -5
- package/src/utils/roles/machines/write/B/index.ts +42 -16
- package/src/utils/roles/machines/write/C/index.ts +14 -8
- package/src/utils/roles/machines/write/C/validators.ts +21 -13
- package/src/utils/roles/machines/write/index.ts +4 -4
- package/src/utils/rules-matcher/interface.ts +4 -4
- package/src/utils/rules-matcher/utils.ts +10 -6
- package/src/utils/rules.ts +12 -5
- package/src/global.d.ts +0 -0
|
@@ -43,10 +43,10 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
43
43
|
const winningRole = (0, utils_1.getWinningRole)(result, user, roles);
|
|
44
44
|
const { status, document } = winningRole
|
|
45
45
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
46
|
-
type:
|
|
46
|
+
type: 'read',
|
|
47
47
|
roles,
|
|
48
48
|
cursor: result,
|
|
49
|
-
expansions: {}
|
|
49
|
+
expansions: {}
|
|
50
50
|
}, user)
|
|
51
51
|
: { status: true, document: result };
|
|
52
52
|
// Return validated document or empty object if not permitted
|
|
@@ -78,20 +78,20 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
78
78
|
// Apply access control filters
|
|
79
79
|
const formattedQuery = (0, utils_2.getFormattedQuery)(filters, query, user);
|
|
80
80
|
// Retrieve the document to check permissions before deleting
|
|
81
|
-
const result = yield collection.findOne(formattedQuery);
|
|
81
|
+
const result = yield collection.findOne({ $and: formattedQuery });
|
|
82
82
|
const winningRole = (0, utils_1.getWinningRole)(result, user, roles);
|
|
83
83
|
const { status } = winningRole
|
|
84
84
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
85
|
-
type:
|
|
85
|
+
type: 'delete',
|
|
86
86
|
roles,
|
|
87
87
|
cursor: result,
|
|
88
|
-
expansions: {}
|
|
88
|
+
expansions: {}
|
|
89
89
|
}, user)
|
|
90
90
|
: { status: true };
|
|
91
91
|
if (!status) {
|
|
92
92
|
throw new Error('Delete not permitted');
|
|
93
93
|
}
|
|
94
|
-
return collection.deleteOne(formattedQuery);
|
|
94
|
+
return collection.deleteOne({ $and: formattedQuery });
|
|
95
95
|
}
|
|
96
96
|
// System mode: bypass access control
|
|
97
97
|
return collection.deleteOne(query);
|
|
@@ -121,10 +121,10 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
121
121
|
const winningRole = (0, utils_1.getWinningRole)(data, user, roles);
|
|
122
122
|
const { status, document } = winningRole
|
|
123
123
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
124
|
-
type:
|
|
124
|
+
type: 'insert',
|
|
125
125
|
roles,
|
|
126
126
|
cursor: data,
|
|
127
|
-
expansions: {}
|
|
127
|
+
expansions: {}
|
|
128
128
|
}, user)
|
|
129
129
|
: { status: true, document: data };
|
|
130
130
|
if (!status || !(0, isEqual_1.default)(data, document)) {
|
|
@@ -168,28 +168,31 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
168
168
|
}
|
|
169
169
|
const winningRole = (0, utils_1.getWinningRole)(result, user, roles);
|
|
170
170
|
// Check if the update data contains MongoDB update operators (e.g., $set, $inc)
|
|
171
|
-
const hasOperators = Object.keys(data).some(key => key.startsWith(
|
|
171
|
+
const hasOperators = Object.keys(data).some((key) => key.startsWith('$'));
|
|
172
172
|
// Flatten the update object to extract the actual fields being modified
|
|
173
173
|
// const docToCheck = hasOperators
|
|
174
174
|
// ? Object.values(data).reduce((acc, operation) => ({ ...acc, ...operation }), {})
|
|
175
175
|
// : data
|
|
176
|
+
const [matchQuery] = formattedQuery;
|
|
176
177
|
const pipeline = [
|
|
177
178
|
{
|
|
178
|
-
$match:
|
|
179
|
+
$match: matchQuery
|
|
179
180
|
},
|
|
180
181
|
{
|
|
181
182
|
$limit: 1
|
|
182
183
|
},
|
|
183
|
-
...Object.entries(data).map(([key, value]) => ({ [key]: value }))
|
|
184
|
+
...Object.entries(data).map(([key, value]) => ({ [key]: value }))
|
|
184
185
|
];
|
|
185
|
-
const [docToCheck] = hasOperators
|
|
186
|
+
const [docToCheck] = hasOperators
|
|
187
|
+
? yield collection.aggregate(pipeline).toArray()
|
|
188
|
+
: [data];
|
|
186
189
|
// Validate update permissions
|
|
187
190
|
const { status, document } = winningRole
|
|
188
191
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
189
|
-
type:
|
|
192
|
+
type: 'write',
|
|
190
193
|
roles,
|
|
191
194
|
cursor: docToCheck,
|
|
192
|
-
expansions: {}
|
|
195
|
+
expansions: {}
|
|
193
196
|
}, user)
|
|
194
197
|
: { status: true, document: docToCheck };
|
|
195
198
|
// Ensure no unauthorized changes are made
|
|
@@ -197,27 +200,27 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
197
200
|
if (!status || !areDocumentsEqual) {
|
|
198
201
|
throw new Error('Update not permitted');
|
|
199
202
|
}
|
|
200
|
-
return collection.updateOne(formattedQuery, data, options);
|
|
203
|
+
return collection.updateOne({ $and: formattedQuery }, data, options);
|
|
201
204
|
}
|
|
202
205
|
return collection.updateOne(query, data, options);
|
|
203
206
|
}),
|
|
204
207
|
/**
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
208
|
+
* Finds documents in a MongoDB collection with optional role-based access control and post-query validation.
|
|
209
|
+
*
|
|
210
|
+
* @param {Filter<Document>} query - The MongoDB query to filter documents.
|
|
211
|
+
* @returns {FindCursor} A customized `FindCursor` that includes additional access control logic in its `toArray()` method.
|
|
212
|
+
*
|
|
213
|
+
* @description
|
|
214
|
+
* If `run_as_system` is enabled, the function simply returns a regular MongoDB cursor (`collection.find(query)`).
|
|
215
|
+
* Otherwise:
|
|
216
|
+
* - Combines the user query with role-based filters via `getFormattedQuery`.
|
|
217
|
+
* - Executes the query using `collection.find` with a `$and` of all filters.
|
|
218
|
+
* - Returns a cloned `FindCursor` where `toArray()`:
|
|
219
|
+
* - Applies additional post-query validation using `checkValidation` for each document.
|
|
220
|
+
* - Filters out documents the current user is not authorized to read.
|
|
221
|
+
*
|
|
222
|
+
* This ensures that both pre-query filtering and post-query validation are applied consistently.
|
|
223
|
+
*/
|
|
221
224
|
find: (query) => {
|
|
222
225
|
if (!run_as_system) {
|
|
223
226
|
const { filters, roles } = rules[collName] || {};
|
|
@@ -238,10 +241,10 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
238
241
|
const winningRole = (0, utils_1.getWinningRole)(currentDoc, user, roles);
|
|
239
242
|
const { status, document } = winningRole
|
|
240
243
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
241
|
-
type:
|
|
244
|
+
type: 'read',
|
|
242
245
|
roles,
|
|
243
246
|
cursor: currentDoc,
|
|
244
|
-
expansions: {}
|
|
247
|
+
expansions: {}
|
|
245
248
|
}, user)
|
|
246
249
|
: { status: !roles.length, document: currentDoc };
|
|
247
250
|
return status ? document : undefined;
|
|
@@ -254,34 +257,37 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
254
257
|
return collection.find(query);
|
|
255
258
|
},
|
|
256
259
|
/**
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
260
|
+
* Watches changes on a MongoDB collection with optional role-based filtering of change events.
|
|
261
|
+
*
|
|
262
|
+
* @param {Document[]} [pipeline=[]] - Optional aggregation pipeline stages to apply to the change stream.
|
|
263
|
+
* @param {ChangeStreamOptions} [options] - Optional settings for the change stream, such as `fullDocument`, `resumeAfter`, etc.
|
|
264
|
+
* @returns {ChangeStream} A MongoDB `ChangeStream` instance, optionally enhanced with access control.
|
|
265
|
+
*
|
|
266
|
+
* @description
|
|
267
|
+
* If `run_as_system` is enabled, this function simply returns `collection.watch(pipeline, options)`.
|
|
268
|
+
* Otherwise:
|
|
269
|
+
* - Applies access control filters via `getFormattedQuery`.
|
|
270
|
+
* - Prepends a `$match` stage to the pipeline to limit watched changes to authorized documents.
|
|
271
|
+
* - Overrides the `.on()` method of the returned `ChangeStream` to:
|
|
272
|
+
* - Validate the `fullDocument` and any `updatedFields` using `checkValidation`.
|
|
273
|
+
* - Filter out change events the user is not authorized to see.
|
|
274
|
+
* - Pass only validated and filtered events to the original listener.
|
|
275
|
+
*
|
|
276
|
+
* This allows fine-grained control over what change events a user can observe, based on roles and filters.
|
|
277
|
+
*/
|
|
275
278
|
watch: (pipeline = [], options) => {
|
|
276
279
|
if (!run_as_system) {
|
|
277
280
|
const { filters, roles } = rules[collName] || {};
|
|
278
281
|
// Apply access filters to initial change stream pipeline
|
|
279
282
|
const formattedQuery = (0, utils_2.getFormattedQuery)(filters, {}, user);
|
|
280
|
-
const formattedPipeline = [
|
|
283
|
+
const formattedPipeline = [
|
|
284
|
+
{
|
|
281
285
|
$match: {
|
|
282
286
|
$and: formattedQuery
|
|
283
287
|
}
|
|
284
|
-
},
|
|
288
|
+
},
|
|
289
|
+
...pipeline
|
|
290
|
+
];
|
|
285
291
|
const result = collection.watch(formattedPipeline, options);
|
|
286
292
|
const originalOn = result.on.bind(result);
|
|
287
293
|
/**
|
|
@@ -294,18 +300,18 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
294
300
|
const winningRole = (0, utils_1.getWinningRole)(fullDocument, user, roles);
|
|
295
301
|
const { status, document } = winningRole
|
|
296
302
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
297
|
-
type:
|
|
303
|
+
type: 'read',
|
|
298
304
|
roles,
|
|
299
305
|
cursor: fullDocument,
|
|
300
|
-
expansions: {}
|
|
306
|
+
expansions: {}
|
|
301
307
|
}, user)
|
|
302
308
|
: { status: true, document: fullDocument };
|
|
303
309
|
const { status: updatedFieldsStatus, document: updatedFields } = winningRole
|
|
304
310
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
305
|
-
type:
|
|
311
|
+
type: 'read',
|
|
306
312
|
roles,
|
|
307
313
|
cursor: updateDescription === null || updateDescription === void 0 ? void 0 : updateDescription.updatedFields,
|
|
308
|
-
expansions: {}
|
|
314
|
+
expansions: {}
|
|
309
315
|
}, user)
|
|
310
316
|
: { status: true, document: updateDescription === null || updateDescription === void 0 ? void 0 : updateDescription.updatedFields };
|
|
311
317
|
return { status, document, updatedFieldsStatus, updatedFields };
|
|
@@ -352,10 +358,10 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
352
358
|
const winningRole = (0, utils_1.getWinningRole)(currentDoc, user, roles);
|
|
353
359
|
const { status, document } = winningRole
|
|
354
360
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
355
|
-
type:
|
|
361
|
+
type: 'insert',
|
|
356
362
|
roles,
|
|
357
363
|
cursor: currentDoc,
|
|
358
|
-
expansions: {}
|
|
364
|
+
expansions: {}
|
|
359
365
|
}, user)
|
|
360
366
|
: { status: !roles.length, document: currentDoc };
|
|
361
367
|
return status ? document : undefined;
|
|
@@ -380,26 +386,28 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
380
386
|
throw new Error('Update not permitted');
|
|
381
387
|
}
|
|
382
388
|
// Check if the update data contains MongoDB update operators (e.g., $set, $inc)
|
|
383
|
-
const hasOperators = Object.keys(data).some(key => key.startsWith(
|
|
389
|
+
const hasOperators = Object.keys(data).some((key) => key.startsWith('$'));
|
|
384
390
|
// Flatten the update object to extract the actual fields being modified
|
|
385
391
|
// const docToCheck = hasOperators
|
|
386
392
|
// ? Object.values(data).reduce((acc, operation) => ({ ...acc, ...operation }), {})
|
|
387
393
|
// : data
|
|
388
394
|
const pipeline = [
|
|
389
395
|
{
|
|
390
|
-
$match: formattedQuery
|
|
396
|
+
$match: formattedQuery
|
|
391
397
|
},
|
|
392
|
-
...Object.entries(data).map(([key, value]) => ({ [key]: value }))
|
|
398
|
+
...Object.entries(data).map(([key, value]) => ({ [key]: value }))
|
|
393
399
|
];
|
|
394
|
-
const docsToCheck = hasOperators
|
|
400
|
+
const docsToCheck = hasOperators
|
|
401
|
+
? yield collection.aggregate(pipeline).toArray()
|
|
402
|
+
: result;
|
|
395
403
|
const filteredItems = yield Promise.all(docsToCheck.map((currentDoc) => __awaiter(void 0, void 0, void 0, function* () {
|
|
396
404
|
const winningRole = (0, utils_1.getWinningRole)(currentDoc, user, roles);
|
|
397
405
|
const { status, document } = winningRole
|
|
398
406
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
399
|
-
type:
|
|
407
|
+
type: 'write',
|
|
400
408
|
roles,
|
|
401
409
|
cursor: currentDoc,
|
|
402
|
-
expansions: {}
|
|
410
|
+
expansions: {}
|
|
403
411
|
}, user)
|
|
404
412
|
: { status: !roles.length, document: currentDoc };
|
|
405
413
|
return status ? document : undefined;
|
|
@@ -439,10 +447,10 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
439
447
|
const winningRole = (0, utils_1.getWinningRole)(currentDoc, user, roles);
|
|
440
448
|
const { status, document } = winningRole
|
|
441
449
|
? yield (0, machines_1.checkValidation)(winningRole, {
|
|
442
|
-
type:
|
|
450
|
+
type: 'delete',
|
|
443
451
|
roles,
|
|
444
452
|
cursor: currentDoc,
|
|
445
|
-
expansions: {}
|
|
453
|
+
expansions: {}
|
|
446
454
|
}, user)
|
|
447
455
|
: { status: !roles.length, document: currentDoc };
|
|
448
456
|
return status ? document : undefined;
|
|
@@ -457,10 +465,7 @@ const getOperators = (collection, { rules = {}, collName, user, run_as_system })
|
|
|
457
465
|
}
|
|
458
466
|
// Build final delete query with access control and ID filter
|
|
459
467
|
const deleteQuery = {
|
|
460
|
-
$and: [
|
|
461
|
-
...formattedQuery,
|
|
462
|
-
{ _id: { $in: elementsToDelete } }
|
|
463
|
-
]
|
|
468
|
+
$and: [...formattedQuery, { _id: { $in: elementsToDelete } }]
|
|
464
469
|
};
|
|
465
470
|
return collection.deleteMany(deleteQuery);
|
|
466
471
|
}
|
|
@@ -18,14 +18,14 @@ export type GetValidRuleParams<T extends Role | Filter> = {
|
|
|
18
18
|
record?: WithId<Document> | Document | null;
|
|
19
19
|
};
|
|
20
20
|
type Method<T extends keyof Collection<Document>> = Collection<Document>[T];
|
|
21
|
-
export type GetOperatorsFunction = (collection: Collection<Document>, { rules, collName, user, run_as_system
|
|
21
|
+
export type GetOperatorsFunction = (collection: Collection<Document>, { rules, collName, user, run_as_system }: {
|
|
22
22
|
user?: User;
|
|
23
23
|
rules?: Rules;
|
|
24
24
|
run_as_system?: boolean;
|
|
25
25
|
collName: string;
|
|
26
26
|
}) => {
|
|
27
|
-
findOne: (...params: Parameters<Method<
|
|
28
|
-
deleteOne: (...params: Parameters<Method<
|
|
27
|
+
findOne: (...params: Parameters<Method<'findOne'>>) => ReturnType<Method<'findOne'>>;
|
|
28
|
+
deleteOne: (...params: Parameters<Method<'findOne'>>) => ReturnType<Method<'findOne'>>;
|
|
29
29
|
insertOne: (...params: Parameters<Method<'insertOne'>>) => ReturnType<Method<'insertOne'>>;
|
|
30
30
|
updateOne: (...params: Parameters<Method<'updateOne'>>) => ReturnType<Method<'updateOne'>>;
|
|
31
31
|
find: (...params: Parameters<Method<'find'>>) => FindCursor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAElD,MAAM,MAAM,oBAAoB,GAAG,CACjC,GAAG,EAAE,eAAe,EACpB,EACE,KAAK,EACL,IAAI,EACJ,aAAa,EACd,EAAE;IACD,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,KACE;IACH,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QACtB,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC,oBAAoB,CAAC,CAAA;KACnE,CAAA;CACF,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI;IACxD,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAA;CAC5C,CAAA;AACD,KAAK,MAAM,CAAC,CAAC,SAAS,MAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAE3E,MAAM,MAAM,oBAAoB,GAAG,CACjC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,EAChC,EACE,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,aAAa,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE5C,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,IAAI,GAAG,MAAM,EAAE,2BAInD,kBAAkB,CAAC,CAAC,CAAC,QAoBvB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EAAE,YAAK,EACtB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACrD,OAAO,IAAI,UAQZ,CAAA"}
|
package/dist/state.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare class StateManager {
|
|
2
2
|
private static _state;
|
|
3
|
-
static select<K extends keyof typeof this._state>(key: K): NonNullable<typeof this._state[K]>;
|
|
4
|
-
static setData<K extends keyof typeof this._state>(key: K, value: typeof this._state[K]): void;
|
|
3
|
+
static select<K extends keyof typeof this._state>(key: K): NonNullable<(typeof this._state)[K]>;
|
|
4
|
+
static setData<K extends keyof typeof this._state>(key: K, value: (typeof this._state)[K]): void;
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=state.d.ts.map
|
package/dist/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAgBA,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,MAAM,CAKpB;IACD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,OAAO,IAAI,CAAC,MAAM,EAC9C,GAAG,EAAE,CAAC,GACL,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAIvC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,MAAM,OAAO,IAAI,CAAC,MAAM,EAC/C,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAIjC"}
|
|
@@ -26,10 +26,6 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
26
26
|
};
|
|
27
27
|
services: {
|
|
28
28
|
get: (serviceName: keyof typeof services) => {
|
|
29
|
-
db: (dbName: string) => {
|
|
30
|
-
collection: (collName: string) => ReturnType<import("../../services/mongodb-atlas/model").GetOperatorsFunction>;
|
|
31
|
-
};
|
|
32
|
-
} | {
|
|
33
29
|
get: <T = null>({ url, headers }: import("../../services/api/model").GetParams) => Promise<{
|
|
34
30
|
status: number;
|
|
35
31
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
@@ -64,6 +60,10 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
64
60
|
InvokeAsync: import("aws-sdk").Lambda["invokeAsync"];
|
|
65
61
|
};
|
|
66
62
|
s3: (region: string) => import("aws-sdk").S3;
|
|
63
|
+
} | {
|
|
64
|
+
db: (dbName: string) => {
|
|
65
|
+
collection: (collName: string) => ReturnType<import("../../services/mongodb-atlas/model").GetOperatorsFunction>;
|
|
66
|
+
};
|
|
67
67
|
} | undefined;
|
|
68
68
|
};
|
|
69
69
|
functions: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/context/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,iFAQjC,yBAAyB;;;uBAGT,SAAS;;;;;;;;uBAUX,MAAM;;;+BAGE,MAAM,OAAO,QAAQ
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/context/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,iFAQjC,yBAAyB;;;uBAGT,SAAS;;;;;;;;uBAUX,MAAM;;;+BAGE,MAAM,OAAO,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA1BvC,GAAc;;;;;;;;;;;4BA2CC,MAAM,OAAO,aAAa,WAAW,SAAS;;;CAclE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/context/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/context/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,EACpC,IAAI,EACJ,GAAG,EACH,KAAK,EACL,IAAI,EACJ,eAAe,EACf,aAAa,EACb,QAAQ,EACT,EAAE,qBAAqB,gBA4BvB"}
|
|
@@ -13,11 +13,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.GenerateContext = GenerateContext;
|
|
16
|
-
const
|
|
16
|
+
const node_module_1 = require("node:module");
|
|
17
17
|
const vm_1 = __importDefault(require("vm"));
|
|
18
18
|
const bson_1 = require("bson");
|
|
19
19
|
const helpers_1 = require("./helpers");
|
|
20
|
-
const node_module_1 = require("node:module");
|
|
21
20
|
/**
|
|
22
21
|
* > Used to generate the current context
|
|
23
22
|
* @testable
|
|
@@ -43,10 +42,9 @@ function GenerateContext(_a) {
|
|
|
43
42
|
});
|
|
44
43
|
try {
|
|
45
44
|
const entryFile = (_c = (_b = require.main) === null || _b === void 0 ? void 0 : _b.filename) !== null && _c !== void 0 ? _c : process.cwd();
|
|
46
|
-
console.log("🚀 ~ entryFile:", entryFile);
|
|
47
45
|
const customRequire = (0, node_module_1.createRequire)(entryFile);
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
vm_1.default.runInContext(currentFunction.code, vm_1.default.createContext(Object.assign(Object.assign({}, contextData), { require: customRequire, exports,
|
|
47
|
+
module, __filename: __filename, __dirname: __dirname })));
|
|
50
48
|
}
|
|
51
49
|
catch (e) {
|
|
52
50
|
console.log(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"someAsync.d.ts","sourceRoot":"","sources":["../../../src/utils/helpers/someAsync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"someAsync.d.ts","sourceRoot":"","sources":["../../../src/utils/helpers/someAsync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,KAAK,EAAE,CAAC,EAAE,EACV,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAClE,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exposeRoutes.d.ts","sourceRoot":"","sources":["../../../src/utils/initializer/exposeRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"exposeRoutes.d.ts","sourceRoot":"","sources":["../../../src/utils/initializer/exposeRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAMzC;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,SAAS,eAAe,kBAiE1D,CAAA"}
|
|
@@ -11,7 +11,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.exposeRoutes = void 0;
|
|
13
13
|
const node_process_1 = require("node:process");
|
|
14
|
+
const utils_1 = require("../../auth/utils");
|
|
14
15
|
const constants_1 = require("../../constants");
|
|
16
|
+
const crypto_1 = require("../crypto");
|
|
15
17
|
/**
|
|
16
18
|
* > Used to expose all app routes
|
|
17
19
|
* @param fastify -> the fastify instance
|
|
@@ -24,7 +26,7 @@ const exposeRoutes = (fastify) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
24
26
|
deployment_model: 'LOCAL',
|
|
25
27
|
location: 'IE',
|
|
26
28
|
hostname: `${constants_1.DEFAULT_CONFIG.HTTPS_SCHEMA}://${req.headers.host}`,
|
|
27
|
-
ws_hostname: `${constants_1.DEFAULT_CONFIG.HTTPS_SCHEMA ===
|
|
29
|
+
ws_hostname: `${constants_1.DEFAULT_CONFIG.HTTPS_SCHEMA === 'https' ? 'wss' : 'ws'}://${req.headers.host}`
|
|
28
30
|
});
|
|
29
31
|
}));
|
|
30
32
|
fastify.get('/health', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -33,6 +35,47 @@ const exposeRoutes = (fastify) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
33
35
|
uptime: (0, node_process_1.uptime)()
|
|
34
36
|
});
|
|
35
37
|
}));
|
|
38
|
+
fastify.post(utils_1.AUTH_ENDPOINTS.FIRST_USER, {
|
|
39
|
+
schema: utils_1.REGISTRATION_SCHEMA
|
|
40
|
+
}, function (req, res) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
const { authCollection } = constants_1.AUTH_CONFIG;
|
|
43
|
+
const db = fastify.mongo.client.db(constants_1.DB_NAME);
|
|
44
|
+
const { email, password } = req.body;
|
|
45
|
+
const hashedPassword = yield (0, crypto_1.hashPassword)(password);
|
|
46
|
+
const users = db.collection(authCollection).find();
|
|
47
|
+
const list = yield (users === null || users === void 0 ? void 0 : users.toArray());
|
|
48
|
+
if (list === null || list === void 0 ? void 0 : list.length) {
|
|
49
|
+
res.status(409);
|
|
50
|
+
return {
|
|
51
|
+
error: `The ${authCollection} collection is not empty`
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const result = yield db.collection(authCollection).insertOne({
|
|
55
|
+
email: email,
|
|
56
|
+
password: hashedPassword,
|
|
57
|
+
custom_data: {}
|
|
58
|
+
});
|
|
59
|
+
yield (db === null || db === void 0 ? void 0 : db.collection(authCollection).updateOne({
|
|
60
|
+
email: email
|
|
61
|
+
}, {
|
|
62
|
+
$set: {
|
|
63
|
+
identities: [
|
|
64
|
+
{
|
|
65
|
+
id: result === null || result === void 0 ? void 0 : result.insertedId.toString(),
|
|
66
|
+
provider_id: result === null || result === void 0 ? void 0 : result.insertedId.toString(),
|
|
67
|
+
provider_type: utils_1.PROVIDER_TYPE,
|
|
68
|
+
provider_data: { email }
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
73
|
+
res.status(201);
|
|
74
|
+
return {
|
|
75
|
+
userId: result === null || result === void 0 ? void 0 : result.insertedId
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
});
|
|
36
79
|
}
|
|
37
80
|
catch (e) {
|
|
38
81
|
console.error('Error while exposing routes', e.message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerPlugins.d.ts","sourceRoot":"","sources":["../../../src/utils/initializer/registerPlugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAKzC,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAE9D,KAAK,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;AAGnD,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,SAAS,CAAA;CACzB,CAAA;AAQD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAU,oDAKnC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"registerPlugins.d.ts","sourceRoot":"","sources":["../../../src/utils/initializer/registerPlugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAKzC,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAE9D,KAAK,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;AAGnD,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,SAAS,CAAA;CACzB,CAAA;AAQD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAU,oDAKnC,qBAAqB,kBAoBvB,CAAA"}
|
|
@@ -36,11 +36,11 @@ const registerPlugins = (_a) => __awaiter(void 0, [_a], void 0, function* ({ reg
|
|
|
36
36
|
registersConfig.forEach(({ plugin, options, pluginName }) => {
|
|
37
37
|
try {
|
|
38
38
|
register(plugin, options);
|
|
39
|
-
console.log(
|
|
39
|
+
console.log('registration COMPLETED --->', pluginName);
|
|
40
40
|
}
|
|
41
41
|
catch (e) {
|
|
42
|
-
console.log(
|
|
43
|
-
console.log(
|
|
42
|
+
console.log('Registration FAILED --->', pluginName);
|
|
43
|
+
console.log('Error --->', e);
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -58,15 +58,15 @@ exports.registerPlugins = registerPlugins;
|
|
|
58
58
|
const getRegisterConfig = (_a) => __awaiter(void 0, [_a], void 0, function* ({ mongodbUrl, jwtSecret }) {
|
|
59
59
|
return [
|
|
60
60
|
{
|
|
61
|
-
pluginName:
|
|
61
|
+
pluginName: 'cors',
|
|
62
62
|
plugin: cors_1.default,
|
|
63
63
|
options: {
|
|
64
64
|
origin: '*',
|
|
65
|
-
methods: ['POST', 'GET']
|
|
65
|
+
methods: ['POST', 'GET', 'DELETE']
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
|
-
pluginName:
|
|
69
|
+
pluginName: 'fastifyMongodb',
|
|
70
70
|
plugin: mongodb_1.default,
|
|
71
71
|
options: {
|
|
72
72
|
forceClose: true,
|
|
@@ -74,19 +74,19 @@ const getRegisterConfig = (_a) => __awaiter(void 0, [_a], void 0, function* ({ m
|
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
|
-
pluginName:
|
|
77
|
+
pluginName: 'jwtAuthPlugin',
|
|
78
78
|
plugin: jwt_1.default,
|
|
79
79
|
options: {
|
|
80
80
|
secret: jwtSecret
|
|
81
81
|
}
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
|
-
pluginName:
|
|
84
|
+
pluginName: 'authController',
|
|
85
85
|
plugin: controller_1.authController,
|
|
86
86
|
options: { prefix: `${constants_1.API_VERSION}/auth` }
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
|
-
pluginName:
|
|
89
|
+
pluginName: 'localUserPassController',
|
|
90
90
|
plugin: controller_2.localUserPassController,
|
|
91
91
|
options: {
|
|
92
92
|
prefix: `${constants_1.API_VERSION}/app/:appId/auth/providers/local-userpass`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIrD,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIrD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,cAAc,CAAC,QAAQ,CAAC,EAChC,aAAa,oBAAoB,EACjC,OAAO,cAAc,CAAC,MAAM,CAAC,KAC5B,OAAO,CAAC,OAAO,CAgBjB,CAAA"}
|
|
@@ -18,21 +18,23 @@ const state_1 = require("../../state");
|
|
|
18
18
|
const context_1 = require("../context");
|
|
19
19
|
const rules_1 = require("../rules");
|
|
20
20
|
const utils_1 = __importDefault(require("../rules-matcher/utils"));
|
|
21
|
-
const functionsConditions = [
|
|
21
|
+
const functionsConditions = ['%%true', '%%false'];
|
|
22
22
|
const evaluateExpression = (params, expression, user) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
23
|
if (!expression || typeof expression === 'boolean')
|
|
24
24
|
return !!expression;
|
|
25
|
-
const value = Object.assign(Object.assign(Object.assign({}, params.expansions), params.cursor), {
|
|
25
|
+
const value = Object.assign(Object.assign(Object.assign({}, params.expansions), params.cursor), { '%%user': user, '%%true': true });
|
|
26
26
|
const conditions = (0, rules_1.expandQuery)(expression, value);
|
|
27
27
|
const complexCondition = Object.entries(conditions).find(([key]) => functionsConditions.includes(key));
|
|
28
|
-
return complexCondition
|
|
28
|
+
return complexCondition
|
|
29
|
+
? yield evaluateComplexExpression(complexCondition, params, user)
|
|
30
|
+
: utils_1.default.checkRule(conditions, value, {});
|
|
29
31
|
});
|
|
30
32
|
exports.evaluateExpression = evaluateExpression;
|
|
31
33
|
const evaluateComplexExpression = (condition, params, user) => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
34
|
const [key, config] = condition;
|
|
33
|
-
const { name } = config[
|
|
34
|
-
const functionsList = state_1.StateManager.select(
|
|
35
|
-
const app = state_1.StateManager.select(
|
|
35
|
+
const { name } = config['%function'];
|
|
36
|
+
const functionsList = state_1.StateManager.select('functions');
|
|
37
|
+
const app = state_1.StateManager.select('app');
|
|
36
38
|
const currentFunction = functionsList[name];
|
|
37
39
|
const response = yield (0, context_1.GenerateContext)({
|
|
38
40
|
args: [params.cursor],
|
|
@@ -43,5 +45,5 @@ const evaluateComplexExpression = (condition, params, user) => __awaiter(void 0,
|
|
|
43
45
|
functionsList,
|
|
44
46
|
services: services_1.services
|
|
45
47
|
});
|
|
46
|
-
return key ===
|
|
48
|
+
return key === '%%true' ? response : !response;
|
|
47
49
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAA;AAE1C,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAA;AAE1C,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,oBAAoB,CAAA;IAC3B,KAAK,CAAC,EAAE,oBAAoB,CAAA;CAC7B;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IAEZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,gBAAgB,CAAC,EAAE,0BAA0B,CAAA;IAC7C,IAAI,CAAC,EAAE,oBAAoB,CAAA;IAC3B,KAAK,CAAC,EAAE,oBAAoB,CAAA;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,MAAM,CAAC,EAAE;QACP,CAAC,CAAC,EAAE,MAAM,GAAG,yBAAyB,CAAA;KACvC,CAAA;IACD,iBAAiB,CAAC,EAAE;QAClB,CAAC,CAAC,EAAE,MAAM,GAAG,yBAAyB,CAAA;KACvC,CAAA;CACF;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,IAAI,EAAE,CAAA;IAEb,MAAM,EAAE,GAAG,CAAA;IAEX,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;CACxD;AAGD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA"}
|