@90soft/parse-server-kit 2.8.2 → 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +99 -0
- package/CLAUDE.md +698 -674
- package/README.md +27 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/database/indexes.d.ts.map +1 -1
- package/dist/database/indexes.js +14 -1
- package/dist/database/indexes.js.map +1 -1
- package/dist/decorators/cloudDecorator.d.ts.map +1 -1
- package/dist/decorators/cloudDecorator.js +58 -15
- package/dist/decorators/cloudDecorator.js.map +1 -1
- package/dist/decorators/cloudRegistry.d.ts +13 -0
- package/dist/decorators/cloudRegistry.d.ts.map +1 -1
- package/dist/decorators/cloudRegistry.js +23 -1
- package/dist/decorators/cloudRegistry.js.map +1 -1
- package/dist/decorators/parseDecorators.d.ts +1 -1
- package/dist/decorators/parseDecorators.d.ts.map +1 -1
- package/dist/decorators/parseDecorators.js +131 -4
- package/dist/decorators/parseDecorators.js.map +1 -1
- package/dist/decorators/triggerDecorator.d.ts +14 -0
- package/dist/decorators/triggerDecorator.d.ts.map +1 -1
- package/dist/decorators/triggerDecorator.js +31 -2
- package/dist/decorators/triggerDecorator.js.map +1 -1
- package/dist/decorators/triggerRegistry.d.ts +8 -0
- package/dist/decorators/triggerRegistry.d.ts.map +1 -1
- package/dist/decorators/triggerRegistry.js +18 -0
- package/dist/decorators/triggerRegistry.js.map +1 -1
- package/dist/decorators/types/cloudTypes.d.ts +22 -0
- package/dist/decorators/types/cloudTypes.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +66 -5
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/models/BaseModel.d.ts.map +1 -1
- package/dist/models/BaseModel.js +5 -2
- package/dist/models/BaseModel.js.map +1 -1
- package/dist/swagger/index.d.ts.map +1 -1
- package/dist/swagger/index.js +17 -4
- package/dist/swagger/index.js.map +1 -1
- package/dist/swagger/swaggerRegistry.d.ts +11 -0
- package/dist/swagger/swaggerRegistry.d.ts.map +1 -1
- package/dist/swagger/swaggerRegistry.js +18 -1
- package/dist/swagger/swaggerRegistry.js.map +1 -1
- package/dist/utils/dynamicImport.d.ts.map +1 -1
- package/dist/utils/dynamicImport.js +33 -11
- package/dist/utils/dynamicImport.js.map +1 -1
- package/dist/utils/helper.d.ts +5 -1
- package/dist/utils/helper.d.ts.map +1 -1
- package/dist/utils/helper.js +25 -2
- package/dist/utils/helper.js.map +1 -1
- package/dist/utils/roleCache.d.ts +60 -0
- package/dist/utils/roleCache.d.ts.map +1 -0
- package/dist/utils/roleCache.js +112 -0
- package/dist/utils/roleCache.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -506,6 +506,33 @@ importFiles(join(__dirname, 'cloudCode/models'), {extensions: ['.js', '.ts']});
|
|
|
506
506
|
Point it at one directory or the other, never a tree holding both a compiled and
|
|
507
507
|
a source copy — that registers every class twice.
|
|
508
508
|
|
|
509
|
+
### Role Cache (opt-in)
|
|
510
|
+
|
|
511
|
+
`@CloudFunction({requireRoles})` and `getUserRoles()` each cost a database
|
|
512
|
+
round-trip. Role membership rarely changes, so caching it removes that
|
|
513
|
+
round-trip — at the cost of a revoked role continuing to work until the entry
|
|
514
|
+
expires. That trade is yours to make, so the cache does nothing until you turn
|
|
515
|
+
it on:
|
|
516
|
+
|
|
517
|
+
```ts
|
|
518
|
+
import {configureRoleCache, invalidateRoles} from '@90soft/parse-server-kit';
|
|
519
|
+
|
|
520
|
+
configureRoleCache({ttlMs: 30_000}); // global; omit entirely to stay off
|
|
521
|
+
|
|
522
|
+
// Opt a sensitive endpoint out, whatever the global policy says
|
|
523
|
+
@CloudFunction({requireRoles: [UserRoles.ADMIN], roleCacheMs: 0})
|
|
524
|
+
static async deleteEverything(req) { ... }
|
|
525
|
+
|
|
526
|
+
// Wherever you grant or revoke, drop the entry immediately
|
|
527
|
+
await role.getUsers().remove(user);
|
|
528
|
+
await role.save(null, {useMasterKey: true});
|
|
529
|
+
invalidateRoles(user.id);
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
With `invalidateRoles` wired into your own grant/revoke paths, the TTL only
|
|
533
|
+
covers changes made outside your code (a dashboard edit, a direct database
|
|
534
|
+
write). `configureRoleCache(false)` disables it and clears everything held.
|
|
535
|
+
|
|
509
536
|
### Middleware
|
|
510
537
|
|
|
511
538
|
```ts
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings this library needs but should not assume.
|
|
3
|
+
*
|
|
4
|
+
* These used to be constants, read straight from the environment or hardcoded
|
|
5
|
+
* to one project's conventions — a mount path from `process.env.mountPath`, an
|
|
6
|
+
* admin role called `SuperAdmin`, a pointer class called `IMG`. That works
|
|
7
|
+
* perfectly for the codebase they came from and confuses everyone else, who has
|
|
8
|
+
* different role names, different models, and no reason to know that this
|
|
9
|
+
* particular environment variable is load-bearing.
|
|
10
|
+
*
|
|
11
|
+
* Every default below reproduces the previous behaviour exactly, so an existing
|
|
12
|
+
* project that calls nothing here is unaffected.
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* configureKit({mountPath: '/api', adminRole: 'Owner'});
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Values are resolved when they are *used*, not when this module loads, so
|
|
19
|
+
* `dotenv` (or anything else that populates the environment after import) still
|
|
20
|
+
* works.
|
|
21
|
+
*/
|
|
22
|
+
export interface KitConfig {
|
|
23
|
+
/**
|
|
24
|
+
* Where Parse Server is mounted, e.g. `/parse`.
|
|
25
|
+
*
|
|
26
|
+
* Used to recognise file routes and as the default Swagger server URL.
|
|
27
|
+
* Falls back to `process.env.mountPath` — the variable this library used to
|
|
28
|
+
* read directly — and then to `/parse`, Parse Server's own default.
|
|
29
|
+
*/
|
|
30
|
+
mountPath?: string;
|
|
31
|
+
/**
|
|
32
|
+
* The master key, used by `restrictRoutes` to let privileged callers past
|
|
33
|
+
* the route restrictions.
|
|
34
|
+
*
|
|
35
|
+
* Falls back to `process.env.masterKey` — the variable this library used to
|
|
36
|
+
* read directly. **If neither is set, the master key bypass never fires**,
|
|
37
|
+
* and a caller presenting a perfectly valid master key is still refused.
|
|
38
|
+
* That failure is silent, which is why it is worth setting explicitly.
|
|
39
|
+
*/
|
|
40
|
+
masterKey?: string;
|
|
41
|
+
/**
|
|
42
|
+
* The role allowed to manage the `_Role` class in a generated schema.
|
|
43
|
+
* Default `SuperAdmin`.
|
|
44
|
+
*/
|
|
45
|
+
adminRole?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Pointer target classes that `BaseModel.fromParams()` skips.
|
|
48
|
+
*
|
|
49
|
+
* These are classes whose pointers need handling of their own — an uploaded
|
|
50
|
+
* image that has to be processed before it can be attached, for instance —
|
|
51
|
+
* so blindly building a pointer from request params would be wrong.
|
|
52
|
+
* Default `['IMG', 'File']`.
|
|
53
|
+
*
|
|
54
|
+
* A single model can still override this with a static of the same name.
|
|
55
|
+
*/
|
|
56
|
+
excludedPointerClasses?: string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Set any of the library's settings. Merges with whatever was set before, so it
|
|
60
|
+
* can be called more than once, and can be called at any point before the
|
|
61
|
+
* values are used.
|
|
62
|
+
*/
|
|
63
|
+
export declare function configureKit(config: KitConfig): void;
|
|
64
|
+
/** Everything resolved, in precedence order: explicit → environment → default. */
|
|
65
|
+
export declare function kitConfig(): Required<KitConfig>;
|
|
66
|
+
/** Drop every override and go back to the defaults. Intended for tests. */
|
|
67
|
+
export declare function resetKitConfig(): void;
|
|
68
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAUD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED,kFAAkF;AAClF,wBAAgB,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,CAW/C;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureKit = configureKit;
|
|
4
|
+
exports.kitConfig = kitConfig;
|
|
5
|
+
exports.resetKitConfig = resetKitConfig;
|
|
6
|
+
const DEFAULTS = {
|
|
7
|
+
adminRole: 'SuperAdmin',
|
|
8
|
+
excludedPointerClasses: ['IMG', 'File'],
|
|
9
|
+
mountPath: '/parse',
|
|
10
|
+
};
|
|
11
|
+
let overrides = {};
|
|
12
|
+
/**
|
|
13
|
+
* Set any of the library's settings. Merges with whatever was set before, so it
|
|
14
|
+
* can be called more than once, and can be called at any point before the
|
|
15
|
+
* values are used.
|
|
16
|
+
*/
|
|
17
|
+
function configureKit(config) {
|
|
18
|
+
overrides = { ...overrides, ...config };
|
|
19
|
+
}
|
|
20
|
+
/** Everything resolved, in precedence order: explicit → environment → default. */
|
|
21
|
+
function kitConfig() {
|
|
22
|
+
return {
|
|
23
|
+
mountPath: overrides.mountPath ?? process.env.mountPath ?? DEFAULTS.mountPath,
|
|
24
|
+
// No default: an absent master key must never match, so a misconfigured
|
|
25
|
+
// server fails closed rather than admitting everyone as master.
|
|
26
|
+
masterKey: overrides.masterKey ?? process.env.masterKey ?? '',
|
|
27
|
+
adminRole: overrides.adminRole ?? DEFAULTS.adminRole,
|
|
28
|
+
excludedPointerClasses: overrides.excludedPointerClasses ?? [...DEFAULTS.excludedPointerClasses],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Drop every override and go back to the defaults. Intended for tests. */
|
|
32
|
+
function resetKitConfig() {
|
|
33
|
+
overrides = {};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AA0EA,oCAEC;AAGD,8BAWC;AAGD,wCAEC;AAlCD,MAAM,QAAQ,GAAG;IACf,SAAS,EAAE,YAAY;IACvB,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IACvC,SAAS,EAAE,QAAQ;CACX,CAAC;AAEX,IAAI,SAAS,GAAc,EAAE,CAAC;AAE9B;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAiB;IAC5C,SAAS,GAAG,EAAC,GAAG,SAAS,EAAE,GAAG,MAAM,EAAC,CAAC;AACxC,CAAC;AAED,kFAAkF;AAClF,SAAgB,SAAS;IACvB,OAAO;QACL,SAAS,EACP,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;QACpE,wEAAwE;QACxE,gEAAgE;QAChE,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE;QAC7D,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;QACpD,sBAAsB,EACpB,SAAS,CAAC,sBAAsB,IAAI,CAAC,GAAG,QAAQ,CAAC,sBAAsB,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,SAAgB,cAAc;IAC5B,SAAS,GAAG,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexes.d.ts","sourceRoot":"","sources":["../../src/database/indexes.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAA4B,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAG1F,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,qCAAqC;IACrC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,EAAE,CAmBpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CA0BxD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,cAAc,EAAE,CAoDlD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,mBAAmB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"indexes.d.ts","sourceRoot":"","sources":["../../src/database/indexes.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAA4B,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAG1F,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,qCAAqC;IACrC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,EAAE,CAmBpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CA0BxD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,cAAc,EAAE,CAoDlD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,mBAAmB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA+H9E;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,wBAAkB,CAAC"}
|
package/dist/database/indexes.js
CHANGED
|
@@ -139,7 +139,20 @@ async function applyAllIndexes(parseServerInstance) {
|
|
|
139
139
|
const collection = db.collection(className);
|
|
140
140
|
const [, existingIndexes] = await (0, helper_1.catchError)(collection.indexes());
|
|
141
141
|
if (existingIndexes) {
|
|
142
|
-
const conflictingIndex = existingIndexes.find(
|
|
142
|
+
const conflictingIndex = existingIndexes.find(
|
|
143
|
+
/*
|
|
144
|
+
* Only a SINGLE-FIELD index conflicts. The check used to be
|
|
145
|
+
* `idx.key[field] && !idx.unique`, which matches any non-unique index
|
|
146
|
+
* merely CONTAINING the field — a compound index included. So
|
|
147
|
+
* `unique: true` on `status` alongside a compound index on
|
|
148
|
+
* ['status', 'createdAt'] dropped the compound one on every boot, and
|
|
149
|
+
* an index created outside this library was dropped for good.
|
|
150
|
+
*/
|
|
151
|
+
(idx) => idx.name !== '_id_' &&
|
|
152
|
+
!idx.unique &&
|
|
153
|
+
idx.key &&
|
|
154
|
+
Object.keys(idx.key).length === 1 &&
|
|
155
|
+
idx.key[field] !== undefined);
|
|
143
156
|
if (conflictingIndex) {
|
|
144
157
|
console.log(`[Indexes] Dropping non-unique index: ${conflictingIndex.name}`);
|
|
145
158
|
await (0, helper_1.catchError)(collection.dropIndex(conflictingIndex.name));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexes.js","sourceRoot":"","sources":["../../src/database/indexes.ts"],"names":[],"mappings":";;;AAoCA,4CAmBC;AAKD,gDA0BC;AAUD,0CAoDC;AAMD,
|
|
1
|
+
{"version":3,"file":"indexes.js","sourceRoot":"","sources":["../../src/database/indexes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/cloudDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,WAAW,EAAC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloudDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/cloudDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAOtE,KAAK,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;AAErF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,QAE9D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,IAE7C,QAAQ,GAAG,EACX,aAAa,MAAM,EACnB,aAAa,kBAAkB,GAAG,SAAS,wBA8D9C;AAkED,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,YAlI5D,GAAG,eACE,MAAM,eACN,kBAAkB,GAAG,SAAS,wBAsI9C"}
|
|
@@ -4,6 +4,7 @@ exports.onFunctionRegistered = onFunctionRegistered;
|
|
|
4
4
|
exports.CloudFunction = CloudFunction;
|
|
5
5
|
exports.ProtectedCloudFunction = ProtectedCloudFunction;
|
|
6
6
|
const helper_1 = require("../utils/helper");
|
|
7
|
+
const roleCache_1 = require("../utils/roleCache");
|
|
7
8
|
const cloudRegistry_1 = require("./cloudRegistry");
|
|
8
9
|
const swaggerRegistry_1 = require("../swagger/swaggerRegistry");
|
|
9
10
|
const functionHooks = [];
|
|
@@ -22,6 +23,18 @@ function CloudFunction(config) {
|
|
|
22
23
|
// Wrap with role checking
|
|
23
24
|
descriptor.value = async function (...args) {
|
|
24
25
|
const request = args[0];
|
|
26
|
+
/*
|
|
27
|
+
* `requiresAuth` used to be read by nothing but the Swagger renderer, so
|
|
28
|
+
* an endpoint declaring it was wide open while the docs drew a padlock on
|
|
29
|
+
* it — one character away from `validation.requireUser`, which did work.
|
|
30
|
+
*
|
|
31
|
+
* The master key is the system, so it passes: a cloud function called
|
|
32
|
+
* with the master key has no `request.user` and is not an anonymous
|
|
33
|
+
* caller.
|
|
34
|
+
*/
|
|
35
|
+
if (config.requiresAuth && !request.user && !request.master) {
|
|
36
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Authentication required');
|
|
37
|
+
}
|
|
25
38
|
if (config.requireRoles) {
|
|
26
39
|
await checkUserRoles(request, config);
|
|
27
40
|
}
|
|
@@ -31,6 +44,13 @@ function CloudFunction(config) {
|
|
|
31
44
|
name: propertyKey,
|
|
32
45
|
config,
|
|
33
46
|
handler: descriptor.value,
|
|
47
|
+
// Recorded so the registry can re-read the method when it registers it,
|
|
48
|
+
// rather than keeping this snapshot. Decorators apply bottom-up, so
|
|
49
|
+
// anything written *above* @CloudFunction has not run yet and is not in
|
|
50
|
+
// `descriptor.value` — @Transactional most notably. Re-reading later
|
|
51
|
+
// picks it up and makes the order of the two irrelevant.
|
|
52
|
+
owner: target,
|
|
53
|
+
propertyKey,
|
|
34
54
|
};
|
|
35
55
|
cloudRegistry_1.CloudFunctionRegistry.register(metadata);
|
|
36
56
|
// Register the endpoint for Swagger — mirrors how @ParseField registers
|
|
@@ -43,28 +63,51 @@ function CloudFunction(config) {
|
|
|
43
63
|
return descriptor;
|
|
44
64
|
};
|
|
45
65
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
66
|
+
/**
|
|
67
|
+
* The roles this user holds, as far as this check needs to know.
|
|
68
|
+
*
|
|
69
|
+
* Two shapes, because the cache changes what is worth asking for. Uncached, the
|
|
70
|
+
* query is narrowed to the roles this function actually requires — the cheapest
|
|
71
|
+
* question, and exactly what this has always done. Cached, the full list is
|
|
72
|
+
* fetched instead: it answers every function's question, not just this one, so
|
|
73
|
+
* one round-trip serves the whole request and every later one until it expires.
|
|
74
|
+
*/
|
|
75
|
+
async function resolveRoleNames(user, config) {
|
|
76
|
+
const useCache = (0, roleCache_1.roleCacheEnabled)() && config.roleCacheMs !== 0;
|
|
77
|
+
if (!useCache) {
|
|
78
|
+
const roleQuery = new Parse.Query('_Role');
|
|
79
|
+
roleQuery.containedIn('name', config.requireRoles);
|
|
80
|
+
roleQuery.equalTo('users', user);
|
|
81
|
+
const [error, roles] = await (0, helper_1.catchError)(roleQuery.find({ useMasterKey: true }));
|
|
82
|
+
if (error) {
|
|
83
|
+
throw new Parse.Error(Parse.Error.OTHER_CAUSE, 'Authorization check failed');
|
|
84
|
+
}
|
|
85
|
+
return roles.map(role => role.get('name'));
|
|
50
86
|
}
|
|
51
|
-
|
|
52
|
-
|
|
87
|
+
const cached = (0, roleCache_1.readCachedRoles)(user.id, config.roleCacheMs);
|
|
88
|
+
if (cached)
|
|
89
|
+
return cached;
|
|
53
90
|
const roleQuery = new Parse.Query('_Role');
|
|
54
|
-
roleQuery.containedIn('name', config.requireRoles);
|
|
55
91
|
roleQuery.equalTo('users', user);
|
|
56
|
-
const [error,
|
|
92
|
+
const [error, roles] = await (0, helper_1.catchError)(roleQuery.find({ useMasterKey: true }));
|
|
57
93
|
if (error) {
|
|
58
94
|
throw new Parse.Error(Parse.Error.OTHER_CAUSE, 'Authorization check failed');
|
|
59
95
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
96
|
+
const names = roles.map(role => role.get('name'));
|
|
97
|
+
(0, roleCache_1.writeCachedRoles)(user.id, names, config.roleCacheMs);
|
|
98
|
+
return names;
|
|
99
|
+
}
|
|
100
|
+
async function checkUserRoles(request, config) {
|
|
101
|
+
const user = request.user;
|
|
102
|
+
if (!user) {
|
|
103
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Authentication required');
|
|
67
104
|
}
|
|
105
|
+
if (!config.requireRoles || config.requireRoles.length === 0)
|
|
106
|
+
return;
|
|
107
|
+
const userRoleNames = await resolveRoleNames(user, config);
|
|
108
|
+
const hasPermission = config.requireAllRoles
|
|
109
|
+
? config.requireRoles.every(role => userRoleNames.includes(role))
|
|
110
|
+
: config.requireRoles.some(role => userRoleNames.includes(role));
|
|
68
111
|
if (!hasPermission) {
|
|
69
112
|
const msg = config.customErrorMessage ||
|
|
70
113
|
`Access denied. Required ${config.requireAllRoles ? 'all' : 'one of'} these roles: ${config.requireRoles.join(', ')}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudDecorator.js","sourceRoot":"","sources":["../../src/decorators/cloudDecorator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"cloudDecorator.js","sourceRoot":"","sources":["../../src/decorators/cloudDecorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,19 @@ export declare class CloudFunctionRegistry {
|
|
|
4
4
|
static register(metadata: CloudFunctionMetadata): void;
|
|
5
5
|
static getFunctions(): CloudFunctionMetadata[];
|
|
6
6
|
static getFunction(name: string): CloudFunctionMetadata | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* The method as it stands now, not as it stood when the decorator ran.
|
|
9
|
+
*
|
|
10
|
+
* `@CloudFunction` sees `descriptor.value` at the moment it is applied, and
|
|
11
|
+
* decorators apply bottom-up — so anything written *above* it, such as
|
|
12
|
+
* `@Transactional()`, has not wrapped the method yet. Registering that early
|
|
13
|
+
* snapshot meant the outer decorator was silently dropped: the endpoint
|
|
14
|
+
* worked, every write succeeded, and nothing was ever atomic.
|
|
15
|
+
*
|
|
16
|
+
* Reading the property back at registration time picks up every wrapper,
|
|
17
|
+
* whichever order they were written in.
|
|
18
|
+
*/
|
|
19
|
+
private static resolveHandler;
|
|
7
20
|
static initialize(): void;
|
|
8
21
|
}
|
|
9
22
|
//# sourceMappingURL=cloudRegistry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudRegistry.d.ts","sourceRoot":"","sources":["../../src/decorators/cloudRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAIzD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAiD;IAEzE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB;IAI/C,MAAM,CAAC,YAAY;IAInB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;IAI/B,MAAM,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"cloudRegistry.d.ts","sourceRoot":"","sources":["../../src/decorators/cloudRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAIzD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAiD;IAEzE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB;IAI/C,MAAM,CAAC,YAAY;IAInB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;IAI/B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B,MAAM,CAAC,UAAU;CAelB"}
|
|
@@ -13,9 +13,31 @@ class CloudFunctionRegistry {
|
|
|
13
13
|
static getFunction(name) {
|
|
14
14
|
return this.functions.get(name);
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* The method as it stands now, not as it stood when the decorator ran.
|
|
18
|
+
*
|
|
19
|
+
* `@CloudFunction` sees `descriptor.value` at the moment it is applied, and
|
|
20
|
+
* decorators apply bottom-up — so anything written *above* it, such as
|
|
21
|
+
* `@Transactional()`, has not wrapped the method yet. Registering that early
|
|
22
|
+
* snapshot meant the outer decorator was silently dropped: the endpoint
|
|
23
|
+
* worked, every write succeeded, and nothing was ever atomic.
|
|
24
|
+
*
|
|
25
|
+
* Reading the property back at registration time picks up every wrapper,
|
|
26
|
+
* whichever order they were written in.
|
|
27
|
+
*/
|
|
28
|
+
static resolveHandler(metadata) {
|
|
29
|
+
const { owner, propertyKey } = metadata;
|
|
30
|
+
if (owner && propertyKey) {
|
|
31
|
+
const current = owner[propertyKey];
|
|
32
|
+
if (typeof current === 'function')
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
return metadata.handler;
|
|
36
|
+
}
|
|
16
37
|
static initialize() {
|
|
17
38
|
this.functions.forEach(metadata => {
|
|
18
|
-
|
|
39
|
+
const handler = this.resolveHandler(metadata);
|
|
40
|
+
Parse.Cloud.define(metadata.name, handler, metadata.config.validation);
|
|
19
41
|
console.log(`Registered cloud function: ${metadata.name}`);
|
|
20
42
|
});
|
|
21
43
|
// Build entity-based route map after all functions are registered
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudRegistry.js","sourceRoot":"","sources":["../../src/decorators/cloudRegistry.ts"],"names":[],"mappings":";;;AACA,qDAA+C;AAC/C,iEAA4D;AAE5D,MAAa,qBAAqB;IAGhC,MAAM,CAAC,QAAQ,CAAC,QAA+B;QAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAChC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"cloudRegistry.js","sourceRoot":"","sources":["../../src/decorators/cloudRegistry.ts"],"names":[],"mappings":";;;AACA,qDAA+C;AAC/C,iEAA4D;AAE5D,MAAa,qBAAqB;IAGhC,MAAM,CAAC,QAAQ,CAAC,QAA+B;QAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;OAWG;IACK,MAAM,CAAC,cAAc,CAAC,QAA+B;QAC3D,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,QAAQ,CAAC;QACtC,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;YACnC,IAAI,OAAO,OAAO,KAAK,UAAU;gBAAE,OAAO,OAAO,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,UAAU;QACf,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,kEAAkE;QAClE,8BAAa,CAAC,UAAU,EAAE,CAAC;QAE3B,wEAAwE;QACxE,kEAAkE;QAClE,yDAAyD;QACzD,iCAAe,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;;AAlDH,sDAmDC;AAlDgB,+BAAS,GAAuC,IAAI,GAAG,EAAE,CAAC"}
|
|
@@ -86,7 +86,7 @@ export interface ParseClassOptions {
|
|
|
86
86
|
description?: string;
|
|
87
87
|
compoundIndexes?: CompoundIndex[];
|
|
88
88
|
}
|
|
89
|
-
export declare function ParseClass(className: ClassNameType, options?: ParseClassOptions): (constructor:
|
|
89
|
+
export declare function ParseClass(className: ClassNameType, options?: ParseClassOptions): <T extends Function>(constructor: T) => T;
|
|
90
90
|
export declare function getSchemaDefinition<T>(target: new () => T): {
|
|
91
91
|
compoundIndexes?: CompoundIndex[] | undefined;
|
|
92
92
|
uniqueFields?: string[] | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseDecorators.d.ts","sourceRoot":"","sources":["../../src/decorators/parseDecorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EAErB,aAAa,EAEb,aAAa,EAEd,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"parseDecorators.d.ts","sourceRoot":"","sources":["../../src/decorators/parseDecorators.ts"],"names":[],"mappings":"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"}
|