@ptc-org/nestjs-query-graphql 9.2.0 → 9.2.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/package.json +2 -2
- package/src/auth/authorizer.d.ts +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -2
- package/src/index.js.map +1 -1
- package/src/resolvers/relations/aggregate-relations.resolver.js +13 -32
- package/src/resolvers/relations/aggregate-relations.resolver.js.map +1 -1
- package/src/resolvers/relations/read-relations.resolver.js +25 -62
- package/src/resolvers/relations/read-relations.resolver.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ptc-org/nestjs-query-graphql",
|
|
3
|
-
"version": "9.2.
|
|
3
|
+
"version": "9.2.1",
|
|
4
4
|
"description": "Nestjs graphql query adapter",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"graphql",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"lodash.omit": "^4.5.0",
|
|
35
35
|
"pluralize": "^8.0.0",
|
|
36
36
|
"tslib": "^2.8.1",
|
|
37
|
-
"@ptc-org/nestjs-query-core": "9.2.
|
|
37
|
+
"@ptc-org/nestjs-query-core": "9.2.1",
|
|
38
38
|
"lodash.merge": "4.6.2",
|
|
39
39
|
"reflect-metadata": "0.2.2"
|
|
40
40
|
},
|
package/src/auth/authorizer.d.ts
CHANGED
|
@@ -22,5 +22,5 @@ export interface CustomAuthorizer<DTO> {
|
|
|
22
22
|
}
|
|
23
23
|
export interface Authorizer<DTO> extends CustomAuthorizer<DTO> {
|
|
24
24
|
authorize(context: any, authorizerContext: AuthorizationContext): Promise<Filter<DTO>>;
|
|
25
|
-
authorizeRelation
|
|
25
|
+
authorizeRelation(relationName: string, context: any, authorizerContext: AuthorizationContext): Promise<Filter<unknown> | undefined>;
|
|
26
26
|
}
|
package/src/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AuthorizationContext, Authorizer, AuthorizerOptions, CustomAuthorizer,
|
|
1
|
+
export { AuthorizationContext, Authorizer, AuthorizerOptions, CustomAuthorizer, OperationGroup } from './auth';
|
|
2
2
|
export { DTONamesOpts } from './common';
|
|
3
3
|
export { Authorize, AuthorizerFilter, BeforeCreateMany, BeforeCreateOne, BeforeDeleteMany, BeforeDeleteOne, BeforeFindOne, BeforeQueryMany, BeforeUpdateMany, BeforeUpdateOne, CursorConnection, FilterableCursorConnection, FilterableField, FilterableFieldOptions, FilterableOffsetConnection, FilterableRelation, FilterableUnPagedRelation, HookArgs, IDField, IDFieldOptions, InjectAuthorizer, InjectCustomAuthorizer, InjectPubSub, KeySet, MutationHookArgs, ObjectId, OffsetConnection, QueryOptions, Reference, ReferenceDecoratorOpts, ReferenceTypeFunc, Relation, RelationAuthorizerFilter, RelationOneDecoratorOpts, RelationTypeFunc, ResolverMethodOpts, UnPagedRelation } from './decorators';
|
|
4
4
|
export * from './federation';
|
package/src/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pubSubToken = exports.NestjsQueryGraphQLModule = exports.HookInterceptor = exports.AuthorizerInterceptor = exports.HookTypes = exports.UnPagedRelation = exports.RelationAuthorizerFilter = exports.Relation = exports.Reference = exports.QueryOptions = exports.OffsetConnection = exports.ObjectId = exports.MutationHookArgs = exports.KeySet = exports.InjectPubSub = exports.InjectCustomAuthorizer = exports.InjectAuthorizer = exports.IDField = exports.HookArgs = exports.FilterableUnPagedRelation = exports.FilterableRelation = exports.FilterableOffsetConnection = exports.FilterableField = exports.FilterableCursorConnection = exports.CursorConnection = exports.BeforeUpdateOne = exports.BeforeUpdateMany = exports.BeforeQueryMany = exports.BeforeFindOne = exports.BeforeDeleteOne = exports.BeforeDeleteMany = exports.BeforeCreateOne = exports.BeforeCreateMany = exports.AuthorizerFilter = exports.Authorize = exports.OperationGroup =
|
|
3
|
+
exports.pubSubToken = exports.NestjsQueryGraphQLModule = exports.HookInterceptor = exports.AuthorizerInterceptor = exports.HookTypes = exports.UnPagedRelation = exports.RelationAuthorizerFilter = exports.Relation = exports.Reference = exports.QueryOptions = exports.OffsetConnection = exports.ObjectId = exports.MutationHookArgs = exports.KeySet = exports.InjectPubSub = exports.InjectCustomAuthorizer = exports.InjectAuthorizer = exports.IDField = exports.HookArgs = exports.FilterableUnPagedRelation = exports.FilterableRelation = exports.FilterableOffsetConnection = exports.FilterableField = exports.FilterableCursorConnection = exports.CursorConnection = exports.BeforeUpdateOne = exports.BeforeUpdateMany = exports.BeforeQueryMany = exports.BeforeFindOne = exports.BeforeDeleteOne = exports.BeforeDeleteMany = exports.BeforeCreateOne = exports.BeforeCreateMany = exports.AuthorizerFilter = exports.Authorize = exports.OperationGroup = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
var auth_1 = require("./auth");
|
|
6
|
-
Object.defineProperty(exports, "getAuthorizerToken", { enumerable: true, get: function () { return auth_1.getAuthorizerToken; } });
|
|
7
6
|
Object.defineProperty(exports, "OperationGroup", { enumerable: true, get: function () { return auth_1.OperationGroup; } });
|
|
8
7
|
var decorators_1 = require("./decorators");
|
|
9
8
|
Object.defineProperty(exports, "Authorize", { enumerable: true, get: function () { return decorators_1.Authorize; } });
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/query-graphql/src/index.ts"],"names":[],"mappings":";;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/query-graphql/src/index.ts"],"names":[],"mappings":";;;;AAAA,+BAA8G;AAA9B,sGAAA,cAAc,OAAA;AAE9F,2CAsCqB;AArCnB,uGAAA,SAAS,OAAA;AACT,8GAAA,gBAAgB,OAAA;AAChB,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AACf,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AACf,2GAAA,aAAa,OAAA;AACb,6GAAA,eAAe,OAAA;AACf,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AACf,8GAAA,gBAAgB,OAAA;AAChB,wHAAA,0BAA0B,OAAA;AAC1B,6GAAA,eAAe,OAAA;AAEf,wHAAA,0BAA0B,OAAA;AAC1B,gHAAA,kBAAkB,OAAA;AAClB,uHAAA,yBAAyB,OAAA;AACzB,sGAAA,QAAQ,OAAA;AACR,qGAAA,OAAO,OAAA;AAEP,8GAAA,gBAAgB,OAAA;AAChB,oHAAA,sBAAsB,OAAA;AACtB,0GAAA,YAAY,OAAA;AACZ,oGAAA,MAAM,OAAA;AACN,8GAAA,gBAAgB,OAAA;AAChB,sGAAA,QAAQ,OAAA;AACR,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AACZ,uGAAA,SAAS,OAAA;AAGT,sGAAA,QAAQ,OAAA;AACR,sHAAA,wBAAwB,OAAA;AAIxB,6GAAA,eAAe,OAAA;AAEjB,uDAA4B;AAC5B,iCAWgB;AADd,kGAAA,SAAS,OAAA;AAEX,+CAAuG;AAA3E,qHAAA,qBAAqB,OAAA;AAAe,+GAAA,eAAe,OAAA;AAC/E,mCAAmD;AAA1C,kHAAA,wBAAwB,OAAA;AAEjC,sDAA2B;AAC3B,+CAA2D;AAAnC,2GAAA,WAAW,OAAA;AACnC,kDAAuB"}
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AggregateRelationsResolver = exports.AggregateRelationsMixin = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const common_1 = require("@nestjs/common");
|
|
6
5
|
const graphql_1 = require("@nestjs/graphql");
|
|
7
6
|
const nestjs_query_core_1 = require("@ptc-org/nestjs-query-core");
|
|
8
7
|
const auth_1 = require("../../auth");
|
|
9
|
-
const
|
|
8
|
+
const common_1 = require("../../common");
|
|
10
9
|
const decorators_1 = require("../../decorators");
|
|
11
10
|
const inject_dataloader_config_decorator_1 = require("../../decorators/inject-dataloader-config.decorator");
|
|
12
11
|
const interceptors_1 = require("../../interceptors");
|
|
@@ -16,21 +15,19 @@ const helpers_1 = require("../helpers");
|
|
|
16
15
|
const resolver_interface_1 = require("../resolver.interface");
|
|
17
16
|
const helpers_2 = require("./helpers");
|
|
18
17
|
const AggregateRelationMixin = (DTOClass, relation) => (Base) => {
|
|
19
|
-
var _a
|
|
18
|
+
var _a;
|
|
20
19
|
if (!relation.enableAggregate && !relation.aggregate?.enabled) {
|
|
21
20
|
return Base;
|
|
22
21
|
}
|
|
23
22
|
const commonResolverOpts = relation.aggregate || (0, helpers_2.removeRelationOpts)(relation);
|
|
24
23
|
const relationDTO = relation.DTO;
|
|
25
|
-
const dtoName = (0,
|
|
26
|
-
const { baseName, baseNameLower } = (0,
|
|
24
|
+
const dtoName = (0, common_1.getDTONames)(DTOClass).baseName;
|
|
25
|
+
const { baseName, baseNameLower } = (0, common_1.getDTONames)(relationDTO, {
|
|
27
26
|
dtoName: relation.dtoName
|
|
28
27
|
});
|
|
29
28
|
const relationName = relation.relationName ?? baseNameLower;
|
|
30
29
|
const aggregateRelationLoaderName = `aggregate${baseName}For${dtoName}`;
|
|
31
30
|
const aggregateLoader = new loader_1.AggregateRelationsLoader(relationDTO, relationName);
|
|
32
|
-
const authorizerKey = Symbol(`authorizerFor${DTOClass.name}`);
|
|
33
|
-
const relationAuthorizerKey = Symbol(`authorizerFor${relation.dtoName}`);
|
|
34
31
|
let RelationQA = class RelationQA extends (0, types_1.AggregateArgsType)(relationDTO) {
|
|
35
32
|
};
|
|
36
33
|
RelationQA = tslib_1.__decorate([
|
|
@@ -38,36 +35,16 @@ const AggregateRelationMixin = (DTOClass, relation) => (Base) => {
|
|
|
38
35
|
], RelationQA);
|
|
39
36
|
const [AR] = (0, types_1.AggregateResponseType)(relationDTO, { prefix: `${dtoName}${baseName}` });
|
|
40
37
|
let AggregateMixin = class AggregateMixin extends Base {
|
|
41
|
-
async [
|
|
38
|
+
async [_a = `aggregate${baseName}`](dto, q, aggregateQuery, context, relationFilter, dataLoaderConfig) {
|
|
42
39
|
const qa = await (0, helpers_1.transformAndValidate)(RelationQA, q);
|
|
43
40
|
const loader = loader_1.DataLoaderFactory.getOrCreateLoader(context, aggregateRelationLoaderName, () => aggregateLoader.createLoader(this.service), dataLoaderConfig);
|
|
44
|
-
const authContext = {
|
|
45
|
-
operationName: baseNameLower,
|
|
46
|
-
operationGroup: auth_1.OperationGroup.AGGREGATE,
|
|
47
|
-
readonly: true,
|
|
48
|
-
many: true
|
|
49
|
-
};
|
|
50
|
-
const authFilter = relation.auth
|
|
51
|
-
? await relation.auth?.authorize(context, authContext)
|
|
52
|
-
: ((await this[authorizerKey]?.authorizeRelation(baseNameLower, context, authContext)) ??
|
|
53
|
-
(await this[relationAuthorizerKey]?.authorize(context, authContext)));
|
|
54
41
|
return loader.load({
|
|
55
42
|
dto,
|
|
56
|
-
filter: (0, nestjs_query_core_1.mergeFilter)(qa.filter ?? {},
|
|
43
|
+
filter: (0, nestjs_query_core_1.mergeFilter)(qa.filter ?? {}, relationFilter ?? {}),
|
|
57
44
|
aggregate: aggregateQuery
|
|
58
45
|
});
|
|
59
46
|
}
|
|
60
47
|
};
|
|
61
|
-
tslib_1.__decorate([
|
|
62
|
-
(0, common_1.Optional)(),
|
|
63
|
-
(0, common_1.Inject)((0, auth_1.getAuthorizerToken)(DTOClass)),
|
|
64
|
-
tslib_1.__metadata("design:type", Object)
|
|
65
|
-
], AggregateMixin.prototype, _a, void 0);
|
|
66
|
-
tslib_1.__decorate([
|
|
67
|
-
(0, common_1.Optional)(),
|
|
68
|
-
(0, common_1.Inject)((0, auth_1.getAuthorizerToken)(relationDTO)),
|
|
69
|
-
tslib_1.__metadata("design:type", Object)
|
|
70
|
-
], AggregateMixin.prototype, _b, void 0);
|
|
71
48
|
tslib_1.__decorate([
|
|
72
49
|
(0, decorators_1.ResolverField)(`${baseNameLower}Aggregate`, () => [AR], {
|
|
73
50
|
description: relation.aggregate?.description
|
|
@@ -78,11 +55,15 @@ const AggregateRelationMixin = (DTOClass, relation) => (Base) => {
|
|
|
78
55
|
tslib_1.__param(1, (0, graphql_1.Args)()),
|
|
79
56
|
tslib_1.__param(2, (0, decorators_1.AggregateQueryParam)()),
|
|
80
57
|
tslib_1.__param(3, (0, graphql_1.Context)()),
|
|
81
|
-
tslib_1.__param(4, (0,
|
|
58
|
+
tslib_1.__param(4, (0, decorators_1.RelationAuthorizerFilter)(baseNameLower, {
|
|
59
|
+
operationGroup: auth_1.OperationGroup.AGGREGATE,
|
|
60
|
+
many: true
|
|
61
|
+
})),
|
|
62
|
+
tslib_1.__param(5, (0, inject_dataloader_config_decorator_1.InjectDataLoaderConfig)()),
|
|
82
63
|
tslib_1.__metadata("design:type", Function),
|
|
83
|
-
tslib_1.__metadata("design:paramtypes", [Object, RelationQA, Object, Object, Object]),
|
|
64
|
+
tslib_1.__metadata("design:paramtypes", [Object, RelationQA, Object, Object, Object, Object]),
|
|
84
65
|
tslib_1.__metadata("design:returntype", Promise)
|
|
85
|
-
], AggregateMixin.prototype,
|
|
66
|
+
], AggregateMixin.prototype, _a, null);
|
|
86
67
|
AggregateMixin = tslib_1.__decorate([
|
|
87
68
|
(0, graphql_1.Resolver)(() => DTOClass, { isAbstract: true })
|
|
88
69
|
], AggregateMixin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate-relations.resolver.js","sourceRoot":"","sources":["../../../../../../packages/query-graphql/src/resolvers/relations/aggregate-relations.resolver.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"aggregate-relations.resolver.js","sourceRoot":"","sources":["../../../../../../packages/query-graphql/src/resolvers/relations/aggregate-relations.resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ReadRelationsResolver = exports.ReadRelationsMixin = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const common_1 = require("@nestjs/common");
|
|
6
5
|
const graphql_1 = require("@nestjs/graphql");
|
|
7
6
|
const nestjs_query_core_1 = require("@ptc-org/nestjs-query-core");
|
|
8
7
|
const auth_1 = require("../../auth");
|
|
9
|
-
const
|
|
8
|
+
const common_1 = require("../../common");
|
|
10
9
|
const decorators_1 = require("../../decorators");
|
|
11
10
|
const inject_dataloader_config_decorator_1 = require("../../decorators/inject-dataloader-config.decorator");
|
|
12
11
|
const interceptors_1 = require("../../interceptors");
|
|
@@ -16,30 +15,18 @@ const helpers_1 = require("../helpers");
|
|
|
16
15
|
const resolver_interface_1 = require("../resolver.interface");
|
|
17
16
|
const helpers_2 = require("./helpers");
|
|
18
17
|
const ReadOneRelationMixin = (DTOClass, relation) => (Base) => {
|
|
19
|
-
var _a
|
|
18
|
+
var _a;
|
|
20
19
|
if (relation.disableRead) {
|
|
21
20
|
return Base;
|
|
22
21
|
}
|
|
23
22
|
const commonResolverOpts = (0, helpers_2.removeRelationOpts)(relation);
|
|
24
23
|
const relationDTO = relation.DTO;
|
|
25
|
-
const { baseNameLower, baseName } = (0,
|
|
24
|
+
const { baseNameLower, baseName } = (0, common_1.getDTONames)(relationDTO, { dtoName: relation.dtoName });
|
|
26
25
|
const relationName = relation.relationName ?? baseNameLower;
|
|
27
26
|
const loaderName = `load${baseName}For${DTOClass.name}`;
|
|
28
|
-
const authorizerKey = Symbol(`authorizerFor${DTOClass.name}`);
|
|
29
|
-
const relationAuthorizerKey = Symbol(`authorizerFor${relation.dtoName}`);
|
|
30
27
|
const findLoader = new loader_1.FindRelationsLoader(relationDTO, relationName);
|
|
31
28
|
let ReadOneMixin = class ReadOneMixin extends Base {
|
|
32
|
-
async [
|
|
33
|
-
const authContext = {
|
|
34
|
-
operationName: baseNameLower,
|
|
35
|
-
operationGroup: auth_1.OperationGroup.READ,
|
|
36
|
-
readonly: true,
|
|
37
|
-
many: false
|
|
38
|
-
};
|
|
39
|
-
const authFilter = relation.auth
|
|
40
|
-
? await relation.auth?.authorize(context, authContext)
|
|
41
|
-
: ((await this[authorizerKey]?.authorizeRelation(baseNameLower, context, authContext)) ??
|
|
42
|
-
(await this[relationAuthorizerKey]?.authorize(context, authContext)));
|
|
29
|
+
async [_a = `find${baseName}`](dto, context, authFilter, resolveInfo, dataLoaderConfig) {
|
|
43
30
|
return loader_1.DataLoaderFactory.getOrCreateLoader(context, loaderName, () => findLoader.createLoader(this.service, {
|
|
44
31
|
resolveInfo: resolveInfo?.info,
|
|
45
32
|
withDeleted: relation.withDeleted,
|
|
@@ -51,16 +38,6 @@ const ReadOneRelationMixin = (DTOClass, relation) => (Base) => {
|
|
|
51
38
|
});
|
|
52
39
|
}
|
|
53
40
|
};
|
|
54
|
-
tslib_1.__decorate([
|
|
55
|
-
(0, common_1.Optional)(),
|
|
56
|
-
(0, common_1.Inject)((0, auth_1.getAuthorizerToken)(DTOClass)),
|
|
57
|
-
tslib_1.__metadata("design:type", Object)
|
|
58
|
-
], ReadOneMixin.prototype, _a, void 0);
|
|
59
|
-
tslib_1.__decorate([
|
|
60
|
-
(0, common_1.Optional)(),
|
|
61
|
-
(0, common_1.Inject)((0, auth_1.getAuthorizerToken)(relationDTO)),
|
|
62
|
-
tslib_1.__metadata("design:type", Object)
|
|
63
|
-
], ReadOneMixin.prototype, _b, void 0);
|
|
64
41
|
tslib_1.__decorate([
|
|
65
42
|
(0, decorators_1.ResolverField)(baseNameLower, () => relationDTO, {
|
|
66
43
|
nullable: relation.nullable,
|
|
@@ -70,31 +47,33 @@ const ReadOneRelationMixin = (DTOClass, relation) => (Base) => {
|
|
|
70
47
|
}, commonResolverOpts, { interceptors: [(0, interceptors_1.AuthorizerInterceptor)(DTOClass)] }),
|
|
71
48
|
tslib_1.__param(0, (0, graphql_1.Parent)()),
|
|
72
49
|
tslib_1.__param(1, (0, graphql_1.Context)()),
|
|
73
|
-
tslib_1.__param(2, (0, decorators_1.
|
|
74
|
-
|
|
50
|
+
tslib_1.__param(2, (0, decorators_1.RelationAuthorizerFilter)(baseNameLower, {
|
|
51
|
+
operationGroup: auth_1.OperationGroup.READ,
|
|
52
|
+
many: false
|
|
53
|
+
})),
|
|
54
|
+
tslib_1.__param(3, (0, decorators_1.GraphQLResultInfo)(DTOClass)),
|
|
55
|
+
tslib_1.__param(4, (0, inject_dataloader_config_decorator_1.InjectDataLoaderConfig)()),
|
|
75
56
|
tslib_1.__metadata("design:type", Function),
|
|
76
|
-
tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object]),
|
|
57
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object, Object]),
|
|
77
58
|
tslib_1.__metadata("design:returntype", Promise)
|
|
78
|
-
], ReadOneMixin.prototype,
|
|
59
|
+
], ReadOneMixin.prototype, _a, null);
|
|
79
60
|
ReadOneMixin = tslib_1.__decorate([
|
|
80
61
|
(0, graphql_1.Resolver)(() => DTOClass, { isAbstract: true })
|
|
81
62
|
], ReadOneMixin);
|
|
82
63
|
return ReadOneMixin;
|
|
83
64
|
};
|
|
84
65
|
const ReadManyRelationMixin = (DTOClass, relation) => (Base) => {
|
|
85
|
-
var _a
|
|
66
|
+
var _a;
|
|
86
67
|
if (relation.disableRead) {
|
|
87
68
|
return Base;
|
|
88
69
|
}
|
|
89
70
|
const commonResolverOpts = (0, helpers_2.removeRelationOpts)(relation);
|
|
90
71
|
const relationDTO = relation.DTO;
|
|
91
|
-
const dtoName = (0,
|
|
92
|
-
const { baseNameLower, baseName } = (0,
|
|
72
|
+
const dtoName = (0, common_1.getDTONames)(DTOClass).baseName;
|
|
73
|
+
const { baseNameLower, baseName } = (0, common_1.getDTONames)(relationDTO, { dtoName: relation.dtoName });
|
|
93
74
|
const relationName = relation.relationName ?? baseNameLower;
|
|
94
75
|
const relationLoaderName = `load${baseName}For${DTOClass.name}`;
|
|
95
76
|
const countRelationLoaderName = `count${baseName}For${DTOClass.name}`;
|
|
96
|
-
const authorizerKey = Symbol(`authorizerFor${DTOClass.name}`);
|
|
97
|
-
const relationAuthorizerKey = Symbol(`authorizerFor${relation.dtoName}`);
|
|
98
77
|
const queryLoader = new loader_1.QueryRelationsLoader(relationDTO, relationName);
|
|
99
78
|
const countLoader = new loader_1.CountRelationsLoader(relationDTO, relationName);
|
|
100
79
|
const connectionName = `${dtoName}${baseName}Connection`;
|
|
@@ -110,33 +89,13 @@ const ReadManyRelationMixin = (DTOClass, relation) => (Base) => {
|
|
|
110
89
|
// disable keyset pagination for relations otherwise recursive paging will not work
|
|
111
90
|
const { ConnectionType: CT } = RelationQA;
|
|
112
91
|
let ReadManyMixin = class ReadManyMixin extends Base {
|
|
113
|
-
async [
|
|
114
|
-
const authContext = {
|
|
115
|
-
operationName: baseNameLower,
|
|
116
|
-
operationGroup: auth_1.OperationGroup.READ,
|
|
117
|
-
readonly: true,
|
|
118
|
-
many: true
|
|
119
|
-
};
|
|
120
|
-
const authFilter = relation.auth
|
|
121
|
-
? await relation.auth?.authorize(context, authContext)
|
|
122
|
-
: ((await this[authorizerKey]?.authorizeRelation(baseNameLower, context, authContext)) ??
|
|
123
|
-
(await this[relationAuthorizerKey]?.authorize(context, authContext)));
|
|
92
|
+
async [_a = `query${baseName}`](dto, q, context, relationFilter, resolveInfo, dataLoaderConfig) {
|
|
124
93
|
const relationQuery = await (0, helpers_1.transformAndValidate)(RelationQA, q);
|
|
125
94
|
const relationLoader = loader_1.DataLoaderFactory.getOrCreateLoader(context, relationLoaderName, () => queryLoader.createLoader(this.service, { withDeleted: relation.withDeleted }), dataLoaderConfig);
|
|
126
95
|
const relationCountLoader = loader_1.DataLoaderFactory.getOrCreateLoader(context, countRelationLoaderName, () => countLoader.createLoader(this.service, { withDeleted: relation.withDeleted }), dataLoaderConfig);
|
|
127
|
-
return CT.createFromPromise((query) => relationLoader.load({ dto, query }), (0, nestjs_query_core_1.mergeQuery)(relationQuery, { filter:
|
|
96
|
+
return CT.createFromPromise((query) => relationLoader.load({ dto, query }), (0, nestjs_query_core_1.mergeQuery)(relationQuery, { filter: relationFilter, relations: resolveInfo?.relations }), (filter) => relationCountLoader.load({ dto, filter }));
|
|
128
97
|
}
|
|
129
98
|
};
|
|
130
|
-
tslib_1.__decorate([
|
|
131
|
-
(0, common_1.Optional)(),
|
|
132
|
-
(0, common_1.Inject)((0, auth_1.getAuthorizerToken)(DTOClass)),
|
|
133
|
-
tslib_1.__metadata("design:type", Object)
|
|
134
|
-
], ReadManyMixin.prototype, _a, void 0);
|
|
135
|
-
tslib_1.__decorate([
|
|
136
|
-
(0, common_1.Optional)(),
|
|
137
|
-
(0, common_1.Inject)((0, auth_1.getAuthorizerToken)(relationDTO)),
|
|
138
|
-
tslib_1.__metadata("design:type", Object)
|
|
139
|
-
], ReadManyMixin.prototype, _b, void 0);
|
|
140
99
|
tslib_1.__decorate([
|
|
141
100
|
(0, decorators_1.ResolverField)(baseNameLower, () => CT.resolveType, {
|
|
142
101
|
nullable: relation.nullable,
|
|
@@ -147,12 +106,16 @@ const ReadManyRelationMixin = (DTOClass, relation) => (Base) => {
|
|
|
147
106
|
tslib_1.__param(0, (0, graphql_1.Parent)()),
|
|
148
107
|
tslib_1.__param(1, (0, graphql_1.Args)()),
|
|
149
108
|
tslib_1.__param(2, (0, graphql_1.Context)()),
|
|
150
|
-
tslib_1.__param(3, (0, decorators_1.
|
|
151
|
-
|
|
109
|
+
tslib_1.__param(3, (0, decorators_1.RelationAuthorizerFilter)(baseNameLower, {
|
|
110
|
+
operationGroup: auth_1.OperationGroup.READ,
|
|
111
|
+
many: true
|
|
112
|
+
})),
|
|
113
|
+
tslib_1.__param(4, (0, decorators_1.GraphQLResultInfo)(DTOClass)),
|
|
114
|
+
tslib_1.__param(5, (0, inject_dataloader_config_decorator_1.InjectDataLoaderConfig)()),
|
|
152
115
|
tslib_1.__metadata("design:type", Function),
|
|
153
|
-
tslib_1.__metadata("design:paramtypes", [Object, RelationQA, Object, Object, Object]),
|
|
116
|
+
tslib_1.__metadata("design:paramtypes", [Object, RelationQA, Object, Object, Object, Object]),
|
|
154
117
|
tslib_1.__metadata("design:returntype", Promise)
|
|
155
|
-
], ReadManyMixin.prototype,
|
|
118
|
+
], ReadManyMixin.prototype, _a, null);
|
|
156
119
|
ReadManyMixin = tslib_1.__decorate([
|
|
157
120
|
(0, graphql_1.Resolver)(() => DTOClass, { isAbstract: true })
|
|
158
121
|
], ReadManyMixin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-relations.resolver.js","sourceRoot":"","sources":["../../../../../../packages/query-graphql/src/resolvers/relations/read-relations.resolver.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"read-relations.resolver.js","sourceRoot":"","sources":["../../../../../../packages/query-graphql/src/resolvers/relations/read-relations.resolver.ts"],"names":[],"mappings":"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"}
|