Skip to content
This repository was archived by the owner on Apr 24, 2025. It is now read-only.

Commit 085e0ff

Browse files
authored
Merge pull request #36 from Rezonate-io/fix-relation-auth
fix a bug where a relation has no auth providers
2 parents 74058d2 + 7ee8976 commit 085e0ff

File tree

10 files changed

+44
-33
lines changed

10 files changed

+44
-33
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121

2222
- name: Cache node modules
2323
id: cache
24-
uses: actions/cache@v2
24+
uses: actions/cache@v4
2525
with:
2626
path: |
2727
**/node_modules

copy.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
const prompts = require('prompts');
2-
const { rmSync, renameSync } = require('node:fs')
3-
const path = require('path');
1+
import prompts from 'prompts';
2+
import { rmSync, renameSync } from 'node:fs';
3+
import path from 'path';
44

55

6-
const projects = ['nestjs-query-core', 'nestjs-query-typeorm', 'nestjs-query-graphql', ]
6+
const projects = ['core', 'query-typeorm', 'query-graphql', ];
7+
const targets = ['nestjs-query-core', 'nestjs-query-typeorm', 'nestjs-query-graphql', ]
78

89
async function run() {
910
const { dir } = await prompts({
@@ -12,9 +13,9 @@ async function run() {
1213
message: 'target folder?',
1314
});
1415

15-
projects.forEach(p => {
16+
projects.forEach((p, i) => {
1617
const oldPath = path.resolve('dist/packages', p, 'src');
17-
const newPath = path.resolve(dir, 'node_modules/@rezonate', p,);
18+
const newPath = path.resolve(dir, 'node_modules/@rezonate', targets[i],);
1819
const newPathSrc = path.resolve(newPath, 'src');
1920
rmSync(newPathSrc, {recursive: true, force: true})
2021
renameSync(oldPath, newPathSrc);

packages/core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@rezonate/nestjs-query-core",
3-
"version": "6.0.9",
3+
"version": "6.0.10",
44
"description": "Base query package",
55
"author": "doug-martin <doug@dougamartin.com>",
66
"homepage": "https://github.com/Rezonate-io/nestjs-query#readme",

packages/query-graphql/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@rezonate/nestjs-query-graphql",
3-
"version": "6.0.9",
3+
"version": "6.0.10",
44
"description": "Nestjs graphql query adapter",
55
"author": "doug-martin <doug@dougamartin.com>",
66
"homepage": "https://github.com/Rezonate-io/nestjs-query#readme",

packages/query-graphql/src/auth/default-crud.authorizer.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Inject, Injectable, Optional } from '@nestjs/common';
22
import { ModuleRef } from '@nestjs/core';
33
import { Class, Filter } from '@rezonate/nestjs-query-core';
44

5-
import { getAuthorizer, getRelations } from '../decorators';
5+
import { getAuthorizer, getHasAuthorizerProvider, getRelations } from '../decorators';
66
import { ResolverRelation } from '../resolvers/relations';
77
import { AuthorizationContext, Authorizer, CustomAuthorizer } from './authorizer';
88
import { getAuthorizerToken, getCustomAuthorizerToken } from './tokens';
@@ -75,7 +75,7 @@ export function createDefaultAuthorizer<DTO>(
7575
if (!relation) return;
7676
if (relation.auth) {
7777
this.relationsAuthorizers.set(relationName, createRelationAuthorizer(relation.auth));
78-
} else if (getAuthorizer(relation.DTO)) {
78+
} else if (getAuthorizer(relation.DTO) && getHasAuthorizerProvider(relation.DTO)) {
7979
this.relationsAuthorizers.set(relationName, this.moduleRef.get(getAuthorizerToken(relation.DTO), { strict: false }));
8080
}
8181
}

packages/query-graphql/src/decorators/authorizer.decorator.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { Class, MetaValue, ValueReflector } from '@rezonate/nestjs-query-core';
22

33
import { Authorizer, AuthorizerOptions, createDefaultAuthorizer, CustomAuthorizer } from '../auth';
4-
import { AUTHORIZER_KEY, CUSTOM_AUTHORIZER_KEY } from './constants';
4+
import { AUTHORIZER_KEY, AUTHORIZER_PROVIDER_KEY, CUSTOM_AUTHORIZER_KEY } from './constants';
55

66
const reflector = new ValueReflector(AUTHORIZER_KEY);
7+
const authorizerProviderReflector = new ValueReflector(AUTHORIZER_PROVIDER_KEY);
78
const customAuthorizerReflector = new ValueReflector(CUSTOM_AUTHORIZER_KEY);
89

910
export function Authorize<DTO>(
@@ -22,3 +23,7 @@ export function Authorize<DTO>(
2223
export const getAuthorizer = <DTO>(DTOClass: Class<DTO>): MetaValue<Class<Authorizer<DTO>>> => reflector.get(DTOClass);
2324
export const getCustomAuthorizer = <DTO>(DTOClass: Class<DTO>): MetaValue<Class<CustomAuthorizer<DTO>>> =>
2425
customAuthorizerReflector.get(DTOClass);
26+
27+
export const setHasAuthorizerProvider = <DTO>(DTOClass: Class<DTO>): void => authorizerProviderReflector.set(DTOClass, true);
28+
29+
export const getHasAuthorizerProvider = <DTO>(DTOClass: Class<DTO>): MetaValue<boolean> => authorizerProviderReflector.get(DTOClass);

packages/query-graphql/src/decorators/constants.ts

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export const RELATION_KEY = 'nestjs-query:relation';
44
export const REFERENCE_KEY = 'nestjs-query:reference';
55

66
export const AUTHORIZER_KEY = 'nestjs-query:authorizer';
7+
export const AUTHORIZER_PROVIDER_KEY = 'nestjs-query:authorizer-provider';
78
export const CUSTOM_AUTHORIZER_KEY = 'nestjs-query:custom-authorizer';
89

910
export const KEY_SET_KEY = 'nestjs-query:key-set';

packages/query-graphql/src/providers/authorizer.provider.ts

+21-20
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,32 @@ import { Provider } from '@nestjs/common';
22
import { Class } from '@rezonate/nestjs-query-core';
33

44
import { createDefaultAuthorizer, getAuthorizerToken, getCustomAuthorizerToken } from '../auth';
5-
import { getAuthorizer, getCustomAuthorizer } from '../decorators';
5+
import { getAuthorizer, getCustomAuthorizer, setHasAuthorizerProvider } from '../decorators';
66

77
function createServiceProvider<DTO>(DTOClass: Class<DTO>): Provider {
8-
const token = getAuthorizerToken(DTOClass);
9-
const authorizer = getAuthorizer(DTOClass);
10-
if (!authorizer) {
11-
// create default authorizer in case any relations have an authorizers
12-
return { provide: token, useClass: createDefaultAuthorizer(DTOClass, { authorize: () => ({}) }) };
13-
}
14-
return { provide: token, useClass: authorizer };
8+
const token = getAuthorizerToken(DTOClass);
9+
const authorizer = getAuthorizer(DTOClass);
10+
setHasAuthorizerProvider(DTOClass);
11+
if (!authorizer) {
12+
// create default authorizer in case any relations have an authorizers
13+
return { provide: token, useClass: createDefaultAuthorizer(DTOClass, { authorize: () => ({}) }) };
14+
}
15+
return { provide: token, useClass: authorizer };
1516
}
1617

1718
function createCustomAuthorizerProvider<DTO>(DTOClass: Class<DTO>): Provider | undefined {
18-
const token = getCustomAuthorizerToken(DTOClass);
19-
const customAuthorizer = getCustomAuthorizer(DTOClass);
20-
if (customAuthorizer) {
21-
return { provide: token, useClass: customAuthorizer };
22-
}
23-
return undefined;
19+
const token = getCustomAuthorizerToken(DTOClass);
20+
const customAuthorizer = getCustomAuthorizer(DTOClass);
21+
if (customAuthorizer) {
22+
return { provide: token, useClass: customAuthorizer };
23+
}
24+
return undefined;
2425
}
2526

2627
export const createAuthorizerProviders = (DTOClasses: Class<unknown>[]): Provider[] =>
27-
DTOClasses.reduce<Provider[]>((providers, DTOClass) => {
28-
const p = createCustomAuthorizerProvider(DTOClass);
29-
if (p) providers.push(p);
30-
providers.push(createServiceProvider(DTOClass));
31-
return providers;
32-
}, []);
28+
DTOClasses.reduce<Provider[]>((providers, DTOClass) => {
29+
const p = createCustomAuthorizerProvider(DTOClass);
30+
if (p) providers.push(p);
31+
providers.push(createServiceProvider(DTOClass));
32+
return providers;
33+
}, []);

packages/query-graphql/src/resolvers/read.resolver.ts

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
import { CursorQueryArgsTypeOpts, QueryType, StaticQueryType } from '../types/query';
2222
import { DEFAULT_QUERY_OPTS } from '../types/query/query-args';
2323
import { BaseServiceResolver, ExtractPagingStrategy, ResolverClass, ResolverOpts, ServiceResolver } from './resolver.interface';
24+
import { FilterConstructor } from '../types/query/filter.type';
2425

2526
const QUERY_ARGS_TOKEN = Symbol('QUERY_ARGS_TOKEN');
2627

@@ -53,6 +54,8 @@ export interface ReadResolver<DTO, PS extends PagingStrategies, QS extends Query
5354

5455
export const getQueryArgs = <DTO>(DTOClass: Class<DTO>) => FilterType(DTOClass);
5556

57+
export type QueryArgsField<T extends FilterConstructor<any>> = InstanceType<T>;
58+
5659
const serializeNestedObjects = (obj: Record<string, any>): Record<string, any> => {
5760
const result: Record<string, any> = {};
5861
Object.entries(obj).forEach(([key, value]) => {

packages/query-typeorm/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@rezonate/nestjs-query-typeorm",
3-
"version": "6.0.9",
3+
"version": "6.0.10",
44
"description": "Typeorm adapter for @rezonate/nestjs-query-core",
55
"author": "doug-martin <doug@dougamartin.com>",
66
"homepage": "https://github.com/Rezonate-io/nestjs-query#readme",

0 commit comments

Comments
 (0)